1. 程式人生 > >docker1.13新功能network關註點

docker1.13新功能network關註點

推薦 html 建立 body ble red tcp 答案 保持

網絡

允許 docker run 連入指定的 swarm mode 的網絡

https://github.com/docker/docker/pull/25962

在 Docker 1.12 發布新的 Swarm Mode 之後,很多人都問過這樣的問題,怎麽才能讓 docker run 的容器連入 Swarm Mode 服務的 overlay 網絡中去?答案是不可以,因為 swarmoverlay 網絡是為了 swarm mode service 準備的,相對更健壯,而直接使用 docker run,會破壞了這裏面的安全模型。

但是由於大家需求很多,於是提供了一種折衷的辦法。1.13 允許建立網絡的時候,設定該網絡為 attachable

,允許之後的 docker run 的容器連接到該網絡上。

我們創建一個默認的、不允許之後 attach 的網絡:

$ docker network create -d overlay mynet1 xmgoco2vfrtp0ggc5r0p5z4mg

然後再創建一個允許 attach 的網絡,這裏會使用 1.13 新加入的 --attachable 參數:

$ docker network create -d overlay --attachable mynet2 yvcyhoc6ni0436jux9azc4cjt

然後我們啟動一個 web 服務,連入這兩個網絡:

$ docker service create \ --name web \ --network mynet1 \ --network mynet2 \ nginx vv91wd7166y80lbl833rugl2z

現在我們用 docker run 啟動一個容器連入第一個網絡:

$ docker run -it --rm --network mynet1 busybox docker: Error response from daemon: Could not attach to network mynet1: rpc error: code = 7 desc = network mynet1 not manually attachable.

由於 mynet1 不允許手動 attach 所以這裏報錯了。

在 1.12 的情況下,會報告該網絡無法給 docker run 使用:

docker: Error response from daemon: swarm-scoped network (mynet1) is not compatible with `docker create` or `docker run`. This network can only be used by a docker service. See ‘docker run --help‘.

不過,--attachable 實際上是將網絡的安全模型打開了一個缺口,因此這不是默認設置,而且並不推薦使用。用戶在使用這個選項建立網絡的時候,一定要知道自己在做什麽。

允許 docker service create 映射宿主端口,而不是邊界負載均衡網絡端口

https://github.com/docker/docker/pull/27917
https://github.com/docker/docker/pull/28943

docker service create 中的 --publish 格式有進一步的變化。(在 1.13 的 RC 期間,曾經去掉 --publish,改為 --port,經過討論後,決定保持一致性,繼續使用 --publish,不使用新的 --port 選項。)

在 1.12 中,docker service create 允許使用參數 --publish 80:80 這類形式映射邊界(ingress)網絡的端口,這樣的映射會享受邊界負載均衡,以及 routing mesh。

從 1.13 開始,增加另一種映射模式,被稱為 host 模式,也就是說,用這種模式映射的端口,只會映射於容器所運行的主機上。這就和一代 Swarm 中一樣了。雖然失去了邊界負載均衡,但是確定了映射點,在有的時候這種情況是需要的。

現在 --publish 的新的參數形式和 --mount 差不多。參數值為 , 逗號分隔的鍵值對,鍵值間以 = 等號分隔。目前支持 4 項內容:

  • protocol: 支持 tcp 或者 udp
  • mode: 支持 ingress 或者 host
  • target: 容器的端口號
  • published: 映射到宿主的端口號

比如,與 -p 8080:80 等效的 --publish 新格式選項為:

--publish protocol=tcp,mode=ingress,published=8080,target=80

當然我們可以繼續使用 -p 8080:80,但是新的選項格式增加了更多的可能。比如,使用 1.13 開始加入的 host 映射模式:

[email protected]:~$ docker service create --name web \ --publish mode=host,published=80,target=80 \ nginx

運行成功後,查看一下服務容器運行的節點:

[email protected]:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ntjybj51u6zp44akeawuf3i05 d2 Ready Active tp7icvjzvxla2n18j3nztgjz6 d3 Ready Active vyf3mgcj3uonrnh5xxquasp38 * d1 Ready Active Leader [email protected]:~$ docker service ps web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 5tij5sjvfpsf web.1 nginx:latest d3 Running Running 5 minutes ago *:80->80/tcp

我們可以看到,集群有3個節點,而服務就一個副本,跑到了 d3 上。如果這是以前的使用邊界負載均衡的網絡 ingress 的話,那麽我們訪問任意節點的 80 端口都會看到頁面。

但是,host 模式不同,它只映射容器所在宿主的端口。因此,如果我們 curl d1 的話,應該什麽看不到網頁,而 curl d3 的話就會看到頁面:

[email protected]:~$ curl localhost curl: (7) Failed to connect to localhost port 80: Connection refused

[email protected]:~$ curl localhost <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...

docker1.13新功能network關註點