如何利用docker快速搭建wordpress
磨人精摸哈哈精
2021年03月25日 16:40
收录于文集
共1篇

说明:

  1. 我用的服务器是阿里云的,操作系统是centos7.9

  2. 需要安装docker(这里不详细描述)

  3. 为了服务器尽可能多的被利用(即不仅仅是用作博客),尽量将nginx和wordpress分不同用户部署

  4. 需要申请ssl证书,可自行在阿里云上申请免费证书

  5. 需要开启https

这里提供两种方式,一种是不用nginx跳转的(这种比较简单),第二种是利用nginx跳转并实现https

一、不使用nginx的情况下快速搭建(省略安装docker步骤)

前提是centos7安装了docker

1. 利用root用户新建 wordpress 用户

因为想把服务器高度利用,所以每个应用都做了用户分离

代码块
Shell
自动换行
复制代码
useradd -g docker wordpress
复制成功

2. su 到 wordpress 用户,新建docker-compose.yml文件并编辑

代码块
Shell
自动换行
复制代码
# 新建 docker-compose.yml 文件 并编辑

vim docker-compose.yml
复制成功

代码块
YAML
自动换行
复制代码
version: '3.7'

services:
  db:
    image: mysql:5.7
    hostname: mysql
    volumes:
      - /home/wordpress/db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: your_database
      MYSQL_USER: your_user
      MYSQL_PASSWORD: your_password
    ports:
      - "3306:3306"
    networks:
      - mynet

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    hostname: wordpress
    restart: always
    links:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: your_user
      WORDPRESS_DB_PASSWORD: your_password
      WORDPRESS_DB_NAME: your_database
    ports:
      - "8000:80"
    volumes:
      - /home/wordpress/wordpress_data:/var/www/html
    networks:
      - mynet

volumes:
  db_data:
  wordpress:

networks:
    bridge: mynet
复制成功

3. 启动wordpress容器

代码块
Shell
自动换行
复制代码
docker-compose -f docker-compose.yml up -d
复制成功

4. 查看容器运行状态

代码块
Shell
自动换行
复制代码
docker ps
复制成功

5. 浏览器访问

http://ip:8000

二、使用nginx并实现https(省略安装docker的步骤)

1. 利用root用户新建 wordpress 和 nginx 用户

因为想把服务器高度利用,所以每个应用都部署在了不同的用户

代码块
Shell
自动换行
复制代码
useradd -g docker wordpressuseradd -g docker nginx
复制成功

2. 创建docker网络

注意:因为我们需要通过两个用户(即wordpress和nginx)分别创建wordpress和nginx容器,这里就涉及到 nginx容器访问wordpress容器的问题

代码块
Shell
自动换行
复制代码
# 我们可以查看一下当前docker网络
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
38465999****   bridge    bridge    local
3b031875****   host      host      local
7c1a2a89****   none      null      local

# 我们创建自己的docker网络,默认就是bridge
$ docker network create wp-net

# 再次查看docker网络,可发现已创建成功
$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
38465999****   bridge    bridge    local
3b031875****   host      host      local
7c1a2a89****   none      null      local
c0140c3d****   wp-net    bridge    local
复制成功

3. su 到 wordpress 用户,新建docker-wordpress.yml文件并编辑

代码块
Shell
自动换行
复制代码
# 新建 docker-wordpress.yml 文件 并编辑

vim docker-wordpress.yml
复制成功

代码块
YAML
自动换行
复制代码
version: '3.3'

services:
  db:
    image: mysql:5.7
    hostname: mysql
    volumes:
      - /home/wordpress/db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_root_password
      MYSQL_DATABASE: your_database
      MYSQL_USER: your_user
      MYSQL_PASSWORD: your_password
    ports:
      - "3301:3306"
    networks:
      - "mynet"

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    hostname: wordpress
    restart: always
    links:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: your_user
      WORDPRESS_DB_PASSWORD: your_password
      WORDPRESS_DB_NAME: your_database
    ports:
      - "18080:80"
    volumes:
      - /home/wordpress/wordpress_data:/var/www/html
    networks:
      - "mynet"

volumes:
  db_data:
  wordpress_data:

networks:
  mynet:
    external:
      name: wp-net
复制成功

4. 启动wordpress容器

代码块
Shell
自动换行
复制代码
docker-compose -f docker-wordpress.yml up -d
复制成功

5. 查看容器运行状态

代码块
Shell
自动换行
复制代码
docker ps
复制成功

6. 访问博客网址

http://ip:18080

代码块
Shell
自动换行
复制代码
这时候想配置wp就配置,不想配置就等nginx配好之后再弄 到这儿只要确保我们的wp能正常访问运行即可COPY
复制成功

7. su 到 nginx 用户,新建docker-nginx.yml文件并编辑

代码块
Shell
自动换行
复制代码
# 新建 docker-nginx.yml 文件 并编辑

vim docker-nginx.yml
复制成功

代码块
YAML
自动换行
复制代码
version: "3.3"

services:

 my-nginx:

   image: nginx

   container_name: my-nginx

   hostname: mynginx

   restart: always

   ports:

     - "80:80"

     - "443:443"

   privileged: true

   volumes:

     - /home/nginx/nginx/html:/usr/share/nginx/html

     - /home/nginx/nginx/nginx.conf:/etc/nginx/nginx.conf

     - /home/nginx/nginx/conf.d:/etc/nginx/conf.d

     - /home/nginx/nginx/logs:/var/log/nginx

     - /home/nginx/nginx/cert:/cert

   environment:

     - TZ=Asia/Shanghai

   networks:

     - "mynet"

networks:

 mynet:

   external:

     name: wp-net
复制成功

8. 启动nginx容器 并查看

代码块
Shell
自动换行
复制代码
docker-compose -f docker-nginx.yml up -d

docker ps
复制成功

9. 停止nginx容器 配置conf

当上一步nginx容器启动成功之后,你会发现在当前目录下生成了 nginx/  目录(因为已经通过volume挂载) 我们就需要在这里面配置 nginx的配置文件

代码块
Shell
自动换行
复制代码
$ cd nginx/conf.d

# 新建并编辑wordpress.conf,第一步实现http功能

$ vim wordpress.conf
复制成功

代码块
XML
自动换行
复制代码
server {
    listen    80;
    server_name  xxxxblog;

    #charset koi8-r;
    access_log  /var/log/nginx/wordpress.access.log  main;
    set $node_port 18080;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        // 这里需要填写你的容器IP,可以通过 docker network inspect wp-net 查看
        proxy_pass http://your_wordpress_ip:80;
        proxy_redirect off;
        proxy_connect_timeout 1s;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}
复制成功

10. 重启服务,访问测试

代码块
Shell
自动换行
复制代码
docker restart my-nginx
复制成功

代码块
Shell
自动换行
复制代码
http://ip
如果访问成功则进行下一步配置https
若没访问成功,可以排查一下 nginx 到 wordpress 容器间网络问题,或nginx配置
复制成功

11.配置 https (这里省略了证书申请过程,大家可以通过阿里云申请免费证书)

代码块
Shell
自动换行
复制代码
# 备份一下之前写的 wordpress.conf
$ cp wordpress.conf wordpress.conf.http
# 编辑
$ vim wordpress.conf
复制成功

代码块
XML
自动换行
复制代码
upstream wordpress {
  server your_wordpress_ip:80 ;  // wordpress容器地址
}

server {
  listen 80;
  rewrite ^/(.*)$ https://url/$1 permanent;
}

server {
  listen 443 ssl;
  server_name  xxxxblog;

  ssl_certificate      /cert/XXX.pem;
  ssl_certificate_key  /cert/XXX.key;
  ssl_session_cache    shared:SSL:1m;
  ssl_session_timeout  5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

  #charset koi8-r;
  access_log  /var/log/nginx/wordpress.access.log  main;
  location / {
        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-Proto $scheme;
        proxy_pass  http://wordpress;
        proxy_connect_timeout 1s;
    }

  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   /usr/share/nginx/html;
  }
}
复制成功

12. 重启服务,访问测试

代码块
Shell
自动换行
复制代码
docker restart my-nginx
复制成功

代码块
Shell
自动换行
复制代码
https://ip
若没访问成功,排查一下nginx配置 或 证书配置路径等!
复制成功