Docker構建PHP環境

1、多容器運行 PHP+fpm+apache

1.1 安裝相關鏡像

fpm 鏡像地址:https://dev.aliyun.com/detail.html?repoId=1250php

apache 鏡像地址:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.51.151b5aaaSVeZ8h&repoId=1220html

儘量的使用基於 alpine 的鏡像,體積很小。mysql

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/ 下:nginx

運行 Apache 容器:git

docker run -d -p 80:80 --rm --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ httpd:2.4.33-alpine  

這時服務器已經具有訪問 html 頁面的能力了:github

可是還不能識別 PHP 腳本,因此咱們須要修改相關配置。通常須要準備一個 Apache 配置文件,或者從容器中拷貝一個默認的,而後掛載就能夠了。根據鏡像說明可知,配置文件默認存放在 /usr/local/apache2/conf/httpd.conf:web

拷貝到宿主機中 /home/txl/conf/httpd.conf 下:sql

docker cp httpd:/usr/local/apache2/conf/httpd.conf /home/txl/conf

 修改配置,開啓以下內容:docker

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

 添加虛擬主機站點:apache

<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]

2、多容器運行 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

啓動成功~

3、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
相關文章
相關標籤/搜索