這次的任務是在Red Hat Enterprise Linux release 9.3 (Plow) 裡安裝docker加上以下套件,而不使用redhat原生的podman。
REDHAT9的諸多分枝版本都大同小異。
安裝 Docker及 docker compose
OS
Linux 5.14.0-362.24.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Feb 15 07:18:13 EST 2024 x86_64 x86_64 x86_64 GNU/Linux
Red Hat Enterprise Linux release 9.3 (Plow)
安裝
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# dnf install docker-ce docker-ce-cli
查看版本
# docker compose version
Docker Compose version v2.24.7
開機啟動
# systemctl enable --now 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
安裝phpmyadmin
在docker-compose.yml加下以下內容
image: phpmyadmin
restart: always
container_name: phpmyadm
volumes:
- ./conf/config.user.inc.php:/etc/phpmyadmin/config.user.inc.php
- ./conf/apache2.conf:/etc/apache2/apache2.conf
environment:
- PMA_HOST=db
- UPLOAD_LIMIT=100M
- MEMORY_LIMIT=256M
- MAX_EXECUTION_TIME=300
並在apache的設定檔 000-default.conf中加入以下內容
ServerName yourdomain.exmaple.com
<Location /phpMyAdm>
ProxyPass "http://phpmyadmin/"
ProxyPassReverse "http://phpmyadmin/"
Order deny,allow
Deny from All
Allow from 192.168.1.0/24
<限定存取的ip範圍>
AllowMethods GET POST
</Location>
</VirtualHost>
這樣打入網址yourdomain.exmaple.com就能使用你的phpmyadmin
結論
使用 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