1. 程式人生 > Docker入門教學 >DockerCompose指令詳解

DockerCompose指令詳解

上一節我們快速體驗了 Docker Compose,本節我們來學習如何編寫和使用 Docker Compose。

Docker Compose 的配置檔案是一個基於 YAML 格式的檔案。與 Dockerfile 採用 Dockerfile 作為預設檔名一樣,Docker Compose 的配置檔案也有一個預設的檔名,就是 docker-compose.yml。

Docker Compose 將所管理的容器分為三層,分別是工程(project)、服務(service)、容器(container),Docker Compose 定義了一個工程,一個工程包含多個服務,每個服務中定義了容器執行的映象、引數、依賴,一個服務可包括多個容器例項。

1. 梳理工程中各個服務和容器的關係

Docker Compose配置檔案有多個層級,直接學習指令不便於理解,通過一個熟悉的例子來掌握它是個更好的辦法。

以先前的配置檔案為例,從Docker Compose的角度看,多個互相關聯的容器構成了一個工程。這個工程中包含應用服務app和資料快取服務cache。

  • 快取服務cache包含redis容器,它提供給工程中的其他容器redis服務。

  • 應用服務app中包含我們自定義的Dockerfile構建生成的容器,容器的執行依賴redis服務。

Tips: 需要注意的是,先前借用宿主機網路直接進行容器通訊過於簡單粗暴。我們只需要對外暴露flask 應用的 5000 埠就足夠了,因此在 Docker Compose 容器編排中,需要維護額外的 Docker 網路,來處理這個工程中各容器通訊。

2. 詳解配置指令

這裡是上一節中使用的 Docker Compose 配置檔案,它包含許多內容,從每個容器的各個細節控制,到網路、資料卷等的定義。

本節我們加入了註釋來快速瞭解它。

# 指定配置檔案的版本號
version: "3.8"

# 服務
services:
	# 服務名稱cache
    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 app: # 構建映象 build: # 指定上下文 context: . # 指定構建指令碼 dockerfile: ./Dockerfile-multi-stage # 生成的容器名稱 container_name: my_hello # 指定網路 networks: - mynetwork # 配置環境變數 environment: - REDIS_HOST=my_redis # 指名容器依賴關係 depends_on: - cache # 宿主機與容器埠對映 ports: - "5000:5000" # 網路配置,與services在同一層級,注意書寫格式對齊 networks: # 標識自定義的網路,對應容器中指定的網路的名稱 mynetwork:  # 在容器網路中展示的名稱 name: my_network # 網路驅動型別 driver: bridge

基本的結構示意圖如下:
圖片描述

接下來,我們認識一下這個例子中出現的一些常用指令:

2.1 version

版本號標識我們定義的 docker-compose.yml 檔案內容所採用的版本,目前 Docker Compose 的配置檔案已經迭代至了第三版,其所支援的功能也越來越豐富,建議使用最新的版本來定義。對照表如下:

Compose 配置檔案版本 Docker 版本
3.8 19.03.0+
3.7 18.06.0+
3.6 18.02.0+
3.5 17.12.0+
3.4 17.09.0+
3.3 17.06.0+
3.2 17.04.0+
3.1 1.13.1+
3.0 1.13.0+
2.4 17.12.0+
2.3 17.06.0+
2.2 1.13.0+
2.1 1.12.0+
2.0 1.10.0+
1.0 1.9.1.+

2.2 service

在 Docker Compose 把 service 作為配置的最小單元。使用時,我們首先要為每個服務定義一個名稱,用以區別不同的服務。在這個例子裡,cache、redis 就是服務的名稱。雖然看上去每個 service 裡的配置內容就像是在配置單個容器,但其實 service 代表的是一個應用叢集的配置,這個部分我們會在後續的實戰環節接觸到。

2.3 image

類似於Dockerfile中的FROM指令。需要注意,一定要註明映象的具體版本號,不要使用latest版本(不標明版本即為latest),不同的執行時間,latest指代的映象會發生改變。準確執行唯一指定的容器才能使得整個工程正確執行。

2.4 build

build另一種指定映象的方式,通過 build 這個配置我們能夠直接採用 Dockerfile 來構建映象,定義構建的環境目錄。

如果我們通過這種方式指定映象,那麼 Docker Compose 先會幫助我們執行映象的構建,之後再通過這個映象啟動容器。Docker Compose 我們能夠指定更多的映象構建引數,例如 Dockerfile 的檔名,構建上下文,構建引數等等。

此外,與image指令類似,我們希望Dockerfile的構建也是唯一可靠的,因此之前Dockerfile的寫法也是不夠穩定的,請讀者自行在Dockerfile中的映象和依賴上標明合適的版本號。

2.5 container_name

指定容器名稱,如果不指定,會以<專案名稱><服務名稱><序號>。其中專案名稱預設是當前工作目錄的名字。

2.6 command

例如上面的配置裡,我們希望修改 Redis 的啟動命令,加入配置檔案以便對 Redis 服務進行配置,那麼我們可以直接通過 command 配置來修改。command會覆蓋映象中的CMD指令。

2.7 depends_on

在上面的例子裡,我們的 app 依賴 cache,使用 depends_on 這個配置項,列出這個服務所有依賴的其他服務即可。在 Docker Compose 為我們啟動專案的時候,會檢查所有依賴,按照依賴指定的啟動順序來依次啟動容器。

2.8 volumes

在 Docker Compose 裡定義檔案掛載的方式與 Docker裡也並沒有太多的區別,使用 volumes 配置可以像 docker 的 -v 選項一樣來指定外部掛載和資料卷掛載。在這個例子中,我們將redis的配置檔案掛載到容器中。

2.9 ports

ports 這個配置項,它是用來定義埠對映的。我們可以利用它進行宿主機與容器埠的對映,這個配置與 docker 中 -p 選項的使用方法是近似的。

2.10 environment:

設定環境變數, 類似於 Dockerfile 的 ENV

2.11 networks

網路也是容器間互相訪問的橋樑,網路的配置對於多個容器組成的應用系統來說也是非常重要的。在 Docker Compose 裡,我們可以為整個應用系統設定一個或多個網路。

要使用網路,我們必須先宣告網路。宣告網路的配置同樣獨立於 services 存在,是位於根配置下的 networks 配置。在上面的例子裡,我們聲明瞭網路mynetwork,在服務的配置中,直接使用networks指定mynetwork即可。

2.12 name

networks下的name的作用類似於 container_name指令,在這個例子中,mynetwork 建立的 docker 網路被命名為 my_network, 使用命令 docker network ls 可以檢視到它。

3.小結

本節帶領大家認識了配置檔案的基本結構和常用指令,這些指令是我們構建 Docker Compose 工程中最最常用的,是指令當中的“骨幹成員”,請務必要理解他們的基礎用法。

後面的章節,我們會使用 Docker Compose 進行多次實戰演練,專案實戰過程中還會出現其他 Docker Compose 的指令用法,需要大家結合本節內容,靈活運用。