首先撰寫一支 compose file,設定要使用的 docker image,以及掛載 volumes 的路徑,掛載的部分包含網頁程式碼、主機設定檔以及憑證路徑。
version: '3.7' services: home: container_name: home image: nginx:latest ports: - 80:80 - 443:443 restart: always volumes: - /html:/usr/share/nginx/html - ./default.conf:/etc/nginx/conf.d/default.conf - /ssl:/etc/nginx/ssl
如法炮製一個 port 為 8000:80、8001:443 的 container,如此一來首頁以及個人頁面就已經完成架設。
WordPress
wordpress 的部分,官方 image 使用 apache 做為 web server,但也可以改為使用 nginx + wp-fpm 的方式,使用 nginx 的話要額外再做一些設定,一開始我是打算使用 nginx,但最後因為多站點的導向問題處理不了,最後放棄還是使用官方的版本,詳細會在後續文章中說明。
以下是 docker-compose 設定檔:
version: '3.7' services: db: container_name: db image: mysql:8.0 restart: always command: '--default-authentication-plugin=mysql_native_password' volumes: - wp_db_data:/var/lib/mysql restart: always environment: - MYSQL_ROOT_PASSWORD=wordpress - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress wordpress: container_name: wp image: wordpress depends_on: - db restart: always ports: - 8010:80 - 8011:443 volumes: - /wp/html:/var/www/html - /wp/conf:/etc/apache2/sites-available - ./ssl/certificate.crt:/etc/ssl/certificate.crt - ./ssl/ca_bundle.crt:/etc/ssl/ca_bundle.crt - ./ssl/private.key:/etc/ssl/private/private.key environment: - WORDPRESS_DB_HOST=db - WORDPRESS_DB_NAME=wordpress - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress volumes: wp_db_data:
坑
1. 執行 docker-compose up
之後,DB 一直重複 restart:
可以透過以下指令查看 container 的狀態,後來發現是因為主機記憶體不足,沒辦法成功啟動。
docker logs <container-name>
2. docker 成功啟動,但是無法進入該機器:
AWS 預設會將絕大部分的 port 關閉,要到 EC2 的安全群組去設定對應的 port 開啟才可以。
3. 進入 wordpress 頁面時看到 Error Establishing a Database Connection 錯誤:
由於啟動過程中各種 up & down,先前 up 時已經掛載了 volume,因此後續的設定無法正常套用,沒有正確建立出給 wordpress 使用的帳密,可透過以下指令清除後再重新啟動。
docker-compose down -v
若有在使用 wordpress 會知道這是非常常見的錯誤,因此也不一定是這個原因所導致,建議先透過以下指令碼去查看帳密是否都有正確寫入:
docker exec -it mysql bash mysql -u root -p // 輸入密碼 mysql> SELECT User,Host FROM mysql.user;
另外也有可能是 mySQL 8 版的驗證方式 、wp-config.php 設定錯誤等原因。
4. 輸入 IP 將 wordpress 安裝完成後,從 domain 進入網站,樣式會跑掉
初次安裝時,會將 server IP 寫入資料表,可以透過以下指令查看及修改:
mysql -u root -p mysql> select * from wp_options where option_id=1; mysql> update wp_options set option_value="http://xxxx" where option_id=1;
個人的建議是,如果還沒安裝的話就先不要安裝,讓畫面停在 wordpress 的介紹安裝頁,等待 DNS 以及 SSL 等等設定都全部完成之後,最後再來安裝。
參考資料:
- 在 Docker 利用 nginx 部署多個 SSL 網站
https://michael-hsu.medium.com/%E5%9C%A8-docker-%E5%88%A9%E7%94%A8-nginx-%E9%83%A8%E7%BD%B2%E5%A4%9A%E5%80%8B-ssl-%E7%B6%B2%E7%AB%99-f42caa54f5c2 - Hosting WordPress in Docker with SSL 2020
https://zactyh.medium.com/hosting-wordpress-in-docker-with-ssl-2020-fa9391881f3 - WordPress host IP changed
https://stackoverflow.com/questions/535534/wordpress-host-ip-changed