Docker 架設 WordPress feat Let’s Encrypt

前言

第一篇文章,就該是這個網誌的誕生日誌
將會介紹使用了哪些工具
以及使用上的注意事項
比較需要詳細說明的細節將會在未來的文章中做教學
Docker 架設 WordPress 會是今天的焦點
目的是看著這篇文章一步一步做也可以架出屬於自己的站

更新

2023.10.18 發佈了【憑證】Let’s Encrypt 申請過程,Let’s Encrypt 的部分可以參考看看

必要條件

  • 固定外網 IP
    • 或者 DDNS,例如 no-ip
  • 擁有一個網域,例如 GoDaddy
  • 能夠自主設定路由器
    • 如果機器能夠直接使用外網 IP,則不需要

安裝環境

  • OS: ubuntu 20.04 (VM)
  • Docker: 20.10.12
  • DB: MySQL or Mariadb 皆可

映像檔選擇

WordPress 5.9.1,使用以下命令,先下載至本機

docker pull wordpress:5.9.1

nginx 1.21.6,使用以下命令,先下載至本機

docker pull nginx:1.21.6

certbot/certbot,使用以下命令,先下載至本機

docker pull certbot/certbot

安裝流程

  1. 建立 macvlan
  2. 使用 certbot 申請 Lets Encrypt 憑證(免費)
  3. 編輯 nginx HTTPS 設定
  4. 開始架設 WordPress
  5. 備份

建立 macvlan

這邊開始使用 docker 命令
我安裝的系統是 VM,所以並沒有考慮在 VM 中登入 wordpress
使用 macvlan 只是個人的習慣,使用 docker bridge 或者 host network 皆可

docker network create -d macvlan \
  --subnet=172.20.10.0/24 \
  --gateway=172.20.10.1 \
  -o parent=enp2s0 \
  tocvlan

subnet:區域網路的網段,這邊指的是 C class on 172.20.10.1~172.20.10.254
gateway:輸入路由器的位置
parent:網卡的 interface name,利用 ifconfig 可以查詢

使用 certbot 申請 Let’s Encrypt

【憑證】Let's Encrypt 申請過程-08
Docker 架設 WordPress

申請

docker stop certbot
docker system prune --volumes -f
docker run -it \
    --name certbot \
    -v /root/certbot_data/www:/var/www/certbot/:rw \
    -v /root/certbot_data/conf:/etc/letsencrypt/:rw \
    certbot/certbot:latest certonly -v --webroot --webroot-path /var/www/certbot/ -d blog.tocandraw.com

更新

docker stop certbot
docker system prune --volumes -f
docker run -it \
    --name certbot \
    -v /root/certbot_data/www:/var/www/certbot/:rw \
    -v /root/certbot_data/conf:/etc/letsencrypt/:rw \
    certbot/certbot:latest renew

-d blog.tocandraw.com 記得更新為自己網域

Docker 架設 WordPress

rm -rf /root/wordpress_data
echo 'file_uploads = On
post_max_size = 30M
upload_max_filesize = 30M' > /root/wordpress_data/wordpress.ini
docker run -d \
  --network tocvlan \
  --ip=172.20.10.231 \
  --restart always \
  --name=wordpress \
  -e WORDPRESS_DB_HOST=172.20.10.20 \
  -e WORDPRESS_DB_USER=root \
  -e WORDPRESS_DB_PASSWORD=asdf0000 \
  -e WORDPRESS_DB_NAME=wordpress \
  -e WORDPRESS_TABLE_PREFIX=wp_ \
  -v /root/wordpress_data:/var/www/html \
  -v /root/wordpress_data/wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini \
  wordpress:latest

編輯 nginx HTTPS 設定

rm -rf /root/nginx_data
mkdir /root/nginx_data
echo 'server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name blog.tocandraw.com;
    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name blog.tocandraw.com;
    client_max_body_size 30m;
    location / {
        proxy_pass http://172.20.10.231;
        proxy_http_version  1.1;
        proxy_cache_bypass  $http_upgrade;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
        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_set_header X-Forwarded-Host   $host;
        proxy_set_header X-Forwarded-Port   $server_port;
    }
    ssl_certificate /etc/nginx/ssl/live/blog.tocandraw.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/blog.tocandraw.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
    ssl_dhparam /etc/nginx/ssl/live/blog.tocandraw.com/dhparam;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    add_header Strict-Transport-Security "max-age=63072000" always;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/ssl/live/blog.tocandraw.com/chain.pem;
    resolver 8.8.8.8;
}' > /root/nginx_data/nginx.conf

啟動 nginx

docker run -d \
    --network tocvlan \
    --ip=172.20.10.242 \
    --restart always \
    --name nginx \
    -v /root/nginx_data/:/etc/nginx/conf.d/:ro\
    -v /root/certbot_data/www:/var/www/certbot/:ro \
    -v /root/certbot_data/conf:/etc/nginx/ssl/:ro \
    nginx:latest

架設完成囉,如果路由已經設定完成
可以嘗試連連看囉


毛毛

可愛宅宅工程師、內容創作者
興趣是寫東東、寫東東跟寫東東。

Follow @Chindada Sponsor

留言功能已關閉。