CodeGym /Adesua ahorow /Docker SELF /創建 docker-compose.yml

創建 docker-compose.yml

Docker SELF
等級 15 , 課堂 2
開放

3.1 檔案 compose.yaml

檔案 compose.yaml (或者以下幾種變體之一:docker-compose.yaml, docker-compose.yml, compose.yml)是 Docker Compose 使用來定義和管理多容器應用程式的主要配置檔案。它描述了哪些容器(服務)需要運行,它們如何相互作用,以及它們需要哪些資源。

為了統一,在這次講課中我們會使用 compose.yaml 的版本,因為它是現代版本 Docker Compose 的推薦形式。

compose.yaml 檔案結構

compose.yaml 檔案由多個部分組成,每個部分描述應用程式配置的不同方面。主要部分包括:

  1. version: 指定 Compose 檔案的版本(例如,'3.9')。
  2. services: 描述容器(服務)、它們的設置及相互依賴關係。
  3. volumes: 定義容器和主機之間的資料存儲卷。
  4. networks: 配置服務之間通信所使用的網絡。

3.2 基本指令

1. version

指令 version 用於定義在 compose.yaml 檔案中使用的 Docker Compose 語法版本。到撰寫本文時,最流行的是版本 3,特別是它的更新,例如 3.8 和 3.9。

Yaml

version: '3.9'

2. services

services 區塊定義 Compose 應該建立並啟動的容器。每個服務代表一個具有特定配置的獨立容器。

範例:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

在此範例中,定義了兩個服務:webdb。服務 web 使用 nginx:latest 映像檔並開啟 80 端口。服務 db 使用 mongo:latest 映像檔並掛載一個用於存儲資料的卷。

3. volumes

volumes 區塊用於定義可以掛載到容器上的卷以存儲數據。這在重新啟動容器時保存資料非常有用。

範例:

Yaml

volumes:
  mongo-data:

4. networks

networks 區塊允許定義容器運行的自定義網路。這提供了隔離和網路連接的配置。如果未指定網路,Docker Compose 會創建預設網路,所有服務都將連接到該網路。

範例:

Yaml

networks:
  front-end:
  back-end:

3.3 配置服務的指令

配置服務的主要指令:

1. image

image 指令指定將用於創建容器的映像。

範例:

Yaml

services:
  web:
    image: nginx:latest

2. build

build 指令用於指定應用於構建映像的 Dockerfile 路徑。

範例:

Yaml

services:
  app:
    build: ./app

3. ports

ports 指令定義必須開啟的端口並從主機機器重定向到容器的端口。

範例:

Yaml

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

4. volumes

volumes 指令將卷掛載到容器中,這樣可以在容器重啟之間保存數據。

範例:

Yaml

services:
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db

5. environment

environment 指令為容器設置環境變數。

範例:

Yaml

services:
  app:
    image: myapp:latest
    environment:
      - NODE_ENV=production
      - API_KEY=1234567890

6. depends_on

depends_on 指令表明該服務依賴其他服務,應在它們啟動後啟動。

重要! 當啟動您的服務時,您無法 100% 保證所有必需的服務完全準備就緒。它們會被啟動——是的,但進一步的可操作性無法保證。此問題可通過 health-check 解決,但稍後我們會討論這個問題。

範例:

Yaml

services:
  web:
    image: nginx:latest
    depends_on:
      - db
  db:
    image: mongo:latest

7. command

command 指令允許覆蓋容器啟動時要執行的命令。

範例:

Yaml

services:
  app:
    image: myapp:latest
    command: python app.py

8. networks

networks 指令將服務連接到一個或多個網絡。

範例:

Yaml

services:
  web:
    image: nginx:latest
    networks:
      - front-end
  db:
    image: mongo:latest
    networks:
      - back-end

3.4 完整範例

完整檔案 compose.yaml 的範例

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    networks:
      - front-end
        
  app:
    build: ./app
    volumes:
      - ./app:/usr/src/app
    environment:
      - NODE_ENV=production
    networks:
      - front-end
      - back-end
        
  db:
    image: mongo:latest
    volumes:
      - mongo-data:/data/db
    networks:
      - back-end
        
volumes:
  mongo-data:
        
networks:
  front-end:
  back-end:

在這個範例中:

  • 定義了三個服務: webappdb
  • web 使用 Nginx 映像檔,掛載配置檔案,並依賴服務 app
  • app 是基於本地的 Dockerfile 建置,掛載應用程式原始碼並使用環境變數。
  • db 使用 MongoDB 映像檔並掛載數據存儲卷。
  • 建立了兩個卷和兩個網路來隔離和管理服務間的互動。

注意: 一個卷是 mongo-data,另一個是從主機掛載的目錄 (例如 ./app)。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION