운영 및 유지보수 엔진스 Docker로 Nginx+PHP+MySQL 환경을 구축하고 WordPress를 배포하는 방법

Docker로 Nginx+PHP+MySQL 환경을 구축하고 WordPress를 배포하는 방법

May 11, 2023 pm 08:37 PM
docker wordpress nginx

准备工作

 使用阿里云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

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

如图:

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/。

위 내용은 Docker로 Nginx+PHP+MySQL 환경을 구축하고 WordPress를 배포하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? PI 노드 교육 : PI 노드 란 무엇입니까? Pi 노드를 설치하고 설정하는 방법은 무엇입니까? Mar 05, 2025 pm 05:57 PM

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

DeepSeek을 설치하는 방법 DeepSeek을 설치하는 방법 Feb 19, 2025 pm 05:48 PM

Docker 컨테이너를 사용하여 사전 컴파일 된 패키지 (Windows 사용자의 경우)를 사용하여 소스 (숙련 된 개발자)를 컴파일하는 것을 포함하여 DeepSeek를 설치하는 방법에는 여러 가지가 있습니다. 공식 문서는 신중하게 문서를 작성하고 불필요한 문제를 피하기 위해 완전히 준비합니다.

Docker 컨테이너를 사용하여 JavaEE 애플리케이션 배포 Docker 컨테이너를 사용하여 JavaEE 애플리케이션 배포 Jun 05, 2024 pm 08:29 PM

Docker 컨테이너를 사용하여 Java EE 애플리케이션 배포: Dockerfile을 생성하여 이미지를 정의하고, 이미지를 빌드하고, 컨테이너를 실행하고, 포트를 매핑한 다음, 브라우저에서 애플리케이션에 액세스합니다. 샘플 JavaEE 애플리케이션: REST API는 Docker를 통해 배포한 후 localhost에서 액세스할 수 있는 데이터베이스와 상호 작용합니다.

WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? WordPress 사이트 파일 액세스가 제한됩니다. 도메인 이름을 통해 .txt 파일에 액세스 할 수없는 이유는 무엇입니까? Apr 01, 2025 pm 03:00 PM

WordPress 사이트 파일 액세스가 제한됩니다. 최근 .txt 파일에 액세스 할 수없는 이유를 문제 해결하십시오. 미니 프로그램 비즈니스 도메인 이름을 구성 할 때 일부 사용자는 문제가 발생했습니다.

Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Docker 환경에서 PECL을 사용하여 확장자를 설치할 때 오류가 발생하는 이유는 무엇입니까? 그것을 해결하는 방법? Apr 01, 2025 pm 03:06 PM

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

동일한 서버에서 NGINX 구성을 통해 PHP5.6 및 PHP7이 공존하는 방법은 무엇입니까? 동일한 서버에서 NGINX 구성을 통해 PHP5.6 및 PHP7이 공존하는 방법은 무엇입니까? Apr 01, 2025 pm 03:15 PM

같은 시스템에서 여러 PHP 버전을 동시에 실행하는 것은 특히 다른 프로젝트가 다른 버전의 PHP에 의존 할 때 일반적인 요구 사항입니다. 똑같은 방법 ...

H5 프로젝트를 실행하는 방법 H5 프로젝트를 실행하는 방법 Apr 06, 2025 pm 12:21 PM

H5 프로젝트를 실행하려면 다음 단계가 필요합니다. Web Server, Node.js, 개발 도구 등과 같은 필요한 도구 설치. 개발 환경 구축, 프로젝트 폴더 작성, 프로젝트 초기화 및 코드 작성. 개발 서버를 시작하고 명령 줄을 사용하여 명령을 실행하십시오. 브라우저에서 프로젝트를 미리보고 개발 서버 URL을 입력하십시오. 프로젝트 게시, 코드 최적화, 프로젝트 배포 및 웹 서버 구성을 설정하십시오.

램프 아키텍처에서 Node.js 또는 Python 서비스를 효율적으로 통합하는 방법은 무엇입니까? 램프 아키텍처에서 Node.js 또는 Python 서비스를 효율적으로 통합하는 방법은 무엇입니까? Apr 01, 2025 pm 02:48 PM

많은 웹 사이트 개발자는 램프 아키텍처에서 Node.js 또는 Python 서비스를 통합하는 문제에 직면 해 있습니다. 기존 램프 (Linux Apache MySQL PHP) 아키텍처 웹 사이트 요구 사항 ...

See all articles