1. 程式人生 > >Docker compose網路

Docker compose網路

預設情況下,compose命令啟動時會建立一個網路,所有同一compose之下的容器例項都加入這個網路,它們之間可以互通,並且提供名稱服務,也就是不同服務之間可以通過名稱發現對方,如:

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

此時,web服務與db服務加入同一個網路,能互通,相互訪問時可以直接使用名稱,如web想訪問db,直接通過名字就可以,反之亦然。

關於更新

如果更新了其中某個服務,如它們使用的映象,則compose啟動時會重新建立容器例項,並重新分配地址。如果服務的名稱沒有變化,不同服務之間仍然可以通過名稱互通。

關於Link

link是容器互通的另一種方法。預設情況下compose中的服務會單獨分配IP地址,每個容器例項有自己獨立的網路棧。Link的本質是不同容器之間共享網路棧,如下程式碼:

version: "3"
services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres

執行時系統先為db服務分配IP地址,db有自己的網路棧。因為link的關係,web並不獨自分配地址,相反它共享db的網路棧,兩個容器例項共用一個IP地址。

多主機網路 

當在docker swarm中部署compose時,容器例項可能被部署到多個不同的節點上,此時預設網路就不適用了。需要一個跨主機的網路,這樣compose中的容器才能通訊,並且容器可能需要接入不同的網路以實現不同的連通與隔離。

首先在部署swarm時,至少需要提供一個跨主機的網路,也有可能是多個,多數是overlay網路,並且網路是有名稱的。在compose中定義服務時使用networks關鍵定明確指定其使用的網路名稱就可以。注意一點,swarm中跨主機網路覆蓋有多種解決方案,要看具體的網路是否支援DHCP,是否支援名稱服務,如:

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

使用一個已經存在的跨主機覆蓋網路。