docker1.13新功能network關註點
網絡
允許 docker run
連入指定的 swarm mode
的網絡
https://github.com/docker/docker/pull/25962
在 Docker 1.12 發布新的 Swarm Mode 之後,很多人都問過這樣的問題,怎麽才能讓 docker run
的容器連入 Swarm Mode 服務的 overlay
網絡中去?答案是不可以,因為 swarm
的 overlay
網絡是為了 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關註點