前段時間發(fā)布幾篇文章,講述了使用docker創(chuàng)建容器,且與之連通開發(fā)的使用場景。
但使用的時候也有諸多不便。例如假設(shè)你要部署一套lnmp環(huán)境,就需要開啟nginx、PHP、mysql三個鏡像,隨著深入的學(xué)習(xí),還要隨之而來的添加redis容器、MQ容器等。試想一下,每次開機(jī)都要一頓操作,開啟各個容器,這是一件很痛苦的事情。
那么有沒有什么快捷方式,一件啟動來解放我們的雙手呢?
docker提供了docker-compose這個工具來輔助我們。
Mac在安裝docker的時候,自動給我們安裝好了docker-compose,啟動docker后,在命令行中直接輸入docker-compose,出現(xiàn)如下就說明已經(jīng)安裝好了。

另外,其他環(huán)境要單獨(dú)安裝也很簡單,下面附屬鏈接
https://docs.docker.com/compose/install/
簡單介紹下Docker-compose
Compose是 Docker 的服務(wù)編排工具,主要用來構(gòu)建基于Docker的復(fù)雜應(yīng)用Compose 通過一個配置文件來管理多個 -Docker 容器,非常適合組合使用多個容器進(jìn)行開發(fā)的場景。
docker-compose 是編排容器的。例如,你有一個 php 鏡像,一個 mysql 鏡像,一個 nginx 鏡像。
如果沒有 docker-compose ,那么每次啟動的時候,你需要敲各個容器的啟動參數(shù),環(huán)境變量,容器命名,指 定不同容器的鏈接參數(shù)等等一系列的操作,相當(dāng)繁瑣。
而用了 docker-composer 之后,你就可以把這些命令一次性寫在 docker-composer.yml 文件中,以后每次啟動這一整個環(huán)境(含3個容器)的時候,你只要敲一個 docker-composer up命令就ok了。
dockerfile 的作用是從無到有的構(gòu)建鏡像。它包含安裝運(yùn)行所需的環(huán)境、程序代碼等。這個創(chuàng)建過程就是使用 dockerfile 來完成的。 Dockerfile -為 docker build 命令準(zhǔn)備的,用于建立一個獨(dú)立的 image ,在 docker-compose 里也可以用來實時 build
實踐
Docker-compose最主要的就是docker-compose.yml文件,通過他就可以快速實現(xiàn)編排容器。
現(xiàn)在搭建一個分布式的環(huán)境:一個nginx容器做反向代理、一個consul容器實現(xiàn)熱加載機(jī)器、兩個swoft容器
因為mac環(huán)境的問題,沒法訪問容器內(nèi)的ip,所以在此就不使用docker的network來部署。直接開放端口映射來進(jìn)行訪問。
每條命令后面都注釋了說明。
# 編排php,redis,nginx容器
version: "3.6" # 確定docker-composer文件的版本
services: # 代表就是一組服務(wù) - 簡單來說一組容器
swoft_110: # 這個表示服務(wù)的名稱,課自定義; 注意不是容器名稱
image: swoft # 指定容器的鏡像文件
ports: # 配置容器與宿主機(jī)的端口
- "18306:18306"
container_name: swoft_al_fpm_110 # 這是容器的名稱
# networks: ## 引入外部預(yù)先定義的網(wǎng)段
# swoft_consul:
# ipv4_address: 172.22.22.110 #設(shè)置ip地址
privileged: true # 執(zhí)行特殊權(quán)限的命令
volumes: # 配置數(shù)據(jù)掛載
- /usr/local/var/www/srm/swoft:/var/www/swoft
working_dir: /var/www/swoft #工作目錄
swoft_120: # 這個表示服務(wù)的名稱,課自定義; 注意不是容器名稱
image: swoft # 指定容器的鏡像文件
ports: # 配置容器與宿主機(jī)的端口
- "18307:18306"
container_name: swoft_al_fpm_120 # 這是容器的名稱
privileged: true # 執(zhí)行特殊權(quán)限的命令
volumes: # 配置數(shù)據(jù)掛載
- /usr/local/var/www/srm/swoft:/var/www/swoft
working_dir: /var/www/swoft #工作目錄
nginx: # 這個表示服務(wù)的名稱,課自定義; 注意不是容器名稱
image: nginx1.17 # 指定容器的鏡像文件
ports: # 配置容器與宿主機(jī)的端口
- "81:80"
# networks: ## 引入外部預(yù)先定義的網(wǎng)段
# swoft_consul:
# ipv4_address: 172.22.22.20 #設(shè)置ip地址
container_name: nginx1.17 # 這是容器的名稱
volumes: # 配置數(shù)據(jù)掛載
- /usr/local/var/www/srm/03/nginx:/nginx
consul: # 這個表示服務(wù)的名稱,課自定義; 注意不是容器名稱
image: consul1.4 # 指定容器的鏡像文件
ports: # 配置容器與宿主機(jī)的端口
- "8500:8500"
# networks: ## 引入外部預(yù)先定義的網(wǎng)段
# swoft_consul:
# ipv4_address: 172.22.22.30 #設(shè)置ip地址
container_name: consul1.4 # 這是容器的名稱
command: ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=127.0.0.1 -ui -client=0.0.0.0
# 設(shè)置網(wǎng)絡(luò)模塊
# networks:
# # 自定義網(wǎng)絡(luò)
# swoft_consul:
# driver: bridge
# ipam: #定義網(wǎng)段
# config:
# - subnet: "172.22.22.0/24"
文件中使用的image自行去pull,對應(yīng)的文件目錄自己針對自己環(huán)境更改。

docker-compose.yml文件位置沒有要求,但是在構(gòu)建的時候必須在yml文件所在的目錄下執(zhí)行,且只能有一個文件
- 開始構(gòu)建
docker-compose up
默認(rèn)是前臺運(yùn)行并打印日志到控制臺。如果想后臺運(yùn)行,可以加參數(shù) -d

第一次構(gòu)建的時候,會比較慢,后面再啟動的時候就會很快了。
- 查看docker-compose狀態(tài)
docker-compose ps
# 亦或者
docker ps

- 停止服務(wù)
docker-compose stop
# 亦或者
docker-compose dwon

- 重啟服務(wù)
docker-compose restart

至此就可以訪問,開始愉快的coding
