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
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è)中心如下圖所示: