自動目錄
docker 中安裝 apache和php7.4。比起傳統的套件獨立安裝,docker更有效率及布建會更方便,缺點是設置上多一些細節。
安裝 Docker及 docker compose
OS
Linux 5.14.0-70.30.1.el9_0.x86_64 #1 SMP PREEMPT Thu Nov 3 20:29:04 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Rocky Linux release 9.0 (Blue Onyx)
安裝
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli
# dnf install docker-compose-plugin
查看版本
# docker compose version
Docker Compose version v2.12.2
開機啟動
# systemctl enable --now docker
► 更多docker的操作可以參考這篇 [Centos8] 安裝及設定docker@新精讚
docker compose file
建立 docker-compose.yml
version: '3.8'
services:
apache:
image: php:7.4-apache
container_name: apache
restart: always
ports:
- 80:80
volumes:
- ../public_html:/var/www/html/
db:
image: mariadb:10.11
restart: always
container_name: mysql
volumes:
- ./db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD="yourpassword"
上面建立兩個容器,分別是apache和db,其中apache這個容器還包含了php7.4,版本以去dockerhub尋找適合的版本。
例如php,到dockerhub 搜尋php,點車Tags的頁籤,下面會出現很多頁
你可以在 Filter Tags中輸入想要篩檢的關鍵字,例如這次我想用7.x版的php,因此輸入7.進行篩選。
這次使用7.4-apache的版本,只要把tag的標題打入即可。
設定完畢後重新啟動docker compose,在 docker-compose.yml 所在的位置執行:
這個動作會在目錄下建立volume中設定的目錄 public_html/
再把你的php程式寫在這即可。
以上的ports設置中,80:80 代表 <os對外的埠號>:<container服務的ports號>
ports:
- 80:80
如果不開放給os以外,只給container之間或os對container連線的話,只需要寫一個即可,例如
ports:
- 3306
加入設定檔及SSL
上面的apache中的設定檔是在container中,可以將他指定到外部並進行設置,因此在volume中加入下面三行
- ./conf/000-default.conf:/etc/apache2/sites-available/000-default.conf
- ./conf/apache2.conf:/etc/apache2/apache2.conf
- ./conf/php.ini:/usr/local/etc/php/php.ini
這時 apache服務的設定看起來是這樣的
image: php:7.4-apache
container_name: apache
restart: always
ports:
- 80:80
volumes:
- ../public_html:/var/www/html/
- ./conf/000-default.conf:/etc/apache2/sites-available/000-default.conf
- ./conf/apache2.conf:/etc/apache2/apache2.conf
- ./conf/php.ini:/usr/local/etc/php/php.ini
分別把三個檔案移到os來,但是原始的設定檔去哪取得?
可以在container執行後,將他拷背出來。
在 docker-compose.yml 所在的位置執行:
# mkdir conf
# docker cp apache:/etc/apache2/sites-available/000-default.conf conf/
# docker cp apache:/etc/apache2/apache2.conf conf/
# docker cp apache:/usr/local/etc/php/php.ini conf/
然後重新啟動docker compose
# docker compose down
# docker compose up -d
如果需要ssl的話,加入3個volume:
- ./conf/default-ssl.conf:/etc/apache2/sites-enabled/default-ssl.conf <== 網站有ssl時的設定檔
- ./conf/fullchain.crt:/etc/ssl/certs/server.crt <== ssl公鑰
- ./conf/priv.key:/etc/ssl/private/private.key <== ssl私鑰
並把設定檔如前面說明的方式拷背出來
# docker cp apache:/etc/apache2/sites-enabled/default-ssl.conf conf/
公私鑰檔fullchain.crt, priv.key的話就放在指定的目錄中,此例放到 conf 中。
這時 apache服務的設定看起來是這樣的:
image: php:7.4-apache
container_name: apache
restart: always
ports:
- 80:80
volumes:
- ../public_html:/var/www/html/
- ./conf/000-default.conf:/etc/apache2/sites-available/000-default.conf
- ./conf/apache2.conf:/etc/apache2/apache2.conf
- ./conf/php.ini:/usr/local/etc/php/php.ini
- ./conf/default-ssl.conf:/etc/apache2/sites-enabled/default-ssl.conf
- ./conf/fullchain.crt:/etc/ssl/certs/server.crt
- ./conf/priv.key:/etc/ssl/private/private.key
結論
使用 docker 來架設伺服器是非常方便的事,只要熟析的話。
參考資料
[1] http://geekyplatypus.com/dockerise-your-php-application-with-nginx-and-php7-fpm/
[2] https://blogs.slat.org/blog/otakupapa/42
[3] https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/#fastcgi-params
[4] https://www.cnblogs.com/xiewenming/p/8109292.html
[5] https://www.nginx.com/resources/wiki/start/topics/examples/full/
[6] https://imququ.com/post/my-nginx-conf-for-wpo.html