容器化部署wordpress

通过dockerfile,supervisior和docker-compose容器化搭建wordpress博客
容器化部署wordpress
Photo by Hanson Lu / Unsplash

On this page

使用Dockerfile构建通过Supervisor管理进程的wordpress镜像

FROM centos:7.9.2009

#配置镜像的yum源,方便后面下载软件
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum install wget -y \
&& wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo \
&& yum makecache fast \

#配置PHP8.0以上版本的yum源
&& yum install yum-utils -y \
&& yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
&& yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm \
&& yum-config-manager --disable 'remi-php*' \
&& yum-config-manager --enable 'remi-php80' \
&& yum install php-cli php-common php-devel php-embedded php-gd php-mcrypt php-mbstring php-pdo php-xml php-fpm php-mysqlnd php-opcache php-pecl-memcached php-pecl-redis php-pecl-mongodb php-json php-pecl-apcu php-pecl-apcu-devel -y \

#创建PHP-FPM的运行目录(pid文件存放路径)
&& mkdir -p /run/php-fpm \

#配置php-fpm运行用户
&& sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf \
&& sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf \

#安装Nginx
&& yum install nginx -y \

#安装Supervisor容器多进程管理软件
&& yum install supervisor -y \

#安装unzip以便后续解压wordpress压缩包
&& yum install unzip -y \

#下载并解压缩wordpress
&& wget -O /latest-zh_CN.zip https://cn.wordpress.org/latest-zh_CN.zip \
&& unzip /latest-zh_CN.zip \
&& rm -rf /latest-zh_CN.zip \

#重设wordpress文件属主为nginx(与nginx,php-fpm的运行用户保持一致)_
&& chown -R nginx.nginx /wordpress \

#关闭Supervisor的后台运行
&& sed -i 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf \

#清除yum cache,减小镜像文件大小
&& yum clean all

#将Supervisor进程管理文件复制到指定目录下(supervisor.ini文件内容在后面)
COPY supervisor.ini /etc/supervisord.d/

#暴露端口
EXPOSE 80
EXPOSE 443

#设置工作目录,这样当我们想要操作容器时,一进来就是这个目录
WORKDIR /wordpress

#通过Supervisor去启动nginx和php-fpm
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]

使用Supervisor管理容器中的Nginx和php-fpm

Supervisor让容器能够在前台运行多个进程,并实时侦测进程状态,当进程意外终止时,Supervisor自动重新启动进程。

[program:nginx]
command=nginx -g 'daemon off;'
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/nginx.log

[program:php-fpm]
command=/usr/sbin/php-fpm
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/var/log/php-fpm/phpfpm.log

参数讲解:

  • command=nginx -g 'daemon off;' 启动进程的命令
  • autostart=true 当容器启动时自动执行进程
  • autorestart=true 发现进程终止后自动重启进程
  • startsecs=5 只有进程启动并成功运行指定时间后才认定为启动成功
  • redirect_stderr=true 重定向进程的stderr输出给supervisord
  • stdout_logfile_maxbytes=20MB 日志文件的最大比特值
  • stdout_logfile_backups=20 由于进程标准输出日志文件轮换而要保留的备份数量
  • stdout_logfile=/var/log/php-fpm/phpfpm.log 日志存放路径

    详情参见:http://supervisord.org/configuration.html#program-x-section-settings

使用docker-compose创建并管理多个容器

由于wordpress需要使用mysql作为后台数据库,因此我们还需要一个mysql镜像,使用docker-compose可以快速部署两个镜像,并完成部分基本配置

创建docker-compose.yml配置文件如下:

version: "3"
services:

   db:
     image: mysql:5.7.25
     command:
      - --default_authentication_plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: wcy199545..
       MYSQL_DATABASE: my_blog
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wcy199545..
     networks:
       mynet1:
         ipv4_address: 172.19.0.2

   wordpress:
     depends_on:
       - db
     image: chunyiwang/wordpress:v1
     ports:
       - "80:80"
       - "443:443"
     volumes:
       - nginxconf:/etc/nginx/
       - wordpressfiles:/wordpress/
     restart: always
     networks:
       mynet1:
         ipv4_address: 172.19.0.3

volumes:
  db_data:
  nginxconf:
  wordpressfiles:

networks:
   mynet1:
     ipam:
       config:
         - subnet: 172.19.0.0/24

启动容器

docker-compose -f docker-compose.yml up -d

修改nginx配置文件,配置proxy_pass将请求转发给9000端口的php-fpm,接下来并访问IP地址,就可以进入到wordpress安装界面了。