初識(shí) docker compose
1. 為什么要用docker compose
在多階段構(gòu)建章節(jié)中,我們將flask應(yīng)用打包成了鏡像myhello,然后創(chuàng)建myhello應(yīng)用容器,它依賴redis服務(wù),所以我們?cè)O(shè)定myhello容器通過宿主機(jī)網(wǎng)絡(luò)與redis進(jìn)行數(shù)據(jù)交換。
如果在別的服務(wù)器上,使用Docker重新部署一邊,操作的過程還是比較麻煩的。一般來說,我們要求每個(gè)Docker容器只運(yùn)行一個(gè)獨(dú)立服務(wù),每個(gè)鏡像都要保持盡可能的簡潔、功能單一,貌似這些規(guī)范反而降低了我們的效率。
同時(shí),隨著技術(shù)演進(jìn),我們?cè)絹碓酵瞥鐚⒋笮头?wù)拆分成較小的微服務(wù),分別部署到獨(dú)立的機(jī)器或容器中,也就是說,我們的應(yīng)用系統(tǒng)往往由數(shù)十個(gè)甚至上百個(gè)小型服務(wù)組成。試想一下,使用之前講到的容器技術(shù)搭建系統(tǒng),不僅需要眾多復(fù)雜的命令,處理眾多容器間的依賴更是非常消耗精力的。
歸結(jié)下來,我們?nèi)鄙僖粋€(gè)對(duì)容器組合進(jìn)行管理的工具。
Docker Compose 是 Docker 官方編排項(xiàng)目。使用 Docker Compose 可以輕松、高效的管理容器,它是一個(gè)用于定義和運(yùn)行多容器 Docker 的應(yīng)用程序工具。在 Docker Compose 里,我們通過一個(gè)配置文件,將所有與應(yīng)用系統(tǒng)相關(guān)的軟件及它們對(duì)應(yīng)的容器進(jìn)行配置,之后使用 Docker Compose 提供的命令進(jìn)行啟動(dòng),就能讓 Docker Compose 將剛才我們所提到的那些復(fù)雜問題解決掉。
2. 獲取 Docker Compose
安裝 Docker Compose 可以通過下面命令自動(dòng)下載適應(yīng)版本的 Compose,并為安裝腳本添加執(zhí)行權(quán)限
# 下載 docker-compose
wget https://github.com/docker/compose/releases/download/1.26.0/docker-compose-Linux-x86_64
# 移到 /usr/local/bin/docker-compose
sudo mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# 給 docker-compose 執(zhí)行權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
查看安裝是否成功:
docker-compose -v
3. 使用 Docker Compose
使用 Docker Compose 的步驟分成三步。
- 也可以使用現(xiàn)有的鏡像 ,或者根據(jù)需要編寫容器所需鏡像的 Dockerfile
- 編寫獲取用于配置容器的 docker-compose.yml
- 使用 docker-compose 命令啟動(dòng)應(yīng)用
準(zhǔn)備鏡像這一過程我們之前已經(jīng)掌握了,編寫docker-compose.yml部分我們會(huì)放在下一節(jié)詳細(xì)介紹,這里我們就直接來使用它,感受Docker Compose 的強(qiáng)大功能。
3.1 編寫 docker-compose.yml
進(jìn)入dockerfiledir目錄,新建redis目錄,將之前部署redis容器用到的redis.conf拷貝到redis目錄下,修改redis.conf中的bind 127.0.0.1
為bind 0.0.0.0
,以便其他容器訪問此服務(wù)。然后新建文件docker-compose.yml
,并將下面的內(nèi)容寫入到這個(gè)文件中。
version: "3.8"
services:
cache:
image: redis:6.0.5
container_name: my_redis
networks:
- mynetwork
volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
app:
build:
context: .
dockerfile: ./Dockerfile-multi-stage
container_name: my_hello
networks:
- mynetwork
environment:
- REDIS_HOST=my_redis
depends_on:
- cache
ports:
- "5000:5000"
networks:
mynetwork:
name: my_network
driver: bridge
此時(shí)目錄結(jié)構(gòu)如下:
3.2 啟動(dòng)、重建和停止
docker-compose up
命令類似于 Docker 中的 docker run
,它會(huì)根據(jù) docker-compose.yml 中配置的內(nèi)容,創(chuàng)建所有的容器、網(wǎng)絡(luò)、數(shù)據(jù)卷等等內(nèi)容,并將它們啟動(dòng)。與 docker run
一樣,默認(rèn)情況下 docker-compose up
會(huì)在前臺(tái)運(yùn)行,我們可以用 -d
選項(xiàng)使其“后臺(tái)”運(yùn)行,大多數(shù)情況都會(huì)加上 -d
選項(xiàng)。
sudo docker-compose up -d
docker-compose
命令默認(rèn)會(huì)識(shí)別當(dāng)前控制臺(tái)所在目錄內(nèi)的 docker-compose.yml 文件,而會(huì)以這個(gè)目錄的名字作為組裝的應(yīng)用項(xiàng)目的名稱。如果我們需要改變它們,可以通過選項(xiàng) -f
來修改識(shí)別的 Docker Compose 配置文件。--build
用于執(zhí)行重建服務(wù)鏡像,更新鏡像時(shí)使用。
sudo docker-compose -f ./docker-compose.yml up -d --build
docker-compose down
命令用于停止所有的容器,并將它們刪除,同時(shí)消除網(wǎng)絡(luò)等配置內(nèi)容,也就是幾乎將這個(gè) Docker Compose 項(xiàng)目的所有影響從 Docker 中清除。
Tips: 建議大家像容器使用一樣對(duì)待 Docker Compose 項(xiàng)目,做到隨用隨啟,隨停隨刪。
4. 小結(jié)
通過 Docker 讓我們能夠在開發(fā)過程中搭建一套不受干擾的獨(dú)立環(huán)境,而 Docker Compose 則讓我們可以處理多套環(huán)境,并能夠做到進(jìn)行快速切換。在服務(wù)搭建的場景中,使用Docker Compose 編排容器,可以使容器技術(shù)發(fā)揮更大的價(jià)值。下一節(jié),我們將走進(jìn)Docker Compose的核心,深入了解Compose配置文件的指令的作用和使用方式。