我們為什麼需要docker compose呢?
現在大行其道的微服務架構,是由多個service組成的,在web應用中資料庫也是必不可少的,那麼這些元件就成了我一個項目的标配,那麼我們如果把這一組映射到docker世界裡去呢?docker-compose就可以作為這一組的展現。總結起來docker compose可以給我們帶來的好處是:
- 避免了我們手動建立多個 dockerfile,多個image,多個容器。減少了我們的工作量。
- 啟動停止删除可以被一次處理。
什麼是docker compose呢?
其實就是一個docker的批處理工具。通過yml檔案定義多容器的docker應用。
通過一條指令可以通過yml定義建立啟動管理同屬于一個"group"的容器。
Docker-compose.yml:
- Services
- Networks
- Volumes
Services:
一個Services就相當于一個container,這個container可以從docker hub擷取或者是dockerfile進行建構
我們在service中可以指定network和volume。
我們之前是這樣啟動docker 容器的如下:
docker run --network my-network -v postgre-data:/var/lib/postgresql/data postgres:9.4
這裡啟動了一個postgresql的資料庫,那如果在docker compose中我們應該如何做呢?
services:
postgre-db:
image: postgresql:9.4
volume:
- "postgre-data:/var/lib/postgresql/data"
network:
- my-network
我們很明顯的可以看出來他們之間一個對應的關系。
service它的直接孩子指定的是容器的名稱,然後他的孩子分别是image,volume,network這些。
⚠️ 這是從docker hub擷取下來的image,如果是通過自己的dockerfile該如何寫呢?
services:
my-docker:
build: ./my-docker
networks:
- my-network
那很多人會奇怪了,這個"postgre-data"和"my-network"是從哪裡來的呢?别急,我們看一下完整的docker compose的yaml:
services:
postgre-db:
image: postgresql:9.4
volume:
- "postgre-data:/var/lib/postgresql/data"
network:
- my-network
volumes:
postgre-data
networks:
my-network:
driver: briage
這下子水落石出了,和services同級的地方,有定義volumes和networks。折合前面舉例子的docker compose三要素正好對應上了。
更詳細的docker-compose yaml檔案的屬性,可以參考
https://docs.docker.com/compose/compose-file/Docker compse 常用指令
Docker compose啟動的指令為
docker-compose up
Docker compose 檢視目前compose中運作的container
docker-compose ls
Docker compose 停掉所有運作的container
docker-compose stop
Docker compose 移除所有停止的container
docker-compse rm
Docker compose 停止并且移除servies,networks,volumes
docker-compose down
⚠️這個指令不會删除本地的images。
其他更多詳細的内容指令,請檢視
https://docs.docker.com/compose/reference/或者使用docker-compose - -help 檢視。
Docker compose的拓展
我前面有提到過docker compose就是為了微服務的理念而生的,微服務隻是從業務邏輯上的一種拆分。那如果負載在高的情況下,我們怎麼才能抵抗住這種壓力呢?那就得使用load balance(負載均衡)了。負載均衡在docker中也是有所展現的。
我們可以使用如下指令進行擴充:
#SERVICE 指的是你在docker compose中定義的名字,NUM指定的是你想要的數量
docker-compose up --scale SERVICE=NUM
這樣就可以對自己的服務進行自由的伸縮。
⚠️前提是我們需要在我們的compose中安排一個loadbalance
可以參考:
https://github.com/docker/dockercloud-haproxy英語不好的可以參考
https://www.jianshu.com/p/4a2281bfb1cc