Docker Compose:從開發到生產

為課程開始準備的播客轉錄翻譯 《Linux 管理員》

Docker Compose:從開發到生產

Docker Compose 是一個令人驚嘆的工具,用於建立工作
應用程式中使用的堆疊環境。它允許您定義
應用程式的每個組件都遵循清晰簡單的語法 YAML-
文件
.

隨著 碼頭工人組成v3 這些YAML檔案可以在生產環境中直接使用
碼頭工人.

但這是否意味著您可以在中使用相同的 docker-compose 文件
開發過程和生產環境?或使用相同的文件
分期?嗯,一般來說,是的,但是對於此功能,我們需要以下內容:

  • 變數內插:使用環境變數進行某些
    每個環境都會改變的價值觀。
  • 配置覆蓋:能夠定義第二個(或任何
    另一個後續的)docker-compose 檔案將更改相關的內容
    首先,docker compose 將負責合併兩個檔案。

開發文件和生產文件之間的差異

在開發過程中,您很可能想要檢查程式碼更改
即時的。為此,通常將包含原始程式碼的磁碟區安裝在
包含應用程式運行時的容器。但對於生產環境
這種方法不適合。

在生產中,您有一個包含許多節點的集群,並且卷是本地的
相對於容器(或服務)運行的節點,因此您不需要
您可以掛載原始碼,無需複雜的操作,包括
程式碼同步、訊號等

相反,我們通常希望使用特定版本的程式碼來建立圖像。
習慣上用適當的標籤來標記它(您可以使用語義
版本控製或其他系統由您自行決定)。

配置覆蓋

鑑於差異以及您的依賴關係在場景中可能有所不同
開發和生產,很明顯我們將需要不同的配置。

Docker compose 支援將不同的 compose 檔案合併到
獲得最終配置。從範例中可以看出其工作原理:

$ cat docker-compose.yml
version: "3.2"

services:
  whale:
    image: docker/whalesay
    command: ["cowsay", "hello!"]
$ docker-compose up
Creating network "composeconfigs_default" with the default driver
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ________
whale_1  | < hello! >
whale_1  |  --------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

如前所述,docker compose 支援組合多個 compose -
文件,這允許您覆蓋第二個文件中的各種參數。例如:

$ cat docker-compose.second.yml
version: "3.2"
services:
  whale:
    command: ["cowsay", "bye!"]

$ docker-compose -f docker-compose.yml -f docker-compose.second.yml up
Creating composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

這種語法在開發過程中不太方便,當指令
需要進行多次。

幸運的是,docker compose 會自動尋找一個名為的特殊文件
docker-compose.override.yml 覆蓋值 泊塢窗,compose.yml。 如果
重新命名第二個文件,只需使用原始命令即可得到相同的結果:

$ mv docker-compose.second.yml docker-compose.override.yml
$ docker-compose up
Starting composeconfigs_whale_1
Attaching to composeconfigs_whale_1
whale_1  |  ______
whale_1  | < bye! >
whale_1  |  ------
whale_1  |     
whale_1  |      
whale_1  |       
whale_1  |                     ##        .
whale_1  |               ## ## ##       ==
whale_1  |            ## ## ## ##      ===
whale_1  |        /""""""""""""""""___/ ===
whale_1  |   ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
whale_1  |        ______ o          __/
whale_1  |                     __/
whale_1  |           __________/
composeconfigs_whale_1 exited with code 0

好吧,這樣比較容易記。

變數插值

設定檔支援 插值法
變數
和預設值。也就是說,您可以執行以下操作:

services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
...

如果你這樣做 docker-compose 建置(或推播) 沒有環境變數
$MY_SERVICE_VERSION,該值將被使用 最新但如果你設定
建構前環境變數的值,建置或推送時將使用該值
到登記處 私有.registry.mine.

我的原則

對我有用的方法也可能對你有用。我遵循這些
簡單的規則:

  • 我所有用於生產、開發(或其他環境)的堆疊都是透過定義的
    docker-compose 文件
  • 設定檔需要盡可能覆蓋我的所有環境
    避免重複。
  • 我需要一個簡單的命令來在每種環境中工作。
  • 主要配置在檔案中定義 泊塢窗,compose.yml.
  • 環境變數用於定義影像標籤或其他
    變數可能因環境而異(暫存、整合、
    生產)。
  • 生產變數的值用作
    預設情況下,如果堆疊在生產環境中啟動而無需
    設定環境變數。
  • 若要在生產環境中啟動服務,請使用指令 docker stack 部署 - compose-file docker-compose.yml -with-registry-auth my-stack-name.
  • 使用指令啟動工作環境 docker-compose up -d.

讓我們來看一個簡單的例子。

# docker-compose.yml
...
services:
  my-service:
    build:
      context: .
    image: private.registry.mine/my-stack/my-service:${MY_SERVICE_VERSION:-latest}
    environment:
      API_ENDPOINT: ${API_ENDPOINT:-https://production.my-api.com}
...

И

# docker-compose.override.yml
...
services:
  my-service:
    ports: # This is needed for development!
      - 80:80
    environment:
      API_ENDPOINT: https://devel.my-api.com
    volumes:
      - ./:/project/src
...

我可以用 docker-compose(docker-compose up)運行堆疊
原始碼掛載的開發模式 /項目/src.

我可以在生產中使用這些相同的文件!我絕對可以使用
相同的文件 泊塢窗,compose.yml 用於演出。將此擴展為
生產,我只需要構建並發送帶有預定義標籤的圖像
CI階段:

export MY_SERVICE_VERSION=1.2.3
docker-compose -f docker-compose.yml build
docker-compose -f docker-compose.yml push

在生產中,可以使用以下命令運行:

export MY_SERVICE_VERSION=1.2.3
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

如果你想在舞台上做同樣的事情,你只需要定義
在臨時環境中工作所需的環境變數:

export MY_SERVICE_VERSION=1.2.3
export API_ENDPOINT=http://staging.my-api.com
docker stack deploy my-stack --compose-file docker-compose.yml --with-registry-auth

結果,我們使用了兩個不同的 docker-compose 文件,其中沒有
重複配置可用於您擁有的任何環境!

了解有關課程的更多信息 《Linux 管理員》

來源: www.habr.com

添加評論