0

0

如何用Docker搭建Nginx+PHP+MySQL环境并部署WordPress

PHPz

PHPz

发布时间:2023-05-21 09:19:11

|

2063人浏览过

|

来源于亿速云

转载

准备工作

 使用阿里云kelude

到  创建一个项目,如dockerfile。之后我们把wordpress环境的所有相关dockerfile及配置文件放置到centosbz目录。

使用阿里云镜像仓库

阿里云docker镜像仓库地址为  ,用来存放docker镜像,可以在本地push镜像上去,也可以从kelude拉取dockerfile自动构建镜像。我们先登录,然后新建一个namespace,如centos-bz,之后所有的nginx,php,mysql镜像将存放在这个namespace下。

安装docker-compose

需要在运行docker容器的主机上安装docker-compose,可以参照官方文档手动安装,也可以使用ezhttp的一键安装工具(推荐)安装。如:

wget centos.bz/ezhttp.zip
 unzip ezhttp.zip
 cd ezhttp-master
 ./start.sh

之后会弹出一个菜单,输入2选择some useful tools,然后输入18选择安装docker和compose。

编写dockerfile

clone以上在阿里云kelude创建的dockerfile镜像到本地,在此项目中创建centos.bz,然后在centos.bz目录分别创建mysql,nginx,php目录,用于存放它们各自dockerfile及配置文件。

这里我们还约定以下目录:

/home/docker/nginx/logs/centos.bz:存放www.centos.bz网站的日志

/home/docker/nginx/www/centos.bz: 存放www.centos.bz网站的文件

/home/docker/php: 存放php-fpm的日志

/home/docker/mysql:mysql data目录

nginx dockerfile

在nginx目录创建dockerfile文件,写入如下内容:

# 从debian:jessie镜像基础上安装nginx
from debian:jessie
 
# 声明此dockerfile维护者的邮箱,有什么问题可以发到此邮件寻问
label maintainer "admin@centos.bz"
 
# 定义软件版本及编译工具变量
env nginx_version 1.10.3
env openssl_version 1.0.2h
env zlib_version 1.2.11
env pcre_version 8.40
env concat_version 1.2.2
env build_tools wget gcc make g++
env src_dir /opt/nginx
 
# 切换到工作目录
workdir ${src_dir}
 
# 开始编译nginx,我们这里使用编译安装nginx而不是使用官方提供的nginx镜像是因为这里使用到了第三方的concat模块,只能编译了。
# 把所有的安装命令都写在一个run指令中是因为这样可以减小镜像层数,缩减镜像大小。推荐使用反斜杠和&&把所有的安装命令放置到一行中。
run apt-get update \
 && apt-get -y --no-install-recommends install ca-certificates ${build_tools} \
 && wget http://nginx.org/download/nginx-${nginx_version}.tar.gz \
 && wget https://www.openssl.org/source/openssl-${openssl_version}.tar.gz \
 && wget http://www.zlib.net/zlib-${zlib_version}.tar.gz \
 && wget https://ftp.pcre.org/pub/pcre/pcre-${pcre_version}.tar.gz \
 && wget https://github.com/alibaba/nginx-http-concat/archive/${concat_version}.tar.gz -o nginx-http-concat-${concat_version}.tar.gz \
 && tar xf nginx-${nginx_version}.tar.gz \
 && tar xf openssl-${openssl_version}.tar.gz \
 && tar xf zlib-${zlib_version}.tar.gz \
 && tar xf pcre-${pcre_version}.tar.gz \
 && tar xf nginx-http-concat-${concat_version}.tar.gz \
 && cd nginx-${nginx_version} \
 && ./configure --prefix=/usr/local/nginx --with-pcre=../pcre-${pcre_version} \
    --with-zlib=../zlib-${zlib_version} \
    --with-http_ssl_module \
    --with-openssl=../openssl-${openssl_version} \
    --add-module=../nginx-http-concat-${concat_version} \
 && make -j$(nproc) \
 && make install \
 && rm -rf ${src_dir} \
 && apt-get purge -y --auto-remove ${build_tools} \
 && rm -rf /var/lib/apt/lists/*
 
# 把构建上下文目录conf,即dockerfile/centos.bz/nginx/conf目录下的文件复制到容器的/usr/local/nginx/conf目录。
copy conf/ /usr/local/nginx/conf/
 
# 定义启动容器时运行的命令
entrypoint ["/usr/local/nginx/sbin/nginx"]
 
expose 80 443

对于conf目录下的nginx配置文件,需要把日志,网站目录更改为以下约定的目录位置。

php-fpm dockerfile

创建dockerfile/centos.bz/php-fpm目录,在此目录下创建dockerfile文件,内容如下:

from debian:jessie
label maintainer "admin@centos.bz"
 
# 定义软件版本,编译工具,依赖等变量
env php_version 5.6.30
env build_tools m4 \
    autoconf \
    autoconf2.13 \
    openssl \
    wget \
    gcc \
    make
 
env build_deps libcurl4-gnutls-dev \
    libxml2-dev \
    zlib1g-dev \
    libpcre3-dev \
    libjpeg-dev \
    libpng12-dev \
    libfreetype6-dev \
    libmhash-dev \
    libmcrypt-dev \
    libssl-dev \
    libtool
 
env php_location /usr/local/php
env build_arg --prefix=${php_location} \
    --with-config-file-path=${php_location}/etc \
    --enable-fpm \
    --enable-bcmath \
    --with-pdo_sqlite \
    --with-gettext \
    --with-iconv \
    --enable-ftp \
    --with-sqlite3 \
    --enable-mbstring \
    --enable-sockets \
    --enable-zip \
    --enable-soap \
    --with-openssl \
    --with-zlib \
    --with-curl \
    --with-gd \
    --with-jpeg-dir \
    --with-png-dir \
    --with-freetype-dir \
    --with-mcrypt \
    --with-mhash \
    --with-mysql=mysqlnd \
    --with-mysqli=mysqlnd \
    --with-pdo-mysql=mysqlnd \
    --without-pear \
    --with-libdir=lib64 \
    --enable-opcache \
    --disable-cgi
 
env src_dir /opt/php
 
workdir ${src_dir}
 
# 开始编译安装php
run apt-get update \
 && apt-get -y --no-install-recommends install ${build_deps} ${build_tools} \
 && wget http://php.net/distributions/php-${php_version}.tar.gz \
 && tar xf php-${php_version}.tar.gz \
 && cd php-${php_version} \
 && ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib/libssl.so \
 && ln -s /usr/lib /usr/lib64 \
 && ./configure ${build_arg} \
 && make -j$(nproc) \
 && make install \
 && cp php.ini-production ${php_location}/etc/php.ini \
 && cp ${php_location}/etc/php-fpm.conf.default ${php_location}/etc/php-fpm.conf \
 && rm -rf ${src_dir} \
 && apt-get purge -y --auto-remove ${build_tools} \
 && rm -rf /var/lib/apt/lists/*
 
 
workdir ${php_location}/etc/
 
# 配置php-fpm,即使用sed工具编辑php-fpm.conf和php.ini文件,这里的php-fpm相关配置命令不与上面的编译命令合在一起来减小层数是因为
# 配置文件可能会改动比较多,这样分开当配置文件更改时可以直接使用缓存跳过编译步骤,加快构建速度。
run set_php_variable(){ \
  local key=$1; \
  local value=$2; \
  if grep -q -e "^$key\s*=" php.ini;then \
   sed -i -r "s#^$key\s*=.*#$key=$value#" php.ini; \
  else \
   sed -i -r "s#;\s*$key\s*=.*#$key=$value#" php.ini; \
  fi; \
  if ! grep -q -e "^$key\s*=" php.ini;then \
   echo "$key=$value" >> php.ini; \
  fi; \
 } \
 && base_dir=/home/docker/php \
 && set_php_variable disable_functions "dl,eval,assert,exec,popen,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open" \
 && set_php_variable expose_php off \
 && set_php_variable error_log ${base_dir}/php_errors.log \
 && set_php_variable request_order "cgp" \
 && set_php_variable cgi.fix_pathinfo 0 \
 && set_php_variable short_open_tag on \
 && set_php_variable date.timezone asia/chongqing \
 && sed -i 's/^user =.*/user = www-data/' php-fpm.conf \
 && sed -i 's/^group =.*/group = www-data/' php-fpm.conf \
 && sed -i "s#;slowlog = log/\$pool.log.slow#slowlog = ${base_dir}/\$pool.log.slow#" php-fpm.conf \
 && sed -i 's/;request_slowlog_timeout = 0/request_slowlog_timeout = 5/' php-fpm.conf \
 && sed -i 's/^pm.max_children.*/pm.max_children =20/' php-fpm.conf \
 && sed -i 's/^pm.start_servers.*/pm.start_servers =5/' php-fpm.conf \
 && sed -i 's/^pm.min_spare_servers.*/pm.min_spare_servers =3/' php-fpm.conf \
 && sed -i 's/^pm.max_spare_servers.*/pm.max_spare_servers =8/' php-fpm.conf \
 && sed -i '/\[global\]/a\daemonize =no' php-fpm.conf \
 && sed -i 's/^listen.*/listen =0.0.0.0:9000/' php-fpm.conf \
 && echo "[opcache]\n \
   zend_extension=opcache.so\n \
   opcache.memory_consumption=128\n \
   opcache.interned_strings_buffer=8\n \
   opcache.max_accelerated_files=4000\n \
   opcache.revalidate_freq=60\n \
   opcache.fast_shutdown=1 \n" >> php.ini
 
entrypoint ["/usr/local/php/sbin/php-fpm"]
 
expose 9000

mysql dockerfile

创建dockerfile/centos.bz/mysql/dockerfile文件,内容如下:

from mysql:5.6
label maintainer "admin@centos.bz"
copy my.cnf /etc/mysql/my.cnf

这个dockerfile非常简单,直接使用了官方的mysql镜像,唯一区别是我们使用自己定义的my.cnf配置文件。

对于my.cnf配置文件,需要把日志,data目录指向/home/docker/mysql,一个my.cnf示例文件如下:

# generated by ezhttp at 2016-02-03 01:05:29
 
[mysql]
 
# client #
port       = 3306
socket       = /home/docker/mysql/mysql.sock
 
[mysqld]
 
# general #
port       = 3306
user       = mysql
default-storage-engine   = innodb
socket       = /home/docker/mysql/mysql.sock
pid-file      = /home/docker/mysql/mysql.pid
skip-name-resolve
 
# myisam #
key-buffer-size    = 32m
 
# innodb #
#innodb-flush-method   = o_direct
innodb-log-files-in-group  = 2
innodb-log-file-size   = 64m
innodb-flush-log-at-trx-commit = 2
innodb-file-per-table   = 1
innodb-buffer-pool-size  = 1g
 
# caches and limits #
tmp-table-size     = 32m
max-heap-table-size   = 32m
query-cache-type    = 0
query-cache-size    = 0
max-connections    = 300
thread-cache-size    = 50
open-files-limit    = 1024
table-definition-cache   = 100
table-open-cache    = 400
 
 
# safety #
max-allowed-packet    = 16m
max-connect-errors    = 1000000
 
# data storage #
datadir      = /home/docker/mysql
 
# logging #
log-error      = /home/docker/mysql/mysql-error.log
log-queries-not-using-indexes = 1
slow-query-log     = 1
slow-query-log-file   = /home/docker/mysql/mysql-slow.log
 
# binary logging #
log-bin = /home/docker/mysql/mysql-bin
server-id = 1
expire-logs-days = 14
sync-binlog = 1

构建镜像

把上一步创建的文件推送到阿里云的kelude。然后我们登录阿里云的docker镜像仓库cr.console.aliyun.com。这里以设置自动构建nginx镜像为例,php和mysql镜像构建设置类似。

1.点击左侧“镜像列表”,在右侧点击仓库镜像,如图:

如何用Docker搭建Nginx+PHP+MySQL环境并部署WordPress

2.在仓库镜像创建对话框中,说明如下:

地域:选择离部署docker主机最近的位置,国内的话选择华东1或华东2。

namespace和仓库名称:这里选择centos-bz,nginx。

设置代码源:我们这里选择阿里云code。

构建设置:勾选代码变更时自动构建镜像,海外机器构建(因为国内主机apt-get安装软件时较慢),dockerfile路径填/centos.bz/nginx

造梦阁AI
造梦阁AI

AI小说推文一键成片,你的故事值得被看见

下载

完成后点击创建仓库按钮。

如图:

如何用Docker搭建Nginx+PHP+MySQL环境并部署WordPress

3.回到镜像列表,找到nginx镜像,点击管理。

4.左侧点击“构建”,右侧点击“立即构建”开始首次构建,之后我们更改dockerfile及配置文件到kelude之后就会自动构建了。

5.查看日志,查看构建进程。

然后继续完成php,mysql的镜像构建设置。

启动环境

为了方便统一管理nginx,php,mysql的启动,我们使用docker-compose工具。我们只需要编写一个docker-compose.yml文件,然后使用docker-compose工具就可以快速启动docker容器了。之后把docker-compose.yml传输到任意一台支持docker环境的主机中就可以快速配置wordpress的运行环境。

docker-compose.yml

把docker-compose.yml文件放置在/home/docker目录下。

version: '3'
# 定义三个服务nginx,php,mysql
services:
 nginx:
  # 依赖php服务,意味着在启动nginx之前先启动php
  depends_on:
   - php
  # nginx镜像的路径
  image: registry.cn-hangzhou.aliyuncs.com/centos-bz/nginx
  # 容器的/home/docker/nginx目录挂载主机中的/home/docker/nginx目录,
  # 这样使nginx容器把网站文件和目录存放到主机目录中,持久化和方便管理
  volumes:
   - /home/docker/nginx:/home/docker/nginx
  # nginx意外退出时自动重启
  restart: always
 
  # 映射80和443端口
  ports:
   - "80:80"
   - "443:443"
 
  # 容器名称
  container_name: nginx 
 php:
  depends_on:
   - mysql
  image: registry.cn-hangzhou.aliyuncs.com/centos-bz/php-fpm
  restart: always
  volumes:
   - /home/docker/nginx/www:/home/docker/nginx/www
   - /home/docker/php:/home/docker/php
  container_name: php 
 
 mysql:
  image: registry.cn-hangzhou.aliyuncs.com/centos-bz/mysql
  volumes:
   - /home/docker/mysql:/home/docker/mysql
  restart: always
  # 设置mysql_root_password环境变量,这里是设置mysql的root密码。这里为root。
  environment:
   mysql_root_password: root
  container_name: mysql

启动环境

在/home/docker目录执行:

docker-compose up

查看nginx,php,mysql是否正常启动,如果正常,ctrl-c停止,再执行:

docker-compose up -d

这里compose命令就在后台启动了。

执行docker ps查看容器运行状态。

连接问题

容器之间可以通过容器名称来连接,如nginx配置文件中连接php的代码fastcgi_pass php:9000,网站数据库配置文件使用mysql:3306。

日常运维

 迁移

比如a主机迁移到b主机。只需要三步。

1.打包a主机的/home/docker目录,传输到b主机相同位置

2.配置b主机docker环境

3.在b主机的/home/docker目录下执行docker-compose up -d

导出导入数据库

把centos.sql.gz数据库文件导入到centos数据库:

gunzip < centos.sql.gz | docker exec -i mysql mysql -uroot -proot centos

把centos数据库导出到centos.sql.gz

docker exec -i mysql mysqldump -uroot -proot centos | gzip > centos.sql.gz

备份

推荐使用ezhttp一键备份设置:

wget centos.bz/ezhttp.zip
unzip ezhttp.zip
cd ezhttp-master
./start.sh

之后会弹出一个菜单,输入2选择some useful tools,然后输入14选择备份设置。需要注意的是在设置mysql使用mysqldump备份时,在提示输入mysql bin directory时,输入docker exec /usr/bin/。

相关文章

WPS零基础入门到精通全套教程!
WPS零基础入门到精通全套教程!

全网最新最细最实用WPS零基础入门到精通全套教程!带你真正掌握WPS办公! 内含Excel基础操作、函数设计、数据透视表等

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

44

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

58

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

11

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

65

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

36

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

75

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

21

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

Docker 17 中文开发手册
Docker 17 中文开发手册

共0课时 | 0人学习

极客学院Docker视频教程
极客学院Docker视频教程

共33课时 | 17.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号