官方手冊明確說明,容器互聯不要采用 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 網絡互連問題】
——————占位符