跳至正文

Linux 使用 Docker 部署 WordPress

系统需求

  • Linux

本次部署将使用 TencentOS Server 3.1*

*TencentOS Server 是腾讯云针对云的场景研发的 Linux 操作系统,提供特定的功能及性能优化,为云服务器实例中的应用程序提供更高的性能及更加安全可靠的运行环境, TencentOS Server 用户态环境与 CentOS 保持兼容,在 CentOS 上开发的应用程序可直接在 TencentOS Server 上运行。

*TencentOS Server 3.1 内核是基于社区5.4 LTS 深度优化的 tkernel4。

安装 Docker Engine

根据自身系统,参考以下文章安装 Docker Engine

TencentOS 3.1(以下简称tlinux 3.1)默认已经安装好 Docker Engine,因此无需手动安装。

使用 Docker secrets

敏感数据可以使用 Docker secrets 进行管理,例如密码,用户名或账号等,数据将会被加密储存在 Docker swarm 中,并且数据在传输中亦保持加密。

初始化 Docker swarm

启动 Docker Engine

sudo systemctl start docker

初始化 Docker swarm

docker swarm init

创建 secrets

有两种方法可以创建 secrets

第一:创建文件写入数据,读取文件内的数据并创建 secrets,最后删除文件

sudo nano my_secret_data
docker secret create my_secret_data my_secret_data
sudo rm my_secret_data

第二:直接创建 secrets

printf "This is a secret" | docker secret create my_secret_data -

查看所有创建的 secrets

*不会显示 secrets 的原内容

docker secret ls

查看创建 secret 的详细信息

*不会显示 secrets 的原内容

docker secret inspect my_secret_data

使用 Docker 部署 WordPress

WordPress 官方镜像支持的 Docker secrets 环境变量

WORDPRESS_DB_HOSTWORDPRESS_DB_USERWORDPRESS_DB_PASSWORDWORDPRESS_DB_NAMEWORDPRESS_AUTH_KEYWORDPRESS_SECURE_AUTH_KEYWORDPRESS_LOGGED_IN_KEYWORDPRESS_NONCE_KEYWORDPRESS_AUTH_SALTWORDPRESS_SECURE_AUTH_SALTWORDPRESS_LOGGED_IN_SALTWORDPRESS_NONCE_SALTWORDPRESS_TABLE_PREFIX, and WORDPRESS_DEBUG

*使用 secret 时需要在环境变量后加上 _FILE ,例如 WORDPRESS_DB_PASSWORD_FILE

创建所需的 secrets

打开 https://api.wordpress.org/secret-key/1.1/salt/ 获取对应 WORDPRESS_AUTH_KEYWORDPRESS_SECURE_AUTH_KEYWORDPRESS_LOGGED_IN_KEYWORDPRESS_NONCE_KEYWORDPRESS_AUTH_SALTWORDPRESS_SECURE_AUTH_SALTWORDPRESS_LOGGED_IN_SALTWORDPRESS_NONCE_SALT 的数值,并创建 secrets。

例如:

创建 WORDPRESS_AUTH_KEY secret

sudo nano wordpress_auth_key
docker secrets create wordpress_auth_key wordpress_auth_key
sudo rm wordpress_auth_key

创建 yaml 文件

version: '3.9'


services:
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wpuser
      - WORDPRESS_DB_PASSWORD_FILE=/run/secrets/wordpress_db_password
      - WORDPRESS_DB_NAME=wpdb
      - WORDPRESS_AUTH_KEY_FILE=/run/secrets/wordpress_auth_key
      - WORDPRESS_SECURE_AUTH_KEY_FILE=/run/secrets/wordpress_secure_auth_key
      - WORDPRESS_LOGGED_IN_KEY_FILE=/run/secrets/wordpress_logged_in_key
      - WORDPRESS_NONCE_KEY_FILE=/run/secrets/wordpress_nonce_key
      - WORDPRESS_AUTH_SALT_FILE=/run/secrets/wordpress_auth_salt
      - WORDPRESS_SECURE_AUTH_SALT_FILE=/run/secrets/wordpress_secure_auth_salt
      - WORDPRESS_LOGGED_IN_SALT_FILE=/run/secrets/wordpress_logged_in_salt
      - WORDPRESS_NONCE_SALT_FILE=/run/secrets/wordpress_nonce_salt
    volumes:
      - wordpress:/var/www/html
    secrets:
      - wordpress_db_password
      - wordpress_auth_key
      - wordpress_secure_auth_key
      - wordpress_logged_in_key
      - wordpress_nonce_key
      - wordpress_auth_salt
      - wordpress_secure_auth_salt
      - wordpress_logged_in_salt
      - wordpress_nonce_salt

  db:
    image: mysql:latest
    environment:
      - MYSQL_DATABASE=wpdb
      - MYSQL_USER=wpuser
      - MYSQL_PASSWORD_FILE=/run/secrets/wordpress_db_password
      - MYSQL_RANDOM_ROOT_PASSWORD='1'
    volumes:
      - mysql:/var/lib/mysql
    secrets:
      - wordpress_db_password

secrets:
  wordpress_db_password:
    external: true
  wordpress_auth_key:
    external: true
  wordpress_secure_auth_key:
    external: true
  wordpress_logged_in_key:
    external: true
  wordpress_nonce_key:
    external: true
  wordpress_auth_salt:
    external: true
  wordpress_secure_auth_salt: 
    external: true
  wordpress_logged_in_salt:
    external: true
  wordpress_nonce_salt:
    external: true

volumes:
  wordpress:
  mysql:

*Docker volumes 将会保存(持久化)数据在本地 /var/lib/docker/volumes 这个目录,删除 docker container 时 并不会自动删除 volume,需要使用 docker volume 命令手动管理 volume。

使用Docker stack 启动 WordPress

运行以下命令

docker stack deploy -c stack.yml wordpress

等待 WordPress 初始化后,即可通过 80 端口访问你的网站。

查看 docker stack 运行的服务

docker stack ls

关闭 WordPress

docker stack rm wordpress

*由于数据已经持久化在本地 volumes,关闭 WordPress container并不会造成任何数据损失。

Docker WordPress 使用 HTTPS

WordPress Docker官方镜像内置使用 Apache,在 Docker 外部将使用 Nginx 反向代理来使用 HTTPS。

安装 Nginx

sudo yum install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

更改 WordPress yaml 文件中 HTTP 端口,使用 8080

ports:
  - 8080:80

编辑 Nginx WordPress conf 文件

server {
    listen 80;
    server_name www.example.com;
    server_tokens off;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;
    server_tokens off;
    ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;
    proxy_set_header X-Forwarded-For $remote_addr;

    location / {
         proxy_pass         http://172.18.0.2:8080;
         proxy_set_header   Host $host;
         proxy_set_header   X-Real-IP $remote_addr;
         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
         proxy_set_header   X-Forwarded-Host $server_name;
         proxy_read_timeout  1200s;

         proxy_set_header   X-Forwarded-Proto https;
    }
}

完成后先在 WordPress 设置界面更改网址为 HTTPS,再重启Docker 和 Nginx, 此时再进入就会自动跳转到 HTTPS。

*proxy_pass 为 Docker 内部 WordPress 地址

参考文档


发表评论须遵守中华人民共和国相关法律法规。违规评论将会被删除。

Comments must subject to the relevant laws and regulations of the People’s Republic of China. Offending comments will be deleted.

发表回复

您的电子邮箱地址不会被公开。