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" : {} 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 | % | | 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.repo5、安装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 /sbin/nginx /usr/sbin/php-fpm --fpm-config /etc/php-fpm.conf /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
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 [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
可以看到没有填写数据库信息的阶段,因为在启动数据库之前已经使用参数传递进去了,而且不会出现错误,不会出现破图,这个才是生产中需要的效果,需要变量传递参数
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 [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.repo4、安装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 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 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
通过填写数据库信息的页面,直接来的主从页面
报错问题
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 是因为外面的请求不能到底容器 vi /etc/sysctl.conf net.ipv4.ip_forward=1 systemctl restart network 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 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
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/nginxCOPY 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 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/mysqldocker 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
1 2 出现以上报错就是mysql8.0启动命令加参数 --log_bin_trust_funetion