docker-compose 配置檔案內容詳解以及常用命令介紹

谢友海發表於2024-11-24

一、Docker Compose 簡介

Docker Compose是一種用於定義和執行多容器Docker應用程式的工具。透過一個 docker-compose.yml 檔案,您可以配置應用程式需要的所有服務(例如:Web伺服器、資料庫、快取等)並輕鬆管理它們。

Docker Compose 使用的三個步驟:

  • 使用 Dockerfile 定義應用程式的環境。
  • 使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起執行。
  • 最後,執行 docker-compose up 命令來啟動並執行整個應用程式。

二、docker-compose 安裝

此處我採用的是離線安裝方式。

首先下載 docker-compose 到本地,下載地址:https://github.com/docker/compose/

下載連結:https://github.com/docker/compose/releases/download/v2.30.1/docker-compose-linux-x86_64

如果直接點選下載比較慢的話,建議複製連結地址到迅雷下載,這樣可能會快一些。下載完成後,把它上傳到 Linux 伺服器,如下所示:

接著把可執行檔案移到 Linux 系統命令目錄(/usr/local/bin/)下,並重新命名為 “docker-compose” :

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose

授權:

chmod +x /usr/local/bin/docker-compose

驗證是否安裝成功:

docker-compose --version

如果能正常顯示出正確的版本號,說明安裝成功了。

如果需要解除安裝,直接刪除即可:

sudo rm /usr/local/bin/docker-compose

三、docker-compose 常用命令

1、docker-compose up 命令

用法:

docker-compose up [options]

示例:

docker-compose up -d

功能:

  • 建立並啟動服務(容器):如果服務尚未建立,docker-compose up -d 會根據 docker-compose.yml 檔案中的定義建立並啟動這些服務。
  • 後臺執行:-d 參數列示“detached”模式,即以分離模式執行,服務會在後臺執行,不會佔用當前終端。
  • 重新建立容器:如果服務已經存在且正在執行,docker-compose up -d 會先停止並刪除現有的容器,然後重新建立並啟動新的容器。
  • 構建映象:如果配置檔案中指定了 build 指令,docker-compose up -d 會先構建所需的 Docker 映象。
  • 檢查配置:在啟動服務之前,docker-compose up -d 會檢查並驗證 docker-compose.yml 檔案中的配置。

使用場景:

  • 首次部署:當你第一次部署服務時,使用 docker-compose up -d 可以確保所有服務都按最新配置建立並啟動。
  • 更新服務:當你修改了 docker-compose.yml 檔案中的配置或映象,使用 docker-compose up -d 可以確保這些更改生效。
  • 確保最新狀態:無論服務是否已經存在,docker-compose up -d 都會確保服務是最新的狀態。

用於部署一個 Compose 應用。

預設情況下該命令會讀取名為 docker-compose.yml 或 docker-compose.yaml 的檔案。

當然使用者也可以使用 -f 指定其他檔名。通常情況下,會使用 -d 引數令應用在後臺啟動。

2、docker-compose down 命令

用法:

docker-compose down [options]

功能:

  • docker-compose down -v 命令用於停止並移除使用 docker-compose.yml 檔案定義的所有容器、網路、卷(透過 -v 引數指定的資料卷)以及預設的網路橋接。
  • 使用 -v 引數會刪除所有命名的資料卷。這可能會導致資料丟失,因此在執行前請確保已經做好了必要的備份。

使用場景:

  • 適用於徹底清理環境,例如在開發過程中需要重置環境或者測試不同配置時。
  • 完全重置環境:當你需要完全重置開發環境,確保沒有任何遺留資料時,可以使用 docker-compose down -v。
  • 測試環境清理:在自動化測試中,每次測試結束後使用 docker-compose down -v 可以確保環境乾淨,不受上次測試的影響。
  • 部署前清理:在部署新版本應用之前,使用 docker-compose down -v 可以確保沒有舊版本的殘留資料。

選項:

  • --rmi <type>:刪除映象。type 可以是以下值之一:

   all:刪除所有服務的映象。

   local:僅刪除那些不帶有 :(表示映象標籤)或 latest 標籤的映象(通常是構建時建立的映象)。

  • -v 或 --volumes:移除所有為服務定義的卷(包括預設卷和命名卷)。
  • --rmi-all:等同於 --rmi all,刪除所有服務的映象。
  • -h, --help:顯示幫助資訊。

示例:

1)停止並移除容器、網路和預設網路

docker-compose down

2)停止並移除容器、網路、卷以及映象

docker-compose down --volumes --rmi all

3)僅移除構建時建立的本地映象

docker-compose down --rmi local

4)指定配置檔案

docker-compose -f my-compose-file.yml down

注意事項:

  • 使用 docker-compose down --volumes 會刪除所有在 docker-compose.yml 檔案中定義的卷,包括預設卷和命名卷。如果你不想刪除這些卷,請不要使用這個選項。
  • 刪除映象操作是不可逆的,請確保在刪除映象之前備份必要的資料。
  • 如果你使用 Docker Compose 來管理多個環境(例如開發、測試和生產環境),請確保你在正確的環境中執行 docker-compose down 命令,以避免誤刪重要資料。

3、docker-compose stop 命令

docker-compose stop

停止 Compose 應用相關的所有容器,但不會刪除它們。

被停止的應用可以很容易地透過 docker-compose restart 命令重新啟動。

docker-compose stop 命令用於停止透過 docker-compose.yml 檔案定義並啟動的所有容器。這個命令不會移除容器、網路或卷,它只是停止了容器的執行。

4、docker-compose start 命令

docker-compose start

docker-compose start 命令用於啟動之前已經建立但已停止的容器。

5、docker-compose restart 命令

docker-compose restart

重啟已停止的 Compose 應用。

如果使用者在停止該應用後對其進行了變更,那麼變更的內容不會反映在重啟後的應用中,這時需要重新部署應用使變更生效。

6、docker-compose ps 命令

docker-compose ps

用於列出 Compose 應用中的各個容器。

輸出內容包括當前狀態、容器執行的命令以及網路埠。

7、docker-compose rm 命令

用於刪除已停止的 Compose 應用。它會刪除容器和網路,但是不會刪除卷和映象。

語法:

docker-compose rm [OPTIONS] [SERVICE...]

選項:

  • -f, --file FILE:指定使用的 Compose 配置檔案,預設為 docker-compose.yml。
  • -v, --volumes:刪除容器的同時刪除由 docker-compose.yml 檔案定義的卷(如果它們存在並且是容器專用的)。
  • -a, --all:刪除所有服務容器,而不僅僅是停止的容器。預設情況下,docker-compose rm 只刪除停止的容器。
  • --rmi TYPE:刪除映象。這個選項會刪除構建映象時產生的中間映象和構建快取。TYPE 可以是 all(刪除所有映象)、local(只刪除本地映象)或 built(只刪除透過 docker-compose 構建的映象)。
  • -s, --stop:在刪除容器之前先停止它們。這是預設行為,可以透過新增 --no-stop 標誌來覆蓋。
  • --no-stop:在刪除容器之前不停止它們(通常與 -f 一起使用)。

示例:

1)刪除所有停止的容器

docker-compose rm

這個命令會刪除所有在 docker-compose.yml 檔案中定義且當前已停止的容器。

2)刪除所有容器

docker-compose rm -a

這個命令會刪除所有在 docker-compose.yml 檔案中定義的容器,無論它們是執行中的還是已停止的。

3)刪除容器和卷

docker-compose rm -v

這個命令會刪除所有已停止的容器以及由 docker-compose.yml 檔案定義的卷(如果它們存在並且是容器專用的)。

4)使用指定的 Compose 配置檔案

docker-compose -f my-compose.yml rm

這個命令會使用 my-compose.yml 檔案來刪除容器。

5)刪除映象

docker-compose rm --rmi local

這個命令會刪除所有透過 docker-compose 構建且在本地存在的映象。

注意事項:

  • 使用 docker-compose rm 命令時,請確保你確實想要刪除這些容器,因為刪除後的資料(除非已備份到卷中)將不可恢復。
  • 如果容器正在執行,你需要先停止它們,或者使用 -s 或 --stop 選項來確保在刪除之前先停止它們。

8、docker-compose logs 命令

docker-compose logs 命令用於檢視 Docker Compose 應用中各個服務的日誌。這個命令非常有用,因為它可以幫助你診斷問題或監視服務的行為。

基本用法:

docker-compose logs [options] [SERVICE...]

SERVICE(可選):指定要檢視日誌的服務名稱。如果未指定,則顯示所有服務的日誌。

常用選項:

  • --follow, -f:實時跟蹤日誌輸出,類似於 tail -f。
  • --tail, -t "all":顯示日誌的最後幾行。預設值是 all,也可以指定一個數字。
  • --no-color:禁用顏色輸出,使日誌更適合重定向到檔案或其他工具。
  • --timestamps, -T:在日誌輸出中包含時間戳。

示例:

1)檢視所有服務的日誌

docker-compose logs

2)檢視特定服務的日誌

docker-compose logs web

3)檢視特定服務的最後10行日誌

docker-compose logs --tail 10 web

4)檢視所有服務的日誌幷包含時間戳

docker-compose logs -T

9、使用多個Compose檔案

你可以將配置拆分為多個檔案:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

四、docker-compose.yml 配置詳解

1、Compose配置檔案格式版本與Docker引擎的相容性表

Compose file format Docker Engine release
Compose specification 19.03.0+
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+

2、頂級配置項

  • version 定義了版本資訊
  • services 定義了服務的配置資訊
  • networks 定義了網路資訊,提供給 services 中的 具體容器使用
  • volumes 定義了卷資訊,提供給 services 中的 具體容器使用

示例:

version: "3.8" # Compose檔案版本
services:
  redis: # 服務名稱
    image: redis:alpine # 使用的映象
    ports:
      - "6379" # 指定的埠
    networks:
      - frontend # 使用的網路
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend

  result:
    image: nginx
    ports:
      - "5001:80"
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure

  worker:
    image: nginx
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s

networks:
  frontend:
  backend:
volumes:
  db-data:

3、version 常用版本

指定Docker Compose檔案格式的版本。常用版本為3.8,3.7等。

4、services 配置指令

1)container_name

指定自定義容器名稱,而不是生成的預設名稱。

version: "3.8"
services:

  redis:
    image: redis:alpine
    container_name: redis_test

2)image

指定容器執行的映象名稱或映象 ID。如果映象在本地不存在,Compose 將會嘗試拉取這個映象。

version: "3.8"
services:

  redis:
    image: redis:alpine

3)build

指定 Dockerfile 所在資料夾的路徑(可以是絕對路徑,或者相對 docker-compose.yml 檔案的路徑)。 Compose 將會利用它自動構建這個映象,然後使用這個映象。

version: '3.8'
services:
  webapp:
    build: ./dir

也可以使用 context 指令指定 Dockerfile 所在資料夾的路徑(或者是git倉庫的URL)。同時使用 dockerfile 指令指定 Dockerfile 檔名。

version: '3.8'
services:

  webapp: #自定義發我名稱 ,主要用查詢
    build:
      context: ./dir
      dockerfile: Dockerfile-name

注意:

如果同時指定了 image和 build, image 不在具有單獨使用它的意義,而是指定了目前要構建的映象的名稱。 也就是說 Compose 會使用 build 指令中指定的 Dockerfile 構建的映象,之後構建的映象名稱使用 image 中指定的名字 webapp:tag命名。

4)command

使用 command 可以覆蓋容器啟動後預設執行的命令。

# 寫成shell形式
command: bundle exec thin -p 3000

# 寫成Dockerfile中的exec格式
command: [bundle, exec, thin, -p, 3000]

5)depends_on

設定依賴關係。解決容器的依賴、啟動先後的問題。

version: "3.8"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

注意:web 服務不會等待 redis 和 db 完全啟動 之後才啟動。

6)environment

新增環境變數。您可以使用陣列或字典、任何布林值,布林值需要用引號引起來,以確保 YML 解析器不會將其轉換為 True 或 False。

environment:
  RACK_ENV: development
  SHOW: 'true'

如果變數名稱或者值中用到 true|false,yes|no 等表達布林含義的詞彙,最好放到引號裡,避免 YAML 自動解析某些內容為對應的布林語義。這些特定詞彙如下:

y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF

7)expose

暴露埠,但不對映到宿主機,只被連線的服務訪問。

僅可以指定內部埠為引數:

expose:
 - "3000"
 - "8000"

8)ports

對映埠資訊。

宿主機埠 : 容器埠 (即:HOST:CONTAINER) 的格式,或者僅僅指定容器的埠(宿主機將會隨機選擇埠)。

ports:
 - "3000"
 - "3000-3005"
 - "8000:8000"
 - "9090-9091:8080-8081"
 - "49100:22"
 - "127.0.0.1:8001:8001"
 - "127.0.0.1:5000-5010:5000-5010"
 - "6060:6060/udp"

注意:當使用 HOST:CONTAINER 格式來對映埠時,如果你使用的容器埠小於 60 並且沒放到引號裡,可能會得到錯誤結果,因為 YAML 會自動解析 xx:yy 這種數字格式為 60 進位制。為避免出現這種問題,建議數字串都採用引號括起來的字串格式。

9)extra_hosts

新增主機名對映。類似 docker client --add-host。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

以上會在此服務的內部容器中 /etc/hosts 建立一個具有 ip 地址和主機名的對映關係:

162.242.195.82  somehost
50.31.209.229   otherhost

10)networks

配置容器連線的網路,引用頂級 networks 下的條目 。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
      other-network:
        aliases:
         - alias2
networks:
  some-network:
    # Use a custom driver
    driver: custom-driver-1
  other-network:
    # Use a custom driver which takes special options
    driver: custom-driver-2

11)entrypoint

指定服務容器啟動後執行的入口檔案。

12)user

指定容器中執行應用的使用者名稱。

13)working_dir

指定容器中工作目錄。

14)restart

restart:

  • no:是預設的重啟策略,在任何情況下都不會重啟容器。
  • always:容器總是重新啟動。
  • on-failure:在容器非正常退出時(退出狀態非0),才會重啟容器。
  • unless-stopped:在容器退出時總是重啟容器,但是不考慮在Docker守護程序啟動時就已經停止了的容器
restart: "no"
restart: always
restart: on-failure
restart: unless-stopped

指定容器退出後的重啟策略為始終重啟。該命令對保持服務始終執行十分有效,在生產環境 中推薦配置為 always 或者 unless-stopped 。

restart: always

注:swarm 叢集模式,請改用 restart_policy。

15)aliases

aliases :同一網路上的其他容器可以使用服務名稱或此別名來連線到對應容器的服務。

services:
  some-service:
    networks:
      some-network:
        aliases:
         - alias1
         - alias3
      other-network:
        aliases:
         - alias2

16)healthcheck

用於檢測 docker 服務是否健康執行。

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"] # 設定檢測程式
      interval: 1m30s # 設定檢測間隔
      timeout: 10s # 設定檢測超時時間
      retries: 3 # 設定重試次數
      start_period: 40s # 啟動後,多少秒開始啟動檢測程式

17)env_file

從檔案新增環境變數。可以是單個值或列表的多個值。

env_file: .env

也可以是列表格式:

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

18)Compose中的環境變數

你可以使用.env檔案設定docker-compose.yml中使用的變數:

version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "${HOST_PORT}:80"

.env檔案:

HOST_PORT=8080

5、volumes 配置指令

將主機的資料卷或者檔案掛載到容器裡。

version: "3.8"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

資料卷所掛載路徑設定。可以設定宿主機路徑 (HOST:CONTAINER) 或加上訪問模式 (HOST:CONTAINER:ro)。

該指令中路徑支援相對路徑:

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

6、networks 配置指令

1)未顯式宣告網路環境

使用docker-compose up啟動容器後,這些容器都會被加入app_default網路中。使用docker network ls可以檢視網路列表,docker network inspect 可以檢視對應網路的配置。

version: '3'
services:
  web:
    mage: nginx:latest
    container_name: web
    depends_on:
      - db
    ports:
      - "9090:80"
    links:
      - db
  db:
    image: mysql
    container_name: db

2)networks關鍵字指定自定義網路

例如:下面的docker-compose.yml檔案,定義了front和back網路,實現了網路隔離。其中proxy和db之間只能透過app來實現通訊。其中,custom-driver-1並不能直接使用,你應該替換為host, bridge, overlay等選項中的一種。

version: '3.8'

services:
  proxy:
    build: ./proxy
    networks:
      - front
  app:
    build: ./app
    networks:
      - front
      - back
  db:
    image: postgres
    networks:
      - back

networks:
  front:
    # Use a custom driver
    driver: custom-driver-1
  back:
    # Use a custom driver which takes special options
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"

3)配置預設網路

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres

networks:
  default:
    # Use a custom driver
    driver: custom-driver-1

4)使用已存在的網路

networks:
  default:
    external:
      name: my-pre-existing-network

五、最佳實踐

  • 保持docker-compose.yml簡潔:使用多個檔案來分離開發和生產配置。
  • 版本控制:將你的docker-compose.yml放入版本控制系統中,以管理跨環境的配置。
  • 使用命名卷:確保資料在容器重啟後依然存在。
version: '3.8'  # 指定Compose檔案的版本

services:  # 定義多個服務
  web:  # Web服務,通常是前端或後端的應用
    image: nginx:latest  # 使用Nginx映象
    ports:
      - "80:80"  # 將容器的80埠對映到主機的80埠
    volumes:
      - ./web:/usr/share/nginx/html  # 掛載本地目錄到容器中
    environment:
      - NGINX_HOST=localhost  # 設定環境變數
      - NGINX_PORT=80
    networks:
      - frontend  # 連線到前端網路
    depends_on:
      - app  # 該服務將在'app'服務啟動後才啟動
    restart: always  # 在容器崩潰後總是重啟

  app:  # 應用服務,可以是任何語言的後端服務
    build:  # 從Dockerfile構建映象
      context: ./app  # Dockerfile所在的目錄
      dockerfile: Dockerfile  # 使用的Dockerfile名稱
    ports:
      - "3000:3000"  # 將容器的3000埠對映到主機的3000埠
    volumes:
      - ./app:/usr/src/app  # 掛載原生代碼目錄到容器中
    environment:
      - NODE_ENV=development  # 設定環境變數
      - PORT=3000
    networks:
      - frontend  # 連線到前端網路
      - backend  # 連線到後端網路
    depends_on:
      - db  # 該服務將在'db'服務啟動後才啟動
    restart: on-failure  # 僅在容器非正常退出時重啟

  db:  # 資料庫服務,使用MySQL
    image: mysql:5.7  # 使用MySQL 5.7映象
    volumes:
      - db_data:/var/lib/mysql  # 持久化MySQL資料到命名卷
    environment:
      MYSQL_ROOT_PASSWORD: example  # MySQL root使用者的密碼
      MYSQL_DATABASE: example_db  # 自動建立的資料庫名稱
      MYSQL_USER: user  # 建立的使用者名稱稱
      MYSQL_PASSWORD: password  # 使用者密碼
    networks:
      - backend  # 連線到後端網路
    restart: unless-stopped  # 僅在手動停止時不重啟

volumes:  # 定義命名卷,用於資料持久化
  db_data:  # MySQL資料卷

networks:  # 定義自定義網路
  frontend:  # 前端網路,連線web和app服務
  backend:  # 後端網路,連線app和db服務

本文部分內容參考博文:

  1、Docker Compose配置詳解:https://www.cnblogs.com/daikaiqiang/p/18382371

  2、Docker Compose 菜鳥教程:https://www.runoob.com/docker/docker-compose.html

至此本文就全部介紹完了,如果覺得對您有所啟發請記得點個贊哦!!!

此文由博主精心撰寫轉載請保留此原文連結:https://www.cnblogs.com/xyh9039/p/18540766

版權宣告:如有雷同純屬巧合,如有侵權請及時聯絡本人修改,謝謝!!!

相關文章