天天看點

Docker系列教程24-Docker Compose網絡設定基本概念更新容器links指定自定義網絡配置預設網絡使用已存在的網絡

原文: http://www.itmuch.com/docker/24-docker-compose-network/ ,轉載請說明出處。

本節我們來詳細探讨Compose的網絡設定。本節介紹的網絡特性僅适用于Version 2 file format,Version 1 file format不支援該特性。

基本概念

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

預設情況下,應用程式的網絡名稱基于Compose的工程名稱,而項目名稱基于docker-compose.yml所在目錄的名稱。如需修改工程名稱,可使用--project-name辨別或COMPOSE_PORJECT_NAME環境變量。

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

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

當我們運作docker-compose up時,将會執行以下幾步:

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

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

postgres://db:5432

通路db容器。

更新容器

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

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

links

前文講過,預設情況下,服務之間可使用服務名稱互相通路。links允許我們定義一個别名,進而使用該别名通路其他服務。舉個例子:

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

這樣web服務就可使用db或database作為hostname通路db服務了。

指定自定義網絡

一些場景下,預設的網絡配置滿足不了我們的需求,此時我們可使用networks指令自定義網絡。networks指令允許我們建立更加複雜的網絡拓撲并指定自定義網絡驅動和選項。不僅如此,我們還可使用networks将服務連接配接到不是由Compose管理的、外部建立的網絡。

如下,我們在其中定義了兩個自定義網絡。

version: '2'

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"
           

其中,proxy服務與db服務隔離,兩者分别使用自己的網絡;app服務可與兩者通信。

由本例不難發現,使用networks指令,即可友善實作服務間的網絡隔離與連接配接。

配置預設網絡

除自定義網絡外,我們也可為預設網絡自定義配置。

version: '2'

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

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

這樣,就可為該應用指定自定義的網絡驅動。

使用已存在的網絡

一些場景下,我們并不需要建立新的網絡,而隻需加入已存在的網絡,此時可使用external選項。示例:

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