天天看點

Docker 學習(十) Docker Compose 網絡設定基本概念更新容器links指定自定義網絡配置預設網絡使用已存在的網絡

文章目錄

  • 基本概念
  • 更新容器
  • links
  • 指定自定義網絡
  • 配置預設網絡
  • 使用已存在的網絡

基本概念

Docker Compose 的網絡特性适用于 Version 2 file format 以及更高版本中, Version 1 file format 不支援該特性。

預設情況下 Compose 會為應用建立一個預設的網絡,服務的每個容器都會加入該網絡中。這樣容器就可以被該網絡中的其他容器通路,不僅如此,該容器還能以服務名稱作為 hostname 被其他容器通路。

預設情況下,應用程式的網絡名稱基于 Compose 的工程名稱,為 工程_default 的格式。如需使用指定的工程名稱可使用

-p, --project-name NAME

來指定,例如:

docker-compose -p wkk up

。或 COMPOSE_PORJECT_NAME 環境變量。這裡的環境變量是系統的環境變量,比如我現在使用的是 windows 10 那麼就是 windows 10 的環境變量。還有如果是之前已經在一個目錄建構過了 Docker Compose 那麼再次建構,這個環境變量是不生效的。

使用

docker network ls

指令可以檢視所有的網絡:

Docker 學習(十) Docker Compose 網絡設定基本概念更新容器links指定自定義網絡配置預設網絡使用已存在的網絡

其中 bridge , host , none 。是 Docker 預設給建立的網絡。target_default 是我們之前執行 Docker Compose 建立的網絡。使用

docker network rm 網絡ID

的方式可以删除指定的網絡。其中 DRIVER 是網絡驅動,bridge 是預設的網絡驅動。

在我的了解中,Docker 的網絡模式實際上就是網絡驅動, none 模式就可以了解成一個是沒有網絡驅動的網絡。我覺得如果抛去網絡模式的概念可能要容易了解很多。我一開始就被網絡,網絡模式,網絡驅動給繞的有點迷糊。個人見解,如果有不對的地方,歡迎指出。

Docker 網絡相關的官網位址:https://docs.docker.com/network/

舉個栗子,假如一個應用程式在 myapp 的目錄中,并且 docker-compose.yml如下所示:

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

當運作 docker-compose up 時,将執行一下步驟:

  1. 建立一個名為 myapp_default 的網絡
  2. 使用 web 服務的配置建立容器,它以 “web” 這個名稱加入 myapp_default
  3. 使用 db 服務的配置建立容器,以 “db” 這個名稱加入 myapp_default

容器之間可使用服務名稱(web 或 db) 作為 hostname 互相通路。例如,web 這個服務可使用 postgres://db:5432 通路 db 容器。

更新容器

當服務的配置發生更改時,可使用 docker-compose up 指令更新配置。

此時, Compose 會删除舊容器并建立新容器。新容器會以不同的 IP 位址加入網絡,名稱保持不變。任何指向舊容器的連接配接都會被關閉,容器會重新找到新容器并連接配接上去。

links

預設情況下在 Docker Compose 中,容器之間可以使用服務名稱作為 hostname 互相通路,這一點有些和微服務中有點類似,在 Spring Cloud 中使用了 Rabbon 之後就可在微服務之間通過微服務名稱來互相通路。 這個 links 屬性就是給服務設定别名,用這個别名來作為 hostname 在容器之間互相通路。

栗子:

version: '3'
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres
           

這樣 web 服務就給 db 服務設定了别名為 database 。并且可以通過 database 作為 hostname 通路 db 服務。

指定自定義網絡

如果預設的情況滿足不了我們的需求,可以使用 networks 指令來自定義網絡以及網絡驅動。networks 還可以連接配接 Docker Compose 外部的網絡。

栗子:

version: "3"
services:
  proxy:
    build: ./proxy
    networks:
      - frontend
  app:
    build: ./app
    networks:
      - frontend
      - backend
  db:
    image: postgres
    networks:
      - backend

networks:
  frontend:
    # 使用自定義的網絡驅動
    driver: custom-driver-1
  backend:
    # 使用帶有特殊選項的自定義網絡驅動
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
           

這段示例就是從 Docker Compose 官方提供的。看起來也很好了解。首先定義了三個服務,proxy、app、db。以及定義了兩個網絡frontend、backend。frontend 使用的網絡驅動是自定義的 custom-driver-1 ,backend 使用的驅動是 custom-driver-2。

proxy 加入了 frontend 網絡, db 加入了 backend 網絡 ,app 則是兩個網絡都加入了。是以 proxy 和 db 之間有網絡隔離,不能互相通信,隻有 app 能同時和二者通信。

version: '3.5'
services:
  eureka: # 指定服務名稱
    build: . # Dockerfile 的路徑
    networks:
      - frontend
    ports:
      - "8761:8761" 

networks:
  frontend:
    name: custom_frontend
           

在 3.5 版本之後可以使用 name 自定義網絡的名稱。如果不指定網絡名稱,那麼在上文中,網絡名稱就是:target_frontend 的格式。其中 target 是工程名稱,預設是 docker-compose.yml 所在檔案夾的名稱。

配置預設網絡

使用 networks 對預設網絡進行配置:

networks:
  default:
    name: mynetwork
    driver: custom-driver-2
    driver_opts:
      foo: "1"
      bar: "2"
           

配置都是一樣的,是以不做贅述

使用已存在的網絡

如果不需要建立網絡而是加入已存在的網絡,可以使用一下配置:

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

external 表示使用外部的網絡。name 指定外部網絡的名稱。