Docker Compose多容器部署

前言

談到微服務(wù)的話題加勤,技術(shù)上我們往往會(huì)涉及到多服務(wù)、多容器的部署與管理。
Docker 有三個(gè)主要的作用:Build, Ship和Run宙枷。使用docker compose我們可以在Run的層面解決很多實(shí)際問題粟害,如:通過(guò)創(chuàng)建compose(基于YUML語(yǔ)法)文件蕴忆,在這個(gè)文件上面描述應(yīng)用的架構(gòu),如使用什么鏡像悲幅、數(shù)據(jù)卷套鹅、網(wǎng)絡(luò)站蝠、綁定服務(wù)端口等等,然后再用一條命令就可以管理所有的服務(wù)(如啟動(dòng)卓鹿、停止菱魔、重啟、日志監(jiān)控等等)吟孙。

1澜倦、docker-compose是什么

Compose是定義和運(yùn)行多容器Docker應(yīng)用程序的工具。 使用Compose杰妓,您可以使用YAML文件來(lái)配置應(yīng)用程序的docker服務(wù)藻治。 然后,使用單個(gè)命令巷挥,您可以創(chuàng)建并啟動(dòng)配置中的所有docker服務(wù)桩卵。

Compose適用于所有環(huán)境:生產(chǎn),開發(fā)倍宾,測(cè)試以及CI工作流程吸占。使用Compose基本上是一個(gè)三步過(guò)程:

  • 使用Dockerfile定義應(yīng)用程序的環(huán)境,以便在任何地方進(jìn)行復(fù)制凿宾。
  • 在docker-compose.yml中定義組成應(yīng)用程序的服務(wù)矾屯,以便它們可以在隔離的環(huán)境中一起運(yùn)行。
  • 運(yùn)行docker-compose并撰寫開始并運(yùn)行你的整個(gè)應(yīng)用程序初厚。

2件蚕、談?wù)勅萜骶幣排c部署

Docker有很多優(yōu)勢(shì),但對(duì)于運(yùn)維或開發(fā)者來(lái)說(shuō)产禾,Docker最大的有點(diǎn)在于它提供了一種全新的發(fā)布機(jī)制排作。這種發(fā)布機(jī)制,指的是我們使用Docker鏡像作為統(tǒng)一的軟件制品載體亚情,使用Docker容器提供獨(dú)立的軟件運(yùn)行上下文環(huán)境妄痪,使用Docker Hub提供鏡像統(tǒng)一協(xié)作,最重要的是該機(jī)制使用Dockerfile定義容器內(nèi)部行為和容器關(guān)鍵屬性來(lái)支撐軟件運(yùn)行楞件。

Dockerfile作為整個(gè)機(jī)制的核心衫生。這是一個(gè)非常了不起的創(chuàng)新,因?yàn)樵贒ockerfile中土浸,不但能夠定義使用者在容器中需要進(jìn)行的操作罪针,而且能夠定義容器中運(yùn)行軟件需要的配置,于是軟件開發(fā)和運(yùn)維終于能夠在一個(gè)配置文件上達(dá)成統(tǒng)一黄伊。運(yùn)維人員使用同一個(gè)Dockerfile能在不同的場(chǎng)合下“重現(xiàn)”與開發(fā)者環(huán)境中一模一樣的運(yùn)行單元(Docker容器)出來(lái)泪酱。

3、為什么要使用Compose

先來(lái)想一下我們平時(shí)是怎么樣使用docker的?把它進(jìn)行拆分一下:

1墓阀、docker search 鏡像毡惜,是不是先查找一個(gè)鏡像;
2斯撮、docker run -itd 鏡像名稱 经伙,然后在運(yùn)行這個(gè)鏡像;
3吮成、然后如果你要在運(yùn)行第二個(gè)鏡像橱乱、第三個(gè)鏡像.....等等鏡像辜梳,你是不是又要docker search粱甫、docker run運(yùn)行。

上面“ docker run it 鏡像名稱 ”這只是最小的動(dòng)作作瞄, 如果你要映射硬盤茶宵,設(shè)置nat網(wǎng)絡(luò)或者映射端口等等…你就要做更多的 docker 操作, 這顯然是非常沒有效率的宗挥,況且如果你要大規(guī)模部署乌庶,是不是覺得就很麻煩了。

如果將上面的操作寫在docker-compose.yml里面契耿。你只需要寫好后只運(yùn)行一句:docker-compose up -d就好了

4瞒大、了解下編排和部署

編排,即orchestration搪桂,它根據(jù)被部署的對(duì)象之間的耦合關(guān)系透敌,以及被部署對(duì)象環(huán)境的依賴,制定部署流程中各個(gè)動(dòng)作的執(zhí)行順序踢械,部署過(guò)程所需要的依賴文件的存儲(chǔ)位置和獲取方式酗电,以及如何驗(yàn)證部署成功。這些信息都會(huì)在編排工具中以指定的格式(比如配置文件或者特定的代碼)來(lái)要求運(yùn)維人員定義并保存起來(lái)内列,從而保證這個(gè)流程能夠隨時(shí)在全新的環(huán)境中可靠有序地重現(xiàn)出來(lái)撵术。

部署,即deployment话瞧,它是指按照編排所指定的內(nèi)容和流程 嫩与,在目標(biāo)機(jī)器上執(zhí)行編排指定環(huán)境初始化,存放指定的依賴和文件交排,運(yùn)行指定的部署動(dòng)作蕴纳,最終按照編排中的規(guī)則來(lái)確認(rèn)聯(lián)署成功。

而在Compose的世界里个粱,編排和部署的組合結(jié)果古毛,就是一朵“容器云”。

docker-compose.yml

image.png

Services:

  • 一個(gè)service代表一個(gè)container,這個(gè)container可以通過(guò)dockerhub的image創(chuàng)建稻薇,或者通過(guò)本地的Dockerfile build出來(lái)的image創(chuàng)建出來(lái)嫂冻。
  • Service的啟動(dòng)類似docker run,我們可以給其指定network和volume塞椎,所以可以給service指定network和Volume的引用

docker-compose中YAML常用的字段:

image.png

安裝docker-compose

下載最新版本安裝桨仿,下載時(shí)間可能比較長(zhǎng)

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

將可執(zhí)行權(quán)限應(yīng)用于docker-compose:

sudo chmod +x /usr/local/bin/docker-compose

驗(yàn)證docker-compose是否下載成功

[root@192 ~]# docker-compose --version
docker-compose version 1.25.0, build 0a186604

docker-compose用法

Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

docker-compose命令

build 構(gòu)建或重建服務(wù)
help 命令幫助
kill 殺掉容器
logs 顯示容器的輸出內(nèi)容
port 打印綁定的開放端口
ps 顯示容器
pull 拉取服務(wù)鏡像
restart 重啟服務(wù)
rm 刪除停止的容器
run 運(yùn)行一個(gè)一次性命令
scale 設(shè)置服務(wù)的容器數(shù)目
start 開啟服務(wù)
stop 停止服務(wù)
up 創(chuàng)建并啟動(dòng)容器
更多查看幫助 docker-compose -h

一鍵部署lnmp平臺(tái)

我們先來(lái)看下/compose_lnmp目錄下的docker-compose.yml文件:

[root@ganbing compose_lnmp]# ls
docker-compose.yml  mysql  nginx  php  wwwroot

[root@ganbing compose_lnmp]# cat docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 80:80
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  php:
    hostname: php
    build:
      context: ./php
      dockerfile: Dockerfile
    networks:
      - lnmp
    volumes:
      - ./wwwroot:/usr/local/nginx/html

  mysql:
    hostname: mysql
    image: mysql:5.6
    ports:
      - 3306:3306
    networks:
      - lnmp
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
      MYSQL_USER: ganbing
      MYSQL_PASSWORD: ganbing123

networks:
  lnmp:
    driver: bridge

可以看到一份標(biāo)準(zhǔn)配置文件應(yīng)該包含 version、services案狠、networks 三大部分服傍,共有三級(jí)標(biāo)簽,每一級(jí)都是縮進(jìn)兩個(gè)空格骂铁。下面來(lái)詳細(xì)說(shuō)明一下里面的內(nèi)容:

1吹零、version: '3'
這是定義compose的版本號(hào)為version 3,可以參考官方文檔詳細(xì)了解具體有哪些版本 https://docs.docker.com/compose/compose-file/

2拉庵、services:
nginx:這是services下面的二級(jí)標(biāo)簽灿椅,名字用戶自己定義,它將是服務(wù)運(yùn)行后的名稱钞支;
hostname: nginx 這是定義容器的主機(jī)名茫蛹,將寫入到/etc/hostname中;
build:
?context: ./nginx 指定nginx服務(wù)的上下文路徑烁挟;
?dockerfile:Dockerfile 指定通過(guò)上面指定路徑中的Dockerilfe來(lái)構(gòu)建婴洼;
ports:
?- 80:80 端口映射沒什么好說(shuō)的;
networks:
?-lnmp 指定的網(wǎng)絡(luò)環(huán)境
volumes:把宿主機(jī)的/wwwroot目錄綁定到容器中的/usr/local/nginx/html目錄撼嗓;

php:這個(gè)二級(jí)標(biāo)簽服務(wù)和下面的內(nèi)容跟nginx差不多柬采;
mysql:這個(gè)二級(jí)標(biāo)簽服務(wù)也和nginx、php差不多静稻,唯一不同的是多了個(gè)images標(biāo)簽警没、還有定義了些環(huán)境變量。
image: mysql:5.6 它是通過(guò)mysql:5.6鏡像來(lái)構(gòu)建mysql服務(wù)器振湾,前面nginx杀迹、php都指定了上下文通過(guò)Dockerfile來(lái)構(gòu)建的。
environment:
?MYSQL_ROOT_PASSWORD:定義root用戶密碼變量為123456押搪;
?MYSQL_DATABASE:定義了數(shù)據(jù)變量為wordpress树酪;
?MYSQL_USER:定義了普通用戶變量為ganbing;
?MYSQL_PASSWORD:定義了普通用戶密碼變量為ganbing123;

3、networks:
???lnmp: 相當(dāng)于執(zhí)行docker network create lnmp命令了大州;

最后來(lái)運(yùn)行docker-compose命令來(lái)啟動(dòng):

[root@ganbing /]# cd compose_lnmp/

[root@ganbing compose_lnmp]# docker-compose  -f docker-compose.yml  up -d

來(lái)查看一下是否啟動(dòng)完成:

[root@ganbing compose_lnmp]# docker-compose ps
       Name                      Command               State           Ports          
-------------------------------------------------------------------------------------
composelnmp_mysql_1   docker-entrypoint.sh --cha ...   Up      0.0.0.0:3306->3306/tcp 
composelnmp_nginx_1   ./sbin/nginx -g daemon off;      Up      0.0.0.0:80->80/tcp     
composelnmp_php_1     ./sbin/php-fpm -c /usr/loc ...   Up      9000/tcp    

從上面可以看出這3個(gè)服務(wù)都是UP狀態(tài)续语,運(yùn)行 docker-compose ps必須要在有docker-compose.yml文件目錄下執(zhí)行才可以。

總結(jié)思考

大家想想厦画,僅僅使用Compose疮茄,就可以構(gòu)建自己的容器云嗎滥朱?答案顯然是否定的。docker-compose解決的問題局限在“編排”二字力试,甚至連“部署”范疇都涉足甚少徙邻,而在一個(gè)能夠服務(wù)于大眾的云平臺(tái)中,編排與部署也僅僅是其中的一個(gè)組成部分而已畸裳。來(lái)一起分析一下它的局限制會(huì)有哪些:

1缰犁、docker-compse是面向單宿主機(jī)部署的,這是一種部署能力的欠缺怖糊。在更多的場(chǎng)合下帅容,管理員需要面對(duì)大量物理服務(wù)器(或者虛擬機(jī)),這時(shí)如果要實(shí)現(xiàn)基于docker-compose的容器自動(dòng)化編排與部署伍伤,管理員就得借助成熟的自動(dòng)化運(yùn)維工具(ansible并徘、puppet、chef嚷缭、saltstack)來(lái)負(fù)責(zé)管理多個(gè)目標(biāo)主機(jī)饮亏,將docker-compose所需的所有資源(配置文件耍贾、用戶代碼)交給目標(biāo)主機(jī)阅爽,然后在目標(biāo)主機(jī)上執(zhí)行docker-compose指令。
2荐开、同樣網(wǎng)絡(luò)和存儲(chǔ)也比較棘手付翁,Docker不能提供跨宿主機(jī)的網(wǎng)絡(luò),完全面向Docker daemon的docker-compose當(dāng)然也不支持晃听。這意味著管理員必須部署一套類似于Open vSwich的獨(dú)立網(wǎng)絡(luò)工具百侧,而且管理員還需要完成集成工作。當(dāng)好不容易把容器編排都安排妥當(dāng)之后能扒,又會(huì)發(fā)現(xiàn)容器還處在內(nèi)網(wǎng)環(huán)境中佣渴,于是負(fù)載均衡、服務(wù)發(fā)現(xiàn)等一堆問題就面臨而來(lái)了初斑,這些問題很快能消耗掉工程師所有的耐心辛润。

那么,是否有一種能夠提供完善的面向服務(wù)器集群的Docker編排和部署方案呢见秤?Docker官方給出的答案是Compose同Machine和Swarm聯(lián)動(dòng)砂竖,其實(shí)還有大家近期經(jīng)常聽到了kubernetes(k8s)

參考

https://www.cnblogs.com/elvi/p/8424753.html

https://www.cnblogs.com/nulige/articles/10931047.html

https://docs.docker.com/compose/compose-file/

https://docs.docker.com/compose/install/

https://www.cnblogs.com/freefei/p/5311294.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市鹃答,隨后出現(xiàn)的幾起案子乎澄,更是在濱河造成了極大的恐慌,老刑警劉巖测摔,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件置济,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浙于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門修噪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人路媚,你說(shuō)我怎么就攤上這事黄琼。” “怎么了整慎?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵脏款,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我裤园,道長(zhǎng)撤师,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任拧揽,我火速辦了婚禮剃盾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淤袜。我一直安慰自己痒谴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布铡羡。 她就那樣靜靜地躺著积蔚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪烦周。 梳的紋絲不亂的頭發(fā)上尽爆,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音读慎,去河邊找鬼漱贱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夭委,可吹牛的內(nèi)容都是我干的幅狮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼闰靴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彪笼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蚂且,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丐吓,失蹤者是張志新(化名)和其女友劉穎绍弟,沒想到半個(gè)月后先嬉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捆交,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腐巢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片品追。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冯丙,靈堂內(nèi)的尸體忽然破棺而出肉瓦,到底是詐尸還是另有隱情,我是刑警寧澤胃惜,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布泞莉,位于F島的核電站,受9級(jí)特大地震影響船殉,放射性物質(zhì)發(fā)生泄漏鲫趁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一利虫、第九天 我趴在偏房一處隱蔽的房頂上張望挨厚。 院中可真熱鬧,春花似錦糠惫、人聲如沸疫剃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)慌申。三九已至陌选,卻和暖如春理郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咨油。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工您炉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人役电。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓赚爵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親法瑟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冀膝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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