部署环境:
系统环境:CentOS 7.3
内核版本:3.10.0-514.26.2.el7.x86_64
Docker服务端版本:1.13.1
基础镜像:centos/latest
整体架构:
1、Dockerfile编写
dockerfile在我的认知范围内是指通过许多指令构建起来的一个文本,通过这个文本可以在基础镜像上再构建一个符合自身需求的镜像。
1.1 Dockerfile指令
首先,通过我们对nginx的dockerfile来讲解各个指令的用法。
FROM centos:latest MAINTAINER Bruce for WordPress RUN groupadd -g 1001 nginx && useradd -u 900 nginx -g nginx -s /sbin/nologin COPY epel.repo /etc/yum.repos.d/epel.repo RUN yum install -y nginx && yum clean all EXPOSE 80 CMD ["nginx","-g","daemon off;"]
- FROM:用于提供构建所需镜像的基础镜像
- MAINTAILER:用于让作者提供本人信息的指令
-
RUN:指定docker build过程中要创建的命令,而不是容器运行时指定的指令
用法: RUN yum install -y httpd RUN ["yum","install","-y","httpd"]
-
COPY:用于从docker主机复制文件至正在创建的镜像文件中,复制的文件必须在镜像build上下文中的路径
用法: COPY index.html /var/www/html/ COPY *.conf /etc/
- ADD:和COPY用法类似,并且可以将打包压缩好的文件,解压至目标路径
-
CMD:和RUN命令类似,为启动容器指定默认的程序,程序运行结束,容器结束(可被docker run命令参数指定要运行的程序覆盖)
用法: CMD <command> CMD ["<executeable>","<param1>","<param2>",...] CMD ["<param1>","<param2>",...] 为ENTRYPOINT指令指定的程序提供参数
-
ENPOSE:指定容器要暴露的端口
用法: EXPOSE <port>[/protocol>] <port>[/protocol>]
-
ENTRYPOINT:类似于CMD指令,不会被docker run所指定的命令行参数所覆盖,而这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序(和CMD类似)
用法: CMD <command> CMD ["<executeable>","<param1>","<param2>",...]
-
ENV:定义环境变量,此变量可被当前dockerfie文件中的其它指令所调用
用法: ENV <key> <value> 一次定义一个变量 ENV <key>=<value> ... 一次可定义多个变量,如果value中有空白字符,要使用\字符进行转义
-
USER:指定运行程序时的用户名和UID
用法: USER UID | Username
-
WORKDIR:用于为Dockerfile中所有的RUN/CMD/ENTRYPOINT/ADD指令指定工作目录
用法:WORKDIR <dirpath>
-
VOLUME:用木目标镜像文件中创建一个挂载点,用于挂载主机上的卷或其它容器的卷
用法: VOLUME <mountpoint> VOLUME ["mountpoint",...]
-
ONBUILD:定义触发器,当前dockrfile构建出的镜像被用作基础镜像去构建其它镜像时,ONBUILD指令指定的操作才会被执行
用法: ONBUILD <INSTRUCTION> ONBUILD ADD my.cnf /etc/mysql/my.cnf
1.2 Mysql(Dockerfile)
通过dockerfile安装部署mysql数据库,在我编写的时候遇到两个问题:
1.mysql运行在前台;
2.执行sql语句赋予账号权限和创建数据库;
通过查找一些网上资料,发现可以通过mysqld_safa将mysql运行在前台,并且将需要执行的sql语句写在sql文件中,再导入正在运行的mysql就可以了。
FROM centos:latest MAINTAINER BruceJin for mysql RUN yum install -y mariadb mariadb-server mariadb-client mariadb-devel \ WORKDIR /root ADD setup.sql /root/setup.sql ADD setup.sh /root/setup.sh ADD startup.sh /root/start.sh RUN chmod +x /root/*.sh \ && /root/setup.sh EXPOSE 3306 CMD /root/start.sh
setup.sh如下:
#!/bin/sh chown -R mysql:mysql /var/lib/mysql mysql_install_db --user=mysql > /dev/null mysqld_safe --user=mysql & sleep 3 mysql < /root/setup.sql sleep 3 ps -wef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9
setup.sql如下:
create database wordpress DEFAULT CHARACTER SET utf8; USE mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; UPDATE user SET password=PASSWORD("123456") WHERE user='root'; FLUSH PRIVILEGES;
1.3 php-fpm (Dockerfile)
php-fpm程序连接数据库,需要下载安装php连接mysql模块,并且需要修改默认监听和WordPress连接数据库的信息,默认是监听在127.0.0.1:9000端口上的,需要将事先配置好的文件放在本地,然后再通过COPY指令复制进去。
FROM centos:latest MAINTAINER Bruce for WordPress RUN groupadd -g 1001 nginx && useradd -u 900 nginx -g nginx -s /sbin/nologin \ && yum install -y php-fpm php-mysql && yum clean all CMD ["php-fpm","-F"]
2、创建镜像
当Dockerfile文件创建好后,需要使用docker的子命令build来创建镜像。
[root@Bruce docker]#docker build -f /root/docker/nginx.dockerfile /root/docker/ -t centos:nginx [root@Bruce docker]#docker build -f /root/docker/php.dockerfile /root/docker/ -t centos:php [root@Bruce docker]#docker build -f /root/docker/mysql.dockerfile /root/docker/ -t centos:mysql docker build有非常多的参数,-f 前面指明dockerfile所在位置,可以使用绝对路径, 后面指明build的工作目录,-t 表示给创建的镜像起的name和tag。 docker build还有非常多的参数,具体的可以参考 docker help build命令
3、启动镜像
当镜像创建好后,我们需要启动镜像,使用docker run加各种参数来启动镜像。
[root@Bruce docker]#docker run -d --name Nginx -v /root/docker/nginx/wordpress/:/usr/share/nginx/html/ -v /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf -p 80:80 centos:nginx [root@Bruce docker]#docker run -d --name php-fpm -v /root/docker/nginx/wordpress/:/usr/share/nginx/html/ -v /root/docker/php/www.conf:/etc/php-fpm.d/www.conf --net container:Nginx centos:php [root@Bruce docker]#docker run -d --name mysql -v /var/lib/mysql/ -v /root/docker/mysql/my.cnf:/etc/my.cnf -p 3306:3306 centos:mysql docker run有非常多的参数,-d表示将容器运行在后台,并打印出容器的ID, -it 组合可以使容器运行在前台, --name 可以给容器起个别名,可以通过别名来对容器做启动、停止、重启等操作, -p 表示将容器内程序的端口和容器外的端口做一个映射。 -v 表示将主机上的目录或者文件挂载到容器内,实现数据的持久化。 --net 表示指定容器的网络模型,默认的网络模型为Bridged,这里选择的是Joined模型,php与nginx共享一个网络,其余两种为Closed和Open。 docker run命令还有非常多的参数,具体可以参考 docker help run 命令。
4、测试
安装完成后,尝试打开首页:
OK,这次部署终于成功。
5、总结
遇到的问题:
- 404报错,由于nginx和php上的web根目录理解错误导致
- 403报错,由于nginx上配置的目录出错,只配置了一级目录,wordpress至少有二级目录
原文链接:https://blog.csdn.net/weixin_34187822/article/details/89697626?ops_request_misc=&request_id=3839df914a9847ffba559df20a3cb902&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-30-89697626-null-null.268%5Ev1%5Econtrol&utm_term=docker%E3%80%81wordpress%E3%80%81wordpress%E5%BB%BA%E7%AB%99%E3%80%81wordpress%E4%B8%BB%E9%A2%98%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81