天天看點

第三口docker的感覺——docker compose

我們為什麼需要docker compose呢?

現在大行其道的微服務架構,是由多個service組成的,在web應用中資料庫也是必不可少的,那麼這些元件就成了我一個項目的标配,那麼我們如果把這一組映射到docker世界裡去呢?docker-compose就可以作為這一組的展現。總結起來docker compose可以給我們帶來的好處是:

  1. 避免了我們手動建立多個 dockerfile,多個image,多個容器。減少了我們的工作量。
  2. 啟動停止删除可以被一次處理。

什麼是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