Docker制作镜像

Docker 容器操作的选项

选项 作用
–name 自定义容器名
-d 将容器放后台启动
-it (input TTY) 分配一个交互式的终端
-p 端口映射
-P 映射随机端口
-v 数据卷映射
-e env 指定环境变量
–restart=always 设置容器开机自启,docker启动就跟着自动启动
–link=mysql57 指定另一个容器的名字,就可以和指定的容器通信

运行mysql容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
1、拉取mysql5.7.44镜像
root@docker01 ~]# docker pull mysql:5.7.44

2、查看工作目录和端口
[root@docker01 ~]# docker inspect mysql:5.7.44
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}

"Volumes": {
"/var/lib/mysql": {}

#环境变量
#root密码
MYSQL_ROOT_PASSWORD

# 建库
MYSQL_DATABASE

## 创建用户
MYSQL_USER

## 创建普通用户的密码
MYSQL_PASSWORD

2、运行镜像
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

-v #映射配置文件


docker run \
-name some-mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-d mysql:tag \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci


docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-v /data/wp:/var/www/html \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wordpress \
-d wordpress
一般都是创建普通用户,做了端口映射宿主机也能连接

3、连接进去
[root@docker01 ~]# docker exec -it eedc00b /bin/bash
bash-4.2#
bash-4.2# mysql -uroot -p123

4、查看创建的库和用户
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+

mysql> select user,host from mysql.user;
+---------------+-----------+
| user | host |
+---------------+-----------+
| root | % |
| wp_user | % | #容器的ip是内外ip,不把端口映射到宿主机上就没事
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+-----------+

mysql> show grants for wp_user@'%';
+--------------------------------------------------------+
| Grants for wp_user@% |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wp_user'@'%' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wp_user'@'%' |
+--------------------------------------------------------+

4、映射的目录里面有数据
[root@docker01 ~]# ll /data/mysql/

1、手动制作WordPress镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
1、下载wordpress代码包
[root@docker01 ~]# wget https://cn.wordpress.org/wordpress-5.9.10-zh_CN.tar.gz

2、运行一个基础容器
[root@docker01 ~]# docker run --name wp_base -it centos:7 /bin/bash

3、换源
[root@3dcd1060f3ab /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
[root@3dcd1060f3ab /]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@3dcd1060f3ab /]#sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo

4、换php源
[root@3dcd1060f3ab /]# cat > /etc/yum.repos.d/php.repo <<EOF
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
EOF


echo -e "[php-webtatic]\nname = PHP Repository\nbaseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/\ngpgcheck = 0"> /etc/yum.repos.d/php.repo

5、安装php、mysql、nginx
[root@nginx ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb mariadb-server nginx

6、创建nginx启动用户
[root@3dcd1060f3ab code]# groupadd -g 666 www
[root@3dcd1060f3ab code]# useradd -u 666 -g 666 -s /sbin/nologin -M www

7、优化nginx php 统一用户
主配置文件 (如果是nginxX官方源下载的nginx,就不用优化)
[root@3dcd1060f3ab /]# vi /etc/nginx/nginx.conf
user www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/mime.types;
default_type application/octet-stream;

include /etc/nginx/conf.d/*.conf;
}

[root@3dcd1060f3ab ~]# sed -i 's#user = apache#user = www#g' /etc/php-fpm.d/www.conf
[root@3dcd1060f3ab ~]# sed -i 's#group = apache#group = www#g' /etc/php-fpm.d/www.conf

8、编写网站主配置文件
[root@3dcd1060f3ab /]# vi /etc/nginx/conf.d/wp.conf
server {
listen 80;
server_name _;
root /code/wordpress;
index index.php index.html;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

9、创建站点目录,宿主机新开窗口上传代码到站点目录,并解压,授权
[root@3dcd1060f3ab /]# mkdir /code
[root@docker01 ~]# docker cp wordpress-5.9.10.tar.gz wp_base:/code

[root@3dcd1060f3ab /]# cd /code
[root@3dcd1060f3ab code]# tar xf wordpress-5.9.10.tar.gz
[root@3dcd1060f3ab code]# chown -R www.www /code/

10、启动数据库
虽然是不能systemd启动,但是mariadb的启动脚本还是在的
[root@3dcd1060f3ab code]# cat /usr/lib/systemd/system/mariadb.service
35行:启动之前要做初始化,找到初始化命令
ExecStartPre=/usr/libexec/mariadb-prepare-db-dir %n
38行:启动命令
ExecStart=/usr/bin/mysqld_safe --basedir=/usr (可以卡主)

[root@3dcd1060f3ab code]# /usr/libexec/mariadb-prepare-db-dir %n
[root@3dcd1060f3ab code]# /usr/bin/mysqld_safe --basedir=/usr &

11、进去数据库创建库 用户
[root@3dcd1060f3ab code]# mysql
MariaDB [(none)]> create database wordpress;
MariaDB [(none)]> grant all on *.* to wp_user@'localhost' identified by '123';

12、测试用户是否可以连接
[root@3dcd1060f3ab code]# mysql -uwp_user -p123 -h127.0.0.1

13、启动nginx
[root@3dcd1060f3ab code]# nginx

14、启动php
找到启动脚本里面的启动命令
[root@3dcd1060f3ab code]# vi /usr/lib/systemd/system/php-fpm.service
9行
ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf

--nodaemonize:可以卡住,不加就放后台
[root@3dcd1060f3ab code]# /usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf

15、curl一下,能够正常访问
[root@3dcd1060f3ab code]# curl -L 127.0.0.1
....
<p>Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.</p>
<ol>
<li>Database name</li> #填写数据库信息的页面
<li>Database username</li>
<li>Database password</li>
<li>Database host</li>
.....

16、将3个服务写脚本启动,就不用一个一个启动了
[root@3dcd1060f3ab code]# cd ~
[root@3dcd1060f3ab ~]# vi start.sh
#!/bin/bash
/sbin/nginx
/usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf
#脚本里面需要卡主一个就可以,把mysql卡住
/usr/bin/mysqld_safe --basedir=/usr


17、输入此时可以打包了,但是打包出来的镜像很大,需要优化一下
[root@3dcd1060f3ab ~]# rm -rf /code/wordpress-5.9.10.tar.gz
[root@3dcd1060f3ab ~]# yum clean all
删除所有yum源,以后用不到的,这个就是wordpress
[root@3dcd1060f3ab ~]# rm -rf /etc/yum.repos.d/*
如果有下载wget下载东西,都要卸载掉,以后用不到的

18、打开新窗口,将容器打包
[root@docker01 ~]# docker commit wp_base wordpress:v1
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress v1 26586db1eda4 9 seconds ago 615MB

19、运行这个容器,测试是否能够在网页里面访问
[root@docker01 ~]# docker run -p 80:80 -d wordpress:v1 /bin/sh ~/start.sh
脚本在容器里面的绝对路径

[root@docker01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
720febe29da7 wordpress:v1 "/bin/sh /root/start…" 2 seconds ago Up 1 second 0.0.0.0:80->80/tcp, :::80->80/tcp hopeful_wing

20、浏览器访问10.0.0.101

image-20240904155106974

image-20240905192409386

image-20240904160154137

image-20240904160307363

image-20240904160327203

image-20240904160430589

image-20240904162155815

2、使用官方的wordpress容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1、拉取wordpress容器
[root@docker02 ~]# docker pull wordpress

2、拉取数据库
[root@docker02 ~]# docker pull mysql:5.7.44

3、#官方wp容器的启动方法
[root@docker02 ~]# docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-v /data/wp:/var/www/html \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wordpress \
-d wordpress

#官方mysql容器的启动方法
[root@docker02 ~]# docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

4、浏览器访问10.0.0.102

image-20240904164056259

可以看到没有填写数据库信息的阶段,因为在启动数据库之前已经使用参数传递进去了,而且不会出现错误,不会出现破图,这个才是生产中需要的效果,需要变量传递参数

image-20240904164144932

3、构建可以传递参数的镜像 (模拟官方打wordpress镜像)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#先了解读取系统环境变量的命令:envsubst
[root@docker02 ~]# export wp_db_name=wp
[root@docker02 ~]# export wp_db_user=wp_user
[root@docker02 ~]# echo $wp_db_name
wp
[root@docker02 ~]# echo $wp_db_user
wp_user
[root@docker02 ~]# vim 1.txt
define( 'DB_NAME', '$wp_db_name' );
define( 'DB_USER', '$wp_db_user' );

拿环境变量去渲染这个文件,1.txt会变成空文件
envsubst读取1.txt里面的变量,匹配环境变量里面有没有,有的话,输出渲染到2.txt
[root@docker02 ~]# envsubst < 1.txt > 2.txt
[root@docker02 ~]# cat 2.txt
define( 'DB_NAME', 'wp' );
define( 'DB_USER', 'wp_user' );

指定只渲染一个变量,没被渲染的变量就是默认的
[root@docker02 ~]# cat 1.txt
define( 'DB_NAME', '$wp_db_name' );
define( 'DB_USER', '$wp_db_user' );
define( 'DB_PASS', '$wp_db_pass' );
[root@docker02 ~]# envsubst '$wp_db_name' < 1.txt >2.txt
[root@docker02 ~]# cat 2.txt
define( 'DB_NAME', 'wp' );
define( 'DB_USER', '$wp_db_user' );
define( 'DB_PASS', '$wp_db_pass' );

容器里面没有这个命令,先查询一个属于哪个包,在容器里面安装服务的时候一起安装
[root@docker02 ~]# yum provides envsbet
gettext-0.19.8.1-3.el7.x86_64 : GNU libraries and utilities for producing multi-lingual messages

在docker02 10.0.0.102 构建 需要把之前允许的容器关闭,需要打nginx、php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
1、下载wordpress代码包
[root@docker01 ~]# wget https://cn.wordpress.org/wordpress-5.9.10-zh_CN.tar.gz

1、运行一个基础容器
[root@docker01 ~]# docker run --name wp_base -it centos:7 /bin/bash

2、换源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo

3、换php源
[root@3dcd1060f3ab /]# cat > /etc/yum.repos.d/php.repo <<EOF
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
EOF


echo -e "[php-webtatic]\nname = PHP Repository\nbaseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/\ngpgcheck = 0"> /etc/yum.repos.d/php.repo

4、安装php、nginx、envsubst命令
[root@nginx ~]# yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx gettext

5、创建nginx启动用户
groupadd -g 666 www
useradd -u 666 -g 666 -s /sbin/nologin -M www

6、优化nginx php 统一用户
主配置文件 (如果是nginxX官方源下载的nginx,就不用优化)
[root@3dcd1060f3ab /]# vi /etc/nginx/nginx.conf
user www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/mime.types;
default_type application/octet-stream;

include /etc/nginx/conf.d/*.conf;
}

[root@3dcd1060f3ab ~]# sed -i 's#user = apache#user = www#g' /etc/php-fpm.d/www.conf
sed -i 's#group = apache#group = www#g' /etc/php-fpm.d/www.conf

7、编写网站主配置文件
[root@3dcd1060f3ab /]# vi /etc/nginx/conf.d/wp.conf
server {
listen 80;
server_name _;
root /code/wordpress;
index index.php index.html;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

8、创建站点目录,宿主机新开窗口上传代码到站点目录,并解压,授权
[root@3dcd1060f3ab /]# mkdir /code
[root@docker01 ~]# docker cp wordpress-5.9.10.tar.gz wp_base:/code
[root@3dcd1060f3ab code]# cd /code
[root@3dcd1060f3ab code]# tar xf wordpress-5.9.10.tar.gz
[root@3dcd1060f3ab code]# chown -R www.www /code/
chown -R www.www /var/lib/nginx/

9、启动nginx
[root@3dcd1060f3ab code]# nginx

10、启动php
找到启动脚本里面的启动命令
[root@3dcd1060f3ab code]# vi /usr/lib/systemd/system/php-fpm.service
9行
ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf

--nodaemonize:可以卡住,不加就放后台
[root@3dcd1060f3ab code]# /usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf

11、curl一下,能够正常访问
[root@3dcd1060f3ab code]# curl -L 127.0.0.1
.... #可以看到选中语言的界面
<option value="zh_HK" lang="zh" data-continue="繼續">香港中文</option>
<option value="zh_CN" lang="zh" data-continue="继续">简体中文</option>
<option value="zh_TW" lang="zh" data-continue="繼續">繁體中文</option>
.....

12、传参,不要数据的页面,需要使用读取系统环境变量的命令envsubst
将配置文件改成模版文件
[root@1925f5794372 code]# vi /code/wordpress/wp-config-sample.php
......
#把这几行改成变量
23 define( 'DB_NAME', '$WORDPRESS_DB_NAME' );
24
25 /** Database username */
26 define( 'DB_USER', '$WORDPRESS_DB_USER' );
27
28 /** Database password */
29 define( 'DB_PASSWORD', '$WORDPRESS_DB_PASSWORD' );
30
31 /** Database hostname */
32 define( 'DB_HOST', '$WORDPRESS_DB_HOST' );


sed -i 's#database_name_here#$WORDPRESS_DB_NAME#g' /code/wordpress/wp-config-sample.php
sed -i 's#username_here#$WORDPRESS_DB_USER#g' /code/wordpress/wp-config-sample.php
sed -i 's#password_here#$WORDPRESS_DB_PASSWORD#g' /code/wordpress/wp-config-sample.php
sed -i 's#localhost#$WORDPRESS_DB_HOST#g' /code/wordpress/wp-config-sample.php

13、将2个服务写脚本启动,就不用一个一个启动了
[root@3dcd1060f3ab ~]# vi /start.sh
#!/bin/bash
#渲染变量到wp-config.php
envsubst '$WORDPRESS_DB_NAME $WORDPRESS_DB_USER $WORDPRESS_DB_PASSWORD $WORDPRESS_DB_HOST' < /code/wordpress/wp-config-sample.php > /code/wordpress/wp-config.php
chown -R www.www /code/
/usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf
#脚本里面必须有一个卡在,哪个卡在都可以
/sbin/nginx -g 'daemon off;'


14、输入此时可以打包了,但是打包出来的镜像很大,需要优化一下
[root@3dcd1060f3ab ~]# rm -rf /code/wordpress-5.9.10.tar.gz
[root@3dcd1060f3ab ~]# yum clean all
删除所有yum源,以后用不到的,这个就是wordpress
[root@3dcd1060f3ab ~]# rm -rf /etc/yum.repos.d/*
如果有下载wget下载东西,都要卸载掉,以后用不到的

15、打开新窗口,将容器打包
[root@docker01 ~]# docker commit wp_base wordpress:v1
[root@docker02 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress v1 23e066cac691 2 seconds ago 586MB

16、删除数据库数据目录,不然第二次启动不能建库,因为第一次的数据已经持久化了
[root@docker02 ~]# rm -rf /data

17、运行带变量的容器
#运行数据库
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wp_db \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

#运行wordpress容器
docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wp_db \
-d wordpress:v3 /bin/sh /start.sh


#查看正在运行的镜像
[root@docker02 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
71439bdb8066 wordpress:v5 "/bin/sh /start.sh" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp wp
c6eefe3b5358 mysql:5.7.44 "docker-entrypoint.s…" 49 minutes ago Up 49 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql57
4f798d07ace2 centos:7 "/bin/bash" About an hour ago Up About an hour wp_base


18、浏览器访问
10.0.0.102

image-20240904193619359

通过填写数据库信息的页面,直接来的主从页面

image-20240904194031698

报错问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#1、docker正常启动,容器里面的服务都正常启动,端口映射也没问题,访问网页找不到页面
是因为外面的请求不能到底容器

#解决办法:
vi /etc/sysctl.conf
net.ipv4.ip_forward=1

systemctl restart network

#2、wp破图
1、查看错误日志
[root@1a60046efc86 wordpress]# tailf /var/log/nginx/error.log
2024/09/05 12:45:49 [crit] 16#16: *432 open() "/var/lib/nginx/tmp/fastcgi/8/01/0000000018" failed (13: Permission denied) while reading upstream, client: 10.0.0.1, server: _, request: "GET /wp-admin/site-editor.php?postType=wp_template&postId=twentytwentytwo%2F%2Fhome HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "10.0.0.102", referrer: "http://10.0.0.102/"


Nginx 修改了默认配置,不是以 nginx 或 root 用户来运行 Nginx(主要的原因)
这个目录没有权限去访问:/var/lib/nginx/tmp 目录主要是用来存放临时的缓存文件,因为使用的是 Nginx 的反向代理,当我们上传文件的时候会先把文件写入 Nginx 的 /var/lib/nginx/tmp/client_body 目录,然后再通过代理转发到目标系统。

2、查看 /var/lib/nginx/tmp 的权限,会发现这个目录默认的所有者是 nginx:
[root@1a60046efc86 wordpress]# ll /var/lib
.....
drwxr-xr-x 2 root root 6 Apr 11 2018 misc
drwxrwx--- 3 nginx root 17 Sep 5 11:52 nginx #权限不对


3、修改权限
[root@1a60046efc86 wordpress]# chown -R www.www /var/lib/nginx/
[root@1a60046efc86 wordpress]# ll /var/lib
......
drwxrwx--- 1 www www 17 Sep 5 11:52 nginx

4、再次访问,刷新慢一点,加重一下,就不会破图了

4、Docker自动化构建镜像

手动构建镜像的缺陷
1.体积太大
2.启动不方便
3.无法直接修改CMD
4.没有声明端口
5、没有声明可映射目录

5、Dockerfile的介绍

1
2
3
4
5
Dockerile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。声明式的脚本,将镜像构建内容,写入脚本中即可。

镜像:中药
dockerfile:配方
dockerfile:常用指令

dockerfile的指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM:指定一个基础镜像
RUN: 指定系统命令
CMD: 指定运行容器PID为1的进程命令
ENTRYPOINT:指定运行容器PID为1的进程命令 /bin/sh /start.sh

ADD: 将宿主机上面的文件docker cp到容器中(会自动解压,一般传压缩包,里面不会传压缩包,之后传解压后的包)
COPY:将宿主机上面的文件docker cp到容器中(不会自动压,一般传配置文件)
WORKDIR:指定一个工作目录,docker exec连接进去时,自动进入该目录下
EXPOSE:声明镜像要暴露的端口
VOLUME: 声明可映射的数据卷
ENV:声明默认环境变量(ssh的密码,数据库的密码)镜像的属性标签

LABEL:打标签
MAINTAINER:声明管理者标识

6、自动化构建wordpress

1、准备需要的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1、运行带有配置文件的容器,进入容器,将需要的配置文件拉出去
[root@docker01 ~]# docker exec -it 40b99669a1 /bin/bash

2、创建所需文件存放的目录
[root@docker01 ~]# mkdir -p /code/wordpress/

3、拉取容器里面的配置文件
[root@docker01 ~]# docker cp 40b99669a160:/etc/nginx/nginx.conf /code/wordpress/
[root@docker01 ~]# docker cp 40b99669a160:/etc/nginx/conf.d/wp.conf /code/wordpress/
[root@docker01 ~]# docker cp 40b99669a160:/etc/php-fpm.d/www.conf /code/wordpress/
[root@docker01 ~]# docker cp 40b99669a160:/code/wordpress/wp-config-sample.php /code/wordpress/

4、准备这些文件,检查配置文件都安装所需要求更改ok
[root@docker01 ~]# ll /code/wordpress/
-rw-r--r-- 1 root root 724 Sep 5 23:31 nginx.conf
-rw-r--r-- 1 root root 278 Sep 5 20:12 start.sh
-rw-rw-rw- 1 root root 18M Sep 5 23:24 wordpress-5.9.10.tar.gz
-rw-r--r-- 1 root root 324 Sep 5 19:53 wp.conf
-rw-r--r-- 1 root root 3.0K Sep 5 21:39 wp-config-sample.php
-rw-r--r-- 1 root root 18K Sep 5 23:32 www.conf

2、编写Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1、编写DockerFile
[root@docker01 ~]# cd /code/wordpress/
[root@docker01 wordpress]# vim Dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo
RUN echo -e "[php-webtatic]\nname = PHP Repository\nbaseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/\ngpgcheck = 0"> /etc/yum.repos.d/php.repo
RUN yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx gettext
RUN groupadd -g 666 www
RUN useradd -u 666 -g 666 -s /sbin/nologin -M www
RUN mkdir /code
COPY nginx.conf /etc/nginx/nginx.conf
COPY www.conf /etc/php-fpm.d/www.conf
COPY wp.conf /etc/nginx/conf.d/wp.conf
ADD wordpress-5.9.10.tar.gz /code
COPY wp-config-sample.php /code/wordpress/wp-config-sample.php
RUN chown -R www.www /code
RUN chown -R www.www /var/lib/nginx
COPY start.sh /start.sh
RUN rm -rf /code/wordpress-5.9.10.tar.gz
RUN yum clean all
RUN rm -rf /etc/yum.repos.d/*
CMD ["/bin/sh","/start.sh"]
EXPOSE 80/tcp 8080/tcp
WORKDIR /code/wordpress
VOLUME /code/wordpress
ENV WORDPRESS_DB_NAME=wp_db
ENV WORDPRESS_DB_USER=wp_user
ENV WORDPRESS_DB_PASSWORD=123
ENV WORDPRESS_DB_HOST=localhost


2、#构建
[root@docker01 wordpress]# docker build -t wordpress-df:v1 .
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress-df v1 e389c28d9b3b 14 hours ago 831MB

3、删除数据库数据目录,不然第二次启动不能建库,因为第一次的数据已经持久化了
[root@docker02 ~]# rm -rf /data

4、运行带变量的容器
#运行数据库
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wp_db \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

#运行wordpress容器
docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wp_db \
-d wordpress-df:v1




5、浏览器访问
10.0.0.101

image-20240906135218039

3、优化Dockerfile的原则

1
2
3
4
5
6
7
8
# 优化原则:构建的镜像尽可能小,构建速度尽可能快
a: 使用体积小的linux镜像alpine作为基础镜像
b:尽可能的清理无用的缓存文件(尽可能把多个RUN合并)
c:修改dockerfile的时候,尽可能把修改的内容放在最后
d:使用.dockerignore忽略构建docker镜像时,不需要的文件
f:使用\减少不必要的文件RUN或ADD

层数多不代表体积大,层数多和镜像里面的服务,命令,安装包有关,层数多是命令多,不会让文件数量,文件大小增加

4、优化Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
1、优化DockerFile
[root@docker01 ~]# cd /code/wordpress/
[root@docker01 wordpress]# vim Dockerfile
FROM centos:7
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo && \
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo && \
sed -i "s@http://mirrors.aliyun.com@https://mirrors.huaweicloud.com@g" /etc/yum.repos.d/epel.repo && \
echo -e "[php-webtatic]\nname = PHP Repository\nbaseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/\ngpgcheck = 0"> /etc/yum.repos.d/php.repo && \
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb nginx gettext && \
groupadd -g 666 www && \
useradd -u 666 -g 666 -s /sbin/nologin -M www && \
mkdir /code && \
yum clean all && \
rm -rf /etc/yum.repos.d/*
COPY nginx.conf /etc/nginx/nginx.conf
COPY www.conf /etc/php-fpm.d/www.conf
COPY wp.conf /etc/nginx/conf.d/wp.conf
ADD wordpress-5.9.10.tar.gz /code
COPY wp-config-sample.php /code/wordpress/wp-config-sample.php
RUN chown -R www.www /code && \
chown -R www.www /var/lib/nginx
COPY start.sh /start.sh
CMD ["/bin/sh","/start.sh"]
EXPOSE 80/tcp 8080/tcp
WORKDIR /code/wordpress
VOLUME /code/wordpress
ENV WORDPRESS_DB_NAME=wp_db
ENV WORDPRESS_DB_USER=wp_user
ENV WORDPRESS_DB_PASSWORD=123
ENV WORDPRESS_DB_HOST=localhost


2、#构建
[root@docker01 wordpress]# docker build -t wordpress-df:v1 .
[root@docker01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress-df v2 1a14add5916b 11 seconds ago 530MB

3、删除数据库数据目录,不然第二次启动不能建库,因为第一次的数据已经持久化了
[root@docker02 ~]# rm -rf /data

4、运行带变量的容器
#运行数据库
docker run \
--name mysql57 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=wp_db \
-e MYSQL_USER=wp_user \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:5.7.44

#运行wordpress容器
docker run \
--name wp \
--link mysql57 \
-p 80:80 \
-e WORDPRESS_DB_HOST=mysql57 \
-e WORDPRESS_DB_USER=wp_user \
-e WORDPRESS_DB_PASSWORD=123 \
-e WORDPRESS_DB_NAME=wp_db \
-d wordpress-df:v2



5、浏览器访问
10.0.0.101

7、制作zabbix镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
1、拉取相关镜像
[root@docker01 ~]# docker pull zabbix/zabbix-server-mysql
[root@docker01 ~]# docker pull zabbix/zabbix-web-nginx-mysql
[root@docker01 ~]# docker pull mysql:8.0

2、#运行数据库
注意:再次启动数据库之前先清空data目录
rm -rf /data/mysql


docker run \
--name mysql80 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-e MYSQL_DATABASE=zabbix \
-e MYSQL_USER=zabbix \
-e MYSQL_PASSWORD=123 \
--restart=always \
-d mysql:8.0 \


--character-set-server=utf8mb4
--collation-server=utf8mb4_bin
--log_bin_trust_function_creators


3、yunx容器化zabbix-server
docker run \
--link mysql80 \
--name zabbix-server \
-p 10051:10051 \
-e DB_SERVER_HOST="mysql80" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-d zabbix/zabbix-server-mysql


4、容器化zabbix-web
docker run \
--link zabbix-server \
--link mysql80 \
--name zabbix-web \
-p 80:8080 \
-p 8443:8443 \
-e DB_SERVER_HOST="mysql80" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123" \
-e ZBX_SERVER_HOST="zabbix-server" \
-e PHP_TZ="Asia/Shanghai" \
-d zabbix/zabbix-web-nginx-mysql

5、检查3个容器是否起来
[root@docker01 ~]# docker ps

image-20240905101309249

image-20240905100315171

1
2
出现以上报错就是mysql8.0启动命令加参数
--log_bin_trust_funetion

image-20240905143325160