使用 docker-compose 安裝 php 運行環境 —— network 的方式


官方手冊明確說明,容器互聯不要采用 link 的方式,而應該采用 network 的方式。

 

以下演示的以 centOS 上為例,如果你在 mac 上,就需要注意一下路徑問題,mac 下一班把文件什么的放在用戶目錄下。

直接上步驟:

1、centOS下需要升級 yum —— 不然可能會有一些神經病的錯誤發生

yum update

2、將已經寫好的 yml 包以及 Dockerfile 等下載到根目錄:

git clone https://github.com/lftm1111/docker-compose-php-network.git

3、進入 docker-composer-php 目錄,即 docker-compose.yml 所在的目錄

cd docker-compose-php-network

4、配置並修改.env 文件

cp .env.example .env
vim .env

—— .env 配置建議:

復制代碼
// mac上
DIR_WWW=/Users/linfeng/docker/data/www/
DIR_REDIS_DATA=/Users/linfeng/docker/data/redis/
DIR_MYSQL_DATA=/Users/linfeng/docker/data/mysql/

// centOS 上
DIR_WWW=/data/www/
DIR_REDIS_DATA=/data/redis/
DIR_MYSQL_DATA=/data/mysql/
復制代碼

5、運行 docker-compose:

docker-compose up -d

6、如果要啟動的是里面的 docker-compose.build.yml 文件,則執行:

docker-compose -f docker-compose.build.yml up -d

—— 關於docker-compose.yml 文件和 docker-compose.build.yml 的區別,請看下面的特別說明

—— 好了,執行成功后,會有四個容器在運行。配置虛擬主機和項目,這個都不知道那就沒辦法了。

7、配置虛擬主機並重啟 nginx 容器服務:

docker-compose restart nginx

 

 // 虛擬主機示例:

server {
    listen       80; set $root /data/www/laravel/public; server_name laravel.xxx.com; root $root; index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*) /index.php?$1 last; } location ~ index\.php { root $root; fastcgi_pass phpfpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name; include fastcgi_params; } }

 

// nginx的配置參數含義: 

1、fastcgi_pass :這個是配置的【地址:端口號】。

// 以前未采用容器的時候,就在本機:
127.0.0.1:9000

// 采用容器下的三種方式
172.17.0.2:9000    //容器 IP:端口,請參考手動安裝的文章
phpfpm:9000    // 服務名:端口,請參考 link 安裝
fpm:9000    // 服務別名:端口,請參考本篇文章

 

2、fastcgi_param :這個是配置的是 phpfpm 找到 php 文件的路徑。

我們的配置是:$root$fastcgi_script_name;  ==>> 說明,phpfpm 能夠在容器內的 $root 路徑下找到 index.php 。而我們掛載的時候,剛好把 volume 兩邊設置成了一樣的路徑。

 

// 以 DIR_WWW 配置為/data/www 為例

—— 項目目錄:/data/www

—— 虛擬主機配置目錄:/docker-compose-php/conf/nginx/conf.d

 

 

// 特別說明:

我們下載下來的包里面有兩個文件,其中只有一處差別,在 phpfpm 那里,分別如下:

docker-compose.yml 部分:

phpfpm:
    image: raven666/ct-phpfpm:lastest
    container_name: myphpfpm
    expose:
      - "9000"

docker-compose.build.yml 部分:

復制代碼
phpfpm:
    image: raven666/ct-phpfpm:latest
    container_name: myphpfpm
    build:
      context: .
      dockerfile: Dockerfile
    expose:
      - "9000"
復制代碼

—— 因為 docker-compose.yml 文件的每個服務都需要指定鏡像,指定的方式有兩種:

1、直接指定 image,會從 dockerhub 拉取。

2、指定 build ,即指定本地的 Dockerfile文件進行構建鏡像。

那么,docker-compose.build.yml 中指定了 build,image 參數表示的是構建后的名字。build.yml 的是指定了構建 phpfpm 鏡像的文件。

—— 所以,第一種是直接拉取叫做 raven666/ct-phpfpm:v1 的鏡像,其實這個鏡像就是我構建后傳到 dockerhub 的

—— 第二種,就是使用本地文件 Dockerfile 重新構建一次這個 phpfpm 鏡像,並在本地命名為 raven666/ct-phpfpm:v1

 

 

  

其中,我們的 docker-compose.yml 文件如下:

version: '3'
services:
  nginx:
    image: nginx:1.15-alpine
    container_name: mynginx
    ports:
      - "80:80"
    volumes:
      - ${DIR_WWW}:${DIR_WWW}:rw
      - ./conf/nginx/conf.d:/etc/nginx/conf.d/:ro
      - ./conf/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./log/nginx/:/var/log/nginx/:rw
    networks: - front

  phpfpm:
    image: raven666/ct-phpfpm:latest
    container_name: myphpfpm
    expose:
      - "9000"
    volumes:
      - ${DIR_WWW}:${DIR_WWW}:rw
      - ./conf/php/php.ini:/usr/local/etc/php/php.ini:ro
      - ./conf/php/php-fpm.d/www.conf:/usr/local/etc/php-fpm.d/www.conf:rw
      - ./conf/supervisor/conf.d:/etc/supervisor/conf.d/:ro
      - ./log/php-fpm/:/var/log/php-fpm/:rw
      - ./log/supervisor/:/var/log/supervisor/:rw
    command: supervisord -n
    networks: - front - backend
      
  mysql:
    image: mysql:5.7
    container_name: mymysql
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - ./conf/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro
      - ${DIR_MYSQL_DATA}:/var/lib/mysql/:rw
      - ./log/mysql/:/var/log/mysql/:rw
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${MYSQL_DATABASE}" networks: - backend

  redis:
    image: redis:latest
    container_name: myredis
    env_file: .env
    command: redis-server --requirepass "${REDIS_PASSWORD}" --appendonly yes
    ports:
      - "6379:6379"
    volumes:
      - ${DIR_REDIS_DATA}:/data
  networks: - backend 
networks:
  front:
  backend:

———— 這里我們需要特別說明,各個服務(service)的網橋如下:

nginx 加入 front 網絡(網橋)

phpfpm 加入 front 和 backend 網絡(網橋)

mysql、redis都加入了 backend 網絡(網橋)

—— 意味着,phpfpm 技能連接 nginx,也能連接 mysql 和 redis (在同一個網絡里,容器是能夠互相聯通的。)

—— 那么,他們是怎么連接的呢?我們的虛擬主機配置給出了答案:phpfpm:9000,就是通過【服務名:端口】 或者【別名:端口】就可以連接。當然,這里我們並沒有設置端口。

 

// 驗證使用 network 的容器互聯:

// 1、登錄 myphpfpm
docker exec -it nginx bash
// 2、安裝 ping
apt-get install inetutils-ping
// 3、ping mysql 容器
ping mysql

——返回 :
PING mysql (172.19.0.4): 56 data bytes
64 bytes from 172.19.0.4: icmp_seq=0 ttl=64 time=0.177 ms
64 bytes from 172.19.0.4: icmp_seq=1 ttl=64 time=0.191 ms
64 bytes from 172.19.0.4: icmp_seq=2 ttl=64 time=0.221 ms

—— 說明ping 通了,並且mysql 容器目前的 IP 地址是172.19.0.4

 

 

總結,我們可以總共有三種容器互聯的方式:

第一種:IP+端口的方式,這種方式我們在centOS 手動 Docker 安裝 LNMP 環境時候提到。

第二種:指定容器的 link,這種單向性和不可維護性,我們不建議使用,在使用 docker-compose 安裝 php 運行環境 —— link 的方式中有提到。

—— 請注意:前面兩種已經不建議使用了。

第三種:通過 network 的方式,我們通過本篇文章闡述了。至於網絡基礎部分的內容,請查看我的系列文章網絡基礎概念docker 的 link 和 network 網絡互連問題

 

 

 

 

 

 

 

 

 

 

——————占位符

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM