我們爲什麼需要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