docker入門(7)--docker compose

通常翅溺,一個(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稀拐,隨后出現(xiàn)的幾起案子火邓,更是在濱河造成了極大的恐慌,老刑警劉巖德撬,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铲咨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蜓洪,警方通過(guò)查閱死者的電腦和手機(jī)纤勒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)隆檀,“玉大人摇天,你說(shuō)我怎么就攤上這事】致兀” “怎么了泉坐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)裳仆。 經(jīng)常有香客問(wèn)我腕让,道長(zhǎng),這世上最難降的妖魔是什么歧斟? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任纯丸,我火速辦了婚禮,結(jié)果婚禮上静袖,老公的妹妹穿的比我還像新娘觉鼻。我一直安慰自己,他們只是感情好队橙,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布坠陈。 她就那樣靜靜地躺著,像睡著了一般捐康。 火紅的嫁衣襯著肌膚如雪畅姊。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,785評(píng)論 1 314
  • 那天吹由,我揣著相機(jī)與錄音若未,去河邊找鬼。 笑死倾鲫,一個(gè)胖子當(dāng)著我的面吹牛粗合,可吹牛的內(nèi)容都是我干的萍嬉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼隙疚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壤追!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起供屉,我...
    開(kāi)封第一講書(shū)人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤行冰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后伶丐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體悼做,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年哗魂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛走。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡录别,死狀恐怖朽色,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情组题,我是刑警寧澤葫男,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站崔列,受9級(jí)特大地震影響腾誉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜峻呕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趣效。 院中可真熱鬧瘦癌,春花似錦、人聲如沸跷敬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)西傀。三九已至斤寇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拥褂,已是汗流浹背娘锁。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饺鹃,地道東北人莫秆。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓间雀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親镊屎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子惹挟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容