CodeGym /Adesua ahorow /Docker SELF /掛載卷與網路

掛載卷與網路

Docker SELF
等級 16 , 課堂 1
開放

7.1 挂載卷

在 Docker Compose 中挂載卷和網路可以幫助你創建靈活且高效的多容器應用。卷(volumes)用於存儲需要保存在容器外部的數據,而網路(networks)可以實現容器之間的互動。在這篇講座中,我們會詳細討論如何在 Docker Compose 中使用卷和網路。

Docker 中的卷允許數據保存在容器外,即使容器停止或者刪除後,數據仍然可以使用。這對於需要長期保存的數據如數據庫數據、日志文件等特別有用。

卷的類型:

  • 命名卷 (Named Volumes): 由 Docker 管理,保存在主機的特定目錄中。
  • 綁定卷 (Bind Mounts): 從主機的指定目錄挂載到容器中。

在 Docker Compose 中設定卷

命名卷的範例

在這個範例中,創建了一個命名卷 postgres-data,並將其挂載到容器 db 的目錄 /var/lib/postgresql/data 中。

Yaml

version: '3.8'

services:
  db:
    image: postgres:latest
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

綁定卷的範例

在這個範例中,本地的目錄和文件 nginx.confhtml 被作為綁定卷挂載到容器 web 中。

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html

7.2 挂載網路

Docker Compose 中的網路讓容器彼此互通。每個容器都可以被連接到一個或多個網路,從而提供隔離和流量管理的功能。

網路類型:

  • 橋接網路 (Bridge): 默認情況下,容器會連接到橋接網路,這樣可以讓它們在同一台主機上交互。
  • 覆蓋網路 (Overlay): 用於在 Docker Swarm 集群中,不同主機之間啟動的容器之間的互動。
  • 網路插件 (Network Plugins): 允許使用第三方網路驅動以配置更複雜的場景。

自定義網路的創建和使用範例

在這個範例中,我們創建了兩個自定義網路 front-endback-end。服務 app 被連接到兩個網路,服務 web 只連接到 front-end,而服務 db 只連接到 back-end

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    networks:
      - front-end

  app:
    image: myapp:latest
    networks:
      - front-end
      - back-end

  db:
    image: postgres:latest
    networks:
      - back-end

networks:
  front-end:
  back-end:

實用建議:

  1. 使用命名卷: 命名卷由 Docker 管理,使用起來方便、易於管理資料。命名卷可以同時連接多個服務。例如,後端服務記錄日誌,而監控服務分析這些日誌,並在發現 error 級別的錯誤時發出通知。
  2. 網路隔離: 使用多個網路可以隔離應用程序的不同部分並控制它們的交互。
  3. 配置文件存儲: 使用綁定卷來掛載配置文件,這樣可以輕鬆修改配置而無需重新構建映像。
  4. 網路安全性: 限制對網路的訪問,讓只有必要的容器才能交互,這樣能提高應用的安全性。

7.3 卷和網路的使用範例

在 Docker Compose 中使用卷和網路的範例:

範例 1: 包含網頁伺服器和資料庫的應用程式

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    networks:
      - webnet

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - webnet

volumes:
  db-data:

networks:
  webnet:

在這個範例中:

  • 網頁伺服器 nginx 和資料庫 PostgreSQL 連接到同一個網路 webnet,這使得它們可以互相通信。如果只有一個網路,可以不指定 —— 系統會自動建立一個預設網路。
  • 資料庫的數據儲存在命名卷 db-data 中,這樣在重啟容器時數據仍能被保存。

範例 2: 多層應用程式

Yaml

version: '3.8'

services:
  frontend:
    image: myfrontend:latest
    networks:
      - front-tier
      - back-tier

  backend:
    image: mybackend:latest
    networks:
      - back-tier
    volumes:
      - backend-data:/var/lib/backend

  database:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - back-tier

volumes:
  backend-data:
  db-data:

networks:
  front-tier:
  back-tier:

在這個範例中:

  • 建立了兩個網路:front-tierback-tier
  • 服務 frontend 連接到兩個網路,這使得它可以和 backend 以及外部客戶端進行通信。
  • 服務 backenddatabase 僅連接到網路 back-tier,以確保它們的隔離和互動。
  • 服務 backenddatabase 的數據分別存儲在命名卷 backend-datadb-data 中。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION