通常翅溺,一個(gè)完整的應(yīng)用都是由多個(gè)容器組合而成旅敷,我們可以手動(dòng)的去單獨(dú)啟動(dòng)和管理每個(gè)容器缰趋,但是這樣會(huì)很不方便总放。Docker Compose是這樣的一個(gè)應(yīng)用,它可以方便的幫助我們構(gòu)建谷浅、運(yùn)行和擴(kuò)展一套由多個(gè)容器組成的應(yīng)用扒俯。
1. 安裝Docker Compose
參考Docker的github下載程序:
curl -L https://github.com/docker/compose/releases/download/1.23.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
參考Install command completion添加docker-compose命令自動(dòng)補(bǔ)全功能:
# 先安裝CentOS自己的bash-completion
[root@node2 ~]# yum -y install bash-completion
# 添加Docker Compose的command completion
[root@node2 ~]# curl -L https://raw.githubusercontent.com/docker/compose/1.23.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 13238 100 13238 0 0 9156 0 0:00:01 0:00:01 --:--:-- 9161
[root@node2 ~]# source /etc/bash_completion.d/docker-compose
2. 使用docker-compose
Docker Compose通過(guò)讀取docker-compose.yml配置文件奶卓,來(lái)啟動(dòng)相關(guān)的服務(wù)。一個(gè)docker-compose.yml配置示例如下:
version: "3.5"
services:
web:
image: fundamentalsofdocker/ch08-web:1.0
ports:
- 3000:3000
db:
image: fundamentalsofdocker/ch08-db:1.0
volumes:
- pets-data:/var/lib/postgresql/data
volumes:
pets-data:
上面的配置解釋如下:
- version:不同的docker compose有不同的格式撼玄,這里我們使用3.5版本格式夺姑。
- services:服務(wù),通常由多個(gè)容器組合而成掌猛。
- web:容器的名稱盏浙。同時(shí)還指定該容器使用哪個(gè)鏡像(該鏡像需要存在于倉(cāng)庫(kù)中,這里是docker hub)荔茬,開(kāi)放的端口废膘。
- db:數(shù)據(jù)庫(kù)容器的名稱。同時(shí)也指定了相應(yīng)的鏡像慕蔚,以及掛載的數(shù)據(jù)卷與容器對(duì)應(yīng)目錄的關(guān)系丐黄。
- volumes:創(chuàng)建的數(shù)據(jù)卷。
Tips:容器之間可以通過(guò)上面定義的容器名孔飒,來(lái)進(jìn)行數(shù)據(jù)通信交互孵稽。
進(jìn)入到該docker-compose.yml所在的目錄,這里是compose-test
目錄十偶,通過(guò)docker-compose up
命令啟動(dòng)服務(wù):
[root@node2 compose-test]# docker-compose up
Creating network "compose-test_default" with the default driver
Creating volume "compose-test_pets-data" with default driver
Pulling web (fundamentalsofdocker/ch08-web:1.0)...
1.0: Pulling from fundamentalsofdocker/ch08-web
605ce1bd3f31: Pull complete
188ade417c9f: Pull complete
ad8771290e5e: Pull complete
Pulling db (fundamentalsofdocker/ch08-db:1.0)...
Pulling db (fundamentalsofdocker/ch08-db:1.0)...
1.0: Pulling from fundamentalsofdocker/ch08-db
ff3a5c916c92: Pull complete
ac3385cd756f: Pull complete
Creating compose-test_web_1_1c7e1b7ce98c ... done
Creating compose-test_db_1_14e7442081f6 ... done
Attaching to compose-test_web_1_ec5cf32a5b62, compose-test_db_1_785716b0e082
...
db_1_785716b0e082 | 2018-10-31 01:56:00.122 UTC [20] LOG: database system was shut down at 2018-10-31 01:55:42 UTC
db_1_785716b0e082 | 2018-10-31 01:56:00.144 UTC [1] LOG: database system is ready to accept connections
web_1_ec5cf32a5b62 | Listening at 0.0.0.0:3000
web_1_ec5cf32a5b62 | Connecting to DB
web_1_ec5cf32a5b62 | Connected!
...以上輸出內(nèi)容省略了部分
簡(jiǎn)單說(shuō)明一下:上面的過(guò)程分兩步,一是拉取鏡像园细。二是啟動(dòng)服務(wù)惦积,并打印日志。
啟動(dòng)完成后猛频,通過(guò)瀏覽器訪問(wèn)http://主機(jī)IP:3000/pet
狮崩,可以查看服務(wù)。
按Ctrl+C可結(jié)束服務(wù)并退出鹿寻。再次運(yùn)行時(shí)睦柴,速度會(huì)快很多,因?yàn)椴挥迷倮$R像毡熏,相關(guān)的數(shù)據(jù)卷也已經(jīng)創(chuàng)建完畢坦敌。
將服務(wù)放在后臺(tái)運(yùn)行:
[root@node2 compose-test]# docker-compose up -d
Starting compose-test_web_1_ec5cf32a5b62 ... done
Starting compose-test_db_1_785716b0e082 ... done
查看docker compose進(jìn)程:
[root@node2 compose-test]# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------
compose-test_db_1_785716b0e082 docker-entrypoint.sh postgres Up 5432/tcp
compose-test_web_1_ec5cf32a5b62 /bin/sh -c node src/server.js Up 0.0.0.0:3000->3000/tcp
關(guān)閉服務(wù):
[root@node2 compose-test]# docker-compose down
Stopping compose-test_db_1_785716b0e082 ... done
Stopping compose-test_web_1_ec5cf32a5b62 ... done
Removing compose-test_db_1_785716b0e082 ... done
Removing compose-test_web_1_ec5cf32a5b62 ... done
Removing network compose-test_default
Tips:你會(huì)發(fā)現(xiàn)停止web服務(wù)總是比較慢,那是因?yàn)閐b服務(wù)能夠正確的響應(yīng)系統(tǒng)發(fā)出的SIGTERM信號(hào)痢法,正常停止服務(wù)狱窘。而web不會(huì),所以docker在10秒超時(shí)后财搁,強(qiáng)制停用了它蘸炸。
3. 可伸縮的docker compose服務(wù)
當(dāng)我們上面的服務(wù)中,一個(gè)web服務(wù)形成瓶頸的時(shí)候尖奔,我們可以快速地的擴(kuò)充幾個(gè)web服務(wù)出來(lái)搭儒。命令如下:
[root@node2 compose-test]# docker-compose up --scale web=3
Creating network "compose-test_default" with the default driver
Creating volume "compose-test_pets-data" with default driver
WARNING: The "web" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Creating compose-test_db_1_4a3325f40a66 ... done
Creating compose-test_web_1_34a682b911cd ... done
Creating compose-test_web_2_d1270f3e5ab6 ... error
Creating compose-test_web_3_4eee803fe1dc ... error
ERROR: for compose-test_web_2_d1270f3e5ab6 Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_2_b339ca2150cf (f9b0c19850ea1218bfa73e96df65e8c048b2936504c2f07baa85a66bbaa304e0): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: for compose-test_web_3_4eee803fe1dc Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_3_af3222197ecd (101305704ef4a4da659f0aaa53931a8ef7aa103e7a9fc4b3806c98f7a76a2911): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint compose-test_web_2_b339ca2150cf (f9b0c19850ea1218bfa73e96df65e8c048b2936504c2f07baa85a66bbaa304e0): Bind for 0.0.0.0:3000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
我們發(fā)現(xiàn)當(dāng)創(chuàng)建第二和第三個(gè)web服務(wù)的時(shí)候穷当,發(fā)生了錯(cuò)誤,主要是因?yàn)槎丝跊_突問(wèn)題淹禾。我們?cè)?code>docker-compose.yml中指定端口映射的部分進(jìn)行修改馁菜,讓主機(jī)隨機(jī)啟動(dòng)三個(gè)端口進(jìn)行映射即可:
version: "3.5"
services:
web:
image: fundamentalsofdocker/ch08-web:1.0
ports:
- 3000
db:
image: fundamentalsofdocker/ch08-db:1.0
volumes:
- pets-data:/var/lib/postgresql/data
volumes:
pets-data:
再次啟動(dòng):
# 先關(guān)閉剛才啟動(dòng)的(雖然沒(méi)有完全啟動(dòng)成功)
[root@node2 compose-test]# docker-compose down
[root@node2 compose-test]# docker-compose up -d --scale web=3
Creating network "compose-test_default" with the default driver
Creating compose-test_db_1_6a526a0954dc ... done
Creating compose-test_web_1_5f57a97855bf ... done
Creating compose-test_web_2_37757fe7fff7 ... done
Creating compose-test_web_3_5db14966adca ... done
查看:
[root@node2 compose-test]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------
compose-test_db_1_a2388d8552ee docker-entrypoint.sh postgres Up 5432/tcp
compose-test_web_1_5445bb723cbe /bin/sh -c node src/server.js Up 0.0.0.0:32772->3000/tcp
compose-test_web_2_9253be834670 /bin/sh -c node src/server.js Up 0.0.0.0:32773->3000/tcp
compose-test_web_3_c4178b44052d /bin/sh -c node src/server.js Up 0.0.0.0:32774->3000/tcp