用Docker Compose編排微服務(wù)

Docker Compose介紹

使用微服務(wù)架構(gòu)的應(yīng)用系統(tǒng)一般包含若干個(gè)微服務(wù)沦疾,每個(gè)微服務(wù)一般都會(huì)部署多個(gè)實(shí)例。如果每個(gè)微服務(wù)都要手動(dòng)啟停,那么效率之低惦费、維護(hù)量之大可想而知。本節(jié)課將討論如何使用 Docker Compose來(lái)輕松抢韭、高效地管理容器薪贫。為了簡(jiǎn)單起見(jiàn)將 Docker Compose簡(jiǎn)稱(chēng)為 Compose。
Compose 是一個(gè)用于定義和運(yùn)行多容器的Docker應(yīng)用的工具刻恭。使用Compose瞧省,你可以在一個(gè)配置文件(yaml格式)中配置你應(yīng)用的服務(wù),然后使用一個(gè)命令鳍贾,即可創(chuàng)建并啟動(dòng)配置中引用的所有服務(wù)鞍匾。下面我們進(jìn)入Compose的實(shí)戰(zhàn)吧

Docker Compose的安裝

Compose的安裝有多種方式,例如通過(guò)shell安裝骑科、通過(guò)pip安裝橡淑、以及將compose作為容器安裝等等。本文講解通過(guò)pip安裝的方式咆爽。其他安裝方式如有興趣梁棠,可以查看Docker的官方文檔:https://docs.docker.com/compose/install/
1置森、安裝python-pip

# yum -y install epel-release
# yum -y install python-pip

2、安裝docker-compose

# pip install docker-compose

3掰茶、待安裝完成后暇藏,執(zhí)行查詢版本的命令

# docker-compose version

Docker Compose入門(mén)示例

Compose的使用非常簡(jiǎn)單,只需要編寫(xiě)一個(gè)docker-compose.yml濒蒋,然后使用docker-compose 命令操作即可盐碱。docker-compose.yml描述了容器的配置,而docker-compose 命令描述了對(duì)容器的操作沪伙。我們首先通過(guò)一個(gè)示例快速入門(mén):
還記得上節(jié)課瓮顽,我們使用Dockerfile為項(xiàng)目microservice-eureka-server構(gòu)建Docker鏡像嗎?我們還以此項(xiàng)目為例測(cè)試

  • 我們?cè)趍icroservice-eureka-server-0.0.1-SNAPSHOT.jar所在目錄的上一級(jí)目錄围橡,創(chuàng)建docker-compose.yml 文件暖混。
    目錄樹(shù)結(jié)構(gòu)如下:
├── docker-compose.yml 
└── eureka     
├───── Dockerfile     
└───── microservice-eureka-server-0.0.1-SNAPSHOT.jar
  • 然后在docker-compose.yml 中添加內(nèi)容如下:
eureka:       #指定服務(wù)名   
  build:   ./eureka   #指定Dockfile所在路勁   
  ports:  
     - "8761:8761"   #指定端口映射   
  expose: 
     - 8761     #容器提供服務(wù)端口
  • 在docker-compose.yml 所在路徑執(zhí)行:
# docker-compose up
image.png

Compose就會(huì)自動(dòng)構(gòu)建鏡像并使用鏡像啟動(dòng)容器。也可使用 docker-compose up -d后臺(tái)啟動(dòng)并運(yùn)行這些容器

  • 訪問(wèn):http://宿主機(jī)IP:8761/翁授,發(fā)現(xiàn)可以正常啟動(dòng)拣播。

Docker Compose管理容器的結(jié)構(gòu)

  • Docker Compose將所管理的容器分為三層,分別是工程( project)收擦,服務(wù)(service)以及容器( container)贮配。
  • Docker Compose運(yùn)行目錄下的所有文件( docker-compose.yml、 extends文件或環(huán)境變量文件等)組成一個(gè)工程(默認(rèn)為 docker-compose.yml所在目錄的目錄名稱(chēng))塞赂。一個(gè)工程可包含多個(gè)服務(wù)泪勒,每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像、參數(shù)和依賴宴猾,一個(gè)服務(wù)可包括多個(gè)容器實(shí)例圆存。
  • 上節(jié)示例里工程名稱(chēng)是 docker-compose.yml所在的目錄名。該工程包含了1個(gè)服務(wù)仇哆,服務(wù)名稱(chēng)是 eureka沦辙,執(zhí)行 docker-compose up時(shí),啟動(dòng)了eureka服務(wù)的1個(gè)容器實(shí)例

docker-compose.yml常用指令

image
指定鏡像名稱(chēng)或者鏡像id讹剔,如果該鏡像在本地不存在油讯,Compose會(huì)嘗試pull下來(lái)。
示例:
image: java
build
指定Dockerfile文件的路徑辟拷。可以是一個(gè)路徑阐斜,例如:
build: ./dir
也可以是一個(gè)對(duì)象衫冻,用以指定Dockerfile和參數(shù),例如:
build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1
command
覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令谒出。
示例:
command: bundle exec thin -p 3000
也可以是一個(gè)list隅俘,類(lèi)似于Dockerfile總的CMD指令邻奠,格式如下:
command: [bundle, exec, thin, -p, 3000]
links
鏈接到其他服務(wù)中的容器∥樱可以指定服務(wù)名稱(chēng)和鏈接的別名使用SERVICE:ALIAS 的形式碌宴,或者只指定服務(wù)名稱(chēng),示例:
web: links: - db - db:database - redis
external_links
表示鏈接到docker-compose.yml外部的容器蒙畴,甚至并非Compose管理的容器贰镣,特別是對(duì)于那些提供共享容器或共同服務(wù)。格式跟links類(lèi)似膳凝,示例:
external_links: - redis_1 - project_db_1:mysql - project_db_1:postgresql
ports
暴露端口信息碑隆。使用宿主端口:容器端口的格式,或者僅僅指定容器的端口(此時(shí)宿主機(jī)將會(huì)隨機(jī)指定端口)蹬音,類(lèi)似于docker run -p 上煤,示例:
ports: - "3000" - "3000-3005" - "8000:8000" - "9090-9091:8080-8081" - "49100:22" - "127.0.0.1:8001:8001" - "127.0.0.1:5000-5010:5000-5010"
expose
暴露端口,只將端口暴露給連接的服務(wù)著淆,而不暴露給宿主機(jī)劫狠,示例:
expose: - "3000" - "8000"
volumes
卷掛載路徑設(shè)置∮啦浚可以設(shè)置宿主機(jī)路徑 (HOST:CONTAINER) 或加上訪問(wèn)模式 (HOST:CONTAINER:ro)独泞。示例:
volumes: # Just specify a path and let the Engine create a volume - /var/lib/mysql # Specify an absolute path mapping - /opt/data:/var/lib/mysql # Path on the host, relative to the Compose file - ./cache:/tmp/cache # User-relative path - ~/configs:/etc/configs/:ro # Named volume - datavolume:/var/lib/mysql
volumes_from
從另一個(gè)服務(wù)或者容器掛載卷⊙锸妫可以指定只讀或者可讀寫(xiě)阐肤,如果訪問(wèn)模式?jīng)]有指定,則默認(rèn)是可讀寫(xiě)讲坎。示例:
volumes_from: - service_name - service_name:ro - container:container_name - container:container_name:rw
environment
設(shè)置環(huán)境變量孕惜。可以使用數(shù)組或者字典兩種方式晨炕。只有一個(gè)key的環(huán)境變量可以在運(yùn)行Compose的機(jī)器上找到對(duì)應(yīng)的值衫画,這有助于加密的或者特殊主機(jī)的值。示例:
environment: RACK_ENV: development SHOW: 'true' SESSION_SECRET: environment: - RACK_ENV=development - SHOW=true - SESSION_SECRET
env_file
從文件中獲取環(huán)境變量瓮栗,可以為單獨(dú)的文件路徑或列表削罩。如果通過(guò) docker-compose -f FILE 指定了模板文件,則 env_file 中路徑會(huì)基于模板文件路徑费奸。如果有變量名稱(chēng)與 environment 指令沖突弥激,則以envirment 為準(zhǔn)。示例:
env_file: .env env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
extends
繼承另一個(gè)服務(wù)愿阐,基于已有的服務(wù)進(jìn)行擴(kuò)展微服。
net
設(shè)置網(wǎng)絡(luò)模式。示例:
net: "bridge" net: "host" net: "none" net: "container:[service name or container name/id]"
dns
配置dns服務(wù)器缨历∫栽蹋可以是一個(gè)值糙麦,也可以是一個(gè)列表。示例:
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
dns_search
配置DNS的搜索域丛肮,可以是一個(gè)值赡磅,也可以是一個(gè)列表,示例:
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
其他
docker-compose.yml 還有很多其他命令宝与,本文僅挑選常用命令進(jìn)行講解焚廊,其他不不作贅述。如果感興趣的伴鳖,可以參考docker-compose.yml文件官方文檔:https://docs.docker.com/compose/compose-file/

用Docker Compose編排Spring Cloud微服務(wù)

如果微服務(wù)較多节值,則可以用docker compose來(lái)統(tǒng)一編排讥耗,我們打算用docker compose來(lái)統(tǒng)一編排三個(gè)微服務(wù):eureka服務(wù)(項(xiàng)目05-ms-eureka-server)遭居,user服務(wù)(項(xiàng)目05-ms-provider-user)乒疏,order服務(wù)(項(xiàng)目05-ms-consumer-order-ribbon)

編排微服務(wù)

1凿掂、在根目錄創(chuàng)建文件夾/app
2纸俭、在app目錄下新建docker-compose.yml文件和三個(gè)文件夾eureka煎源,user雹姊,order
3初橘、在eureka豌汇,user幢炸,order三個(gè)文件夾下分別構(gòu)建eureka服務(wù)鏡像,user服務(wù)鏡像拒贱,order服務(wù)鏡像宛徊,以構(gòu)建eureka服務(wù)鏡像為例,在eureka文件夾下新建dockerfile文件并且將eureka服務(wù)的可運(yùn)行jar包上傳到該目錄(注意:需要將配置eureka.client.serviceUrl.defaultZone的值改為http://eureka:8761/eureka/逻澳,默認(rèn)情況下Compose以服務(wù)名稱(chēng)作為hostname被其他容器訪問(wèn))闸天,dockerfile文件內(nèi)容如下

# 基于哪個(gè)鏡像
From java:8
# 將本地文件夾掛載到當(dāng)前容器
VOLUME /tmp
# 復(fù)制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 聲明需要暴露的端口
EXPOSE 8761
# 配置容器啟動(dòng)后執(zhí)行的命令
ENTRYPOINT ["java","-jar","/app.jar"]

4、docker-compose.yml內(nèi)容如下

version: '2'              #docker的文件格式版本
services:
  eureka:                 #docker服務(wù)名
    image: eureka    #docker鏡像
    ports:
      - "8761:8761"
  user: 
    image: user
    ports:  
      - "8000:8000" 
  order:    
    image: order
    ports: 
      - "8010:8010"

5斜做、啟動(dòng)所有微服務(wù)苞氮,在命令后面加-d可以后臺(tái)啟動(dòng):

# docker-compose up

6、訪問(wèn)三個(gè)微服務(wù)是否正常

編排高可用微服務(wù)
1瓤逼、在根目錄創(chuàng)建文件夾/app-ha
2笼吟、在app-ha目錄下新建docker-compose.yml文件和三個(gè)文件夾eureka-ha,user-ha霸旗,order-ha
3贷帮、在eureka-ha,user-ha诱告,order-ha三個(gè)文件夾下分別構(gòu)建eureka-ha服務(wù)鏡像撵枢,user-ha服務(wù)鏡像,order-ha服務(wù)鏡像,eureka-ha服務(wù)參考項(xiàng)目08-ms-eureka-server-ha诲侮,(注意:需要修改user服務(wù)和order服務(wù)配置文件eureka.client.serviceUrl.defaultZone的值為http://peer1:8761/eureka/,http://peer2:8762/eureka/)
4、docker-compose.yml內(nèi)容如下

version: '2'          #docker的文件格式版本
services:
  peer1:             #docker微服務(wù)名稱(chēng)
    image: eureka-ha     #docker鏡像
    ports:
      - "8761:8761"
    environment:
      - spring.profiles.active=peer1
  peer2:    
    image: eureka-ha
    ports:  
      - "8762:8762" 
    environment:
      - spring.profiles.active=peer2
  user:       
    image: user-ha
    ports:
      - "8000:8000" 
  order:
    image: order-ha
    ports:
      - "8010:8010"

5箱蟆、啟動(dòng)所有微服務(wù)沟绪,在命令后面加-d可以后臺(tái)啟動(dòng):

# docker-compose up

6、訪問(wèn)三個(gè)微服務(wù)是否正常

動(dòng)態(tài)擴(kuò)容微服務(wù)
有時(shí)我們需要擴(kuò)容微服務(wù)空猜,比如我們想把用戶和訂單微服務(wù)各部署兩個(gè)微服務(wù)绽慈,則docker-compose.yml文件應(yīng)該如下配置
docker-compose.yml內(nèi)容如下

version: '2'          #docker的文件格式版本
services:
  peer1:             #docker微服務(wù)名稱(chēng)
    image: eureka-ha     #docker鏡像
    ports:
      - "8761:8761"
    environment:
      - spring.profiles.active=peer1
  peer2:    
    image: eureka-ha
    ports:  
      - "8762:8762" 
    environment:
      - spring.profiles.active=peer2
  user:       
    image: user-ha
  order:
    image: order-ha

執(zhí)行如下擴(kuò)容命令:

# docker-compose up    #必須先正常編排微服務(wù),然后才能動(dòng)態(tài)擴(kuò)容
# docker-compose scale user=2 order=2

注意:如果是在同一臺(tái)物理機(jī)上做動(dòng)態(tài)擴(kuò)容辈毯,則需要在docker-compose.yml里去掉除了eureka其它微服務(wù)ports端口映射
運(yùn)行完查看eureka注冊(cè)中心如下圖所示:


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坝疼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子谆沃,更是在濱河造成了極大的恐慌钝凶,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁影,死亡現(xiàn)場(chǎng)離奇詭異耕陷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)据沈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)哟沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锌介,你說(shuō)我怎么就攤上這事嗜诀。” “怎么了孔祸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵隆敢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我融击,道長(zhǎng)筑公,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任尊浪,我火速辦了婚禮匣屡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拇涤。我一直安慰自己捣作,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布鹅士。 她就那樣靜靜地躺著券躁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上也拜,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天以舒,我揣著相機(jī)與錄音,去河邊找鬼慢哈。 笑死蔓钟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卵贱。 我是一名探鬼主播滥沫,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼键俱!你這毒婦竟也來(lái)了兰绣?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤编振,失蹤者是張志新(化名)和其女友劉穎缀辩,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踪央,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雌澄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杯瞻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐牺。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖魁莉,靈堂內(nèi)的尸體忽然破棺而出睬涧,到底是詐尸還是另有隱情,我是刑警寧澤旗唁,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布畦浓,位于F島的核電站,受9級(jí)特大地震影響检疫,放射性物質(zhì)發(fā)生泄漏讶请。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一屎媳、第九天 我趴在偏房一處隱蔽的房頂上張望夺溢。 院中可真熱鬧,春花似錦烛谊、人聲如沸风响。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)状勤。三九已至鞋怀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間持搜,已是汗流浹背密似。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葫盼,地道東北人辛友。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像剪返,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邓梅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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