docker1.13新功能network關注點

網絡 

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

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

在 Docker 1.12 發佈新的 Swarm Mode 以後,不少人都問過這樣的問題,怎麼才能讓 docker run 的容器連入 Swarm Mode 服務的 overlay 網絡中去?答案是不能夠,由於 swarm 的 overlay 網絡是爲了 swarm mode service 準備的,相對更健壯,而直接使用 docker run,會破壞了這裏面的安全模型。node

可是因爲你們需求不少,因而提供了一種折衷的辦法。1.13 容許創建網絡的時候,設定該網絡爲 attachable,容許以後的 docker run 的容器鏈接到該網絡上。nginx

咱們建立一個默認的、不容許以後 attach 的網絡:git

$ docker network create  -d overlay mynet1
xmgoco2vfrtp0ggc5r0p5z4mg

而後再建立一個容許 attach 的網絡,這裏會使用 1.13 新加入的 --attachable 參數:github

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

而後咱們啓動一個 web 服務,連入這兩個網絡:web

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

如今咱們用 docker run 啓動一個容器連入第一個網絡:docker

$ 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 因此這裏報錯了。ubuntu

在 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 映射模式:

ubuntu@d1:~$ docker service create --name web \
--publish mode=host,published=80,target=80 \
nginx

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

ubuntu@d1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
ntjybj51u6zp44akeawuf3i05 d2 Ready Active
tp7icvjzvxla2n18j3nztgjz6 d3 Ready Active
vyf3mgcj3uonrnh5xxquasp38 * d1 Ready Active Leader
ubuntu@d1:~$ 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 的話就會看到頁面:

root@d1:~$ curl localhost
curl: (7) Failed to connect to localhost port 80: Connection refused

root@d3:~$ curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
相關文章
相關標籤/搜索