一、多容器運行 PHP+fpm+apache
1.1 安裝相關鏡像
fpm 鏡像地址:https://dev.aliyun.com/detail.html?repoId=1250
apache 鏡像地址:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.51.151b5aaaSVeZ8h&repoId=1220
盡可能的使用基於 alpine 的鏡像,體積很小。
1.2 運行 Fpm
docker run -d --rm --name fpm php:7.2.2-fpm-alpine
1.3 運行 Apache
首先在宿主機中創建 /home/txl/www 目錄,用來映射容器中網站根目錄。並且根據鏡像說明可知,默認網站根目錄存放在 /usr/local/apache2/htdocs/ 下:
運行 Apache 容器:
docker run -d -p 80:80 --rm --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ httpd:2.4.33-alpine
這時服務器已經具備訪問 html 頁面的能力了:
但是還不能識別 PHP 腳本,所以我們需要修改相關配置。一般需要准備一個 Apache 配置文件,或者從容器中拷貝一個默認的,然后掛載就可以了。根據鏡像說明可知,配置文件默認存放在 /usr/local/apache2/conf/httpd.conf:
拷貝到宿主機中 /home/txl/conf/httpd.conf 下:
docker cp httpd:/usr/local/apache2/conf/httpd.conf /home/txl/conf
修改配置,開啟如下內容:
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
添加虛擬主機站點:
<VirtualHost *:80> ServerAdmin txl@com.cn DocumentRoot "/usr/local/apache2/htdocs" ServerName localhost <Directory "/usr/local/apache2/htdocs"> Options None Require all granted </Directory> ProxyRequests Off ProxyPassMatch ^/(.*\.php)$ fcgi://172.17.0.3:9000/var/www/$1 </VirtualHost>
注意: 172.17.0.3 需要替換為真實的 fpm IP, 9000 是 fpm 默認的端口, /var/www 是一會要掛載到 fpm 容器中的網站路徑。
首先我使用的是默認網絡,宿主機本身是有 docker 網絡的,可以通過 ifconfig 查看。
通過 docker network inspect bridge 可以查看各個容器的 ip,保證 fpm 能正確響應:
配置完成后,分別掛載網站目錄和配置文件到容器中,重新啟動 Apache 容器:
docker run -d -p 80:80 --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ \ -v /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf \ httpd:2.4.33-alpine
1.4 將網站目錄掛載到 fpm 容器
重新啟動 fpm 容器:
docker run -d --rm --name fpm \ -v /home/txl/www:/var/www \ php:7.2.2-fpm-alpine
這時服務器就可以執行 PHP 腳本了:
1.5 使用 Compose 編排
之前安裝並手工啟動了 PHP + FPM + Apache,為了更方便的啟動和刪除容器,需要使用到編排工具 docker compose。
參考文檔:https://docs.docker.com/compose/install/#install-compose
1)安裝 docker compose
Linux 下需要先安裝:
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
2)compose file 配置文件
新建 compose 文件夾,進入后創建新文件 docker-compose.yml,根據之前的啟動命令編輯:
version: "3" services: fpm: image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mywebnet: ipv4_address: 192.158.0.2 httpd: image: httpd:2.4.33-alpine container_name: httpd ports: - "80:80" volumes: - /home/txl/www:/usr/local/apache2/htdocs/ - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf networks: mywebnet: ipv4_address: 192.158.0.3 networks: mywebnet: driver: bridge ipam: config: - subnet: 192.158.0.0/16
該配置文件設置了 fpm 的子網 ip 為 192.158.0.2,因此需要在 httpd.conf 配置中修改對應配置:
3)啟動
進入 docker-compose.yml 文件所在路徑,執行:
注意:使用 compose 啟動前需要先刪除相關容器以及網絡
docker-compose [-p 指定名稱] up -d
啟動成功,查看運行的容器:
查看創建的網絡:
訪問:
4)停止和刪除
進入 docker-compose.yml 文件所在路徑,執行:
# 停止 docker-compose [-p 指定名稱] stop # 刪除 docker-compose [-p 指定名稱] rm
注意:如果之前創建了相同子網,需要先刪除之前的,否則會產生沖突。
# 刪除空閑網絡
docker network prune
# 刪除指定網絡
docker network rm [network]
二、多容器運行 PHP+fpm+nginx
2.1 安裝 nginx 鏡像
nginx 鏡像地址:https://hub.docker.com/_/nginx
2.2 運行 Nginx 容器
根據鏡像說明可知:
- 默認的網頁目錄是:/usr/share/nginx/html
- 默認的配置文件是:/etc/nginx/nginx.conf
一般需要准備一個 nginx 配置文件,或者先臨時啟動容器,然后拷貝容器中的默認配置文件:
docker run --name nginx --rm -d nginx:1.15.1-alpine docker cp nginx:/etc/nginx/nginx.conf /home/txl/conf
在 http 節點下添加配置節 server:
server{ listen 80; location / { root /usr/share/nginx/html; index index.html index.htm index.php; } location ~ \.php$ { root /var/www; fastcgi_pass 192.148.0.3:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意: 192.148.0.3 是 fpm 的子網 ip, 9000 是 fpm 默認的端口, /var/www 是一會要掛載到 fpm 容器中的網站路徑。
創建網絡 mynginx :
docker network create --driver=bridge --subnet=192.148.0.0/16 mynginx
指定網絡 mynginx 啟動 nginx 容器:
docker run --name nginx -d --rm -v /home/txl/www:/usr/share/nginx/html \ -v /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf \ --network mynginx -p 80:80 nginx:1.15.1-alpine
2.3 運行 Fpm 容器
指定網絡 mynginx 以及指定子網 ip 192.148.0.3 :
docker run --name fpm -d --rm -v /home/txl/www:/var/www \ --network mynginx --ip 192.148.0.3 php:7.2.2-fpm-alpine
訪問:
2.4 使用 Compose 編排
1)compose file 配置文件
創建新文件 docker-compose.yml,根據之前的啟動命令編輯:
version: "3" services: fpm: image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mynginx: ipv4_address: 192.148.0.3 nginx: image: nginx:1.15.1-alpine container_name: nginx ports: - "80:80" volumes: - /home/txl/www:/usr/share/nginx/html/ - /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf networks: mynginx: ipv4_address: 192.148.0.2 networks: mynginx: driver: bridge ipam: config: - subnet: 192.148.0.0/16
2)啟動
進入 docker-compose.yml 文件所在路徑,執行:
docker-compose [-p 指定名稱] up -d
啟動成功~
三、FPM 容器安裝 PHP 擴展
一般情況下需要兩個步驟:設置鏡像源(/etc/apk/repositories)和執行安裝命令(docker-php-ext-install 標准擴展)。如果直接進入容器操作的話,一旦容器刪除所有的修改全都會丟失,因此可以:
- 創建 dockerfile 在源鏡像的基礎上構建新鏡像。
- 在 docker-compose 文件中的 build 節點通過指定 dockerfile 進行構建。
以第二種方法為例安裝 pdo_mysql 擴展:在 compose 目錄下創建 build 文件,新建一個 dockerfile 文件 phpfpm:
FROM php:7.2.2-fpm-alpine RUN echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories && \ echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories RUN apk update && apk upgrade RUN docker-php-ext-install pdo_mysql
修改 docker-compose.yml:
version: "3" services: fpm: build: context: ./build dockerfile: phpfpm image: php:7.2.2-fpm-alpine container_name: fpm volumes: - /home/txl/www:/var/www networks: mywebnet: ipv4_address: 192.158.0.2 httpd: image: httpd:2.4.33-alpine container_name: httpd ports: - "80:80" volumes: - /home/txl/www:/usr/local/apache2/htdocs/ - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf networks: mywebnet: ipv4_address: 192.158.0.3 networks: mywebnet: driver: bridge ipam: config: - subnet: 192.158.0.0/16
然后執行 docker-compose build service名稱 :
docker-compose build fpm
最后刪除並重啟 Fpm 容器:
docker-compose stop fpm docker-compose rm fpm docker-compose up -d fpm