天天看點

docker1.13新功能上要關注的點網絡 

如果要作單點端口映射,則需要結合constraint和label來定位具體的proxy機器吧。

如果不用這種模式,,ingress确實又太浪費叢集端口了。。

糾結,,看看如何和compose v3作很好的結合吧。。

阿西巴~~~~

=================

https://blog.lab99.org/post/docker-2016-11-14-what-is-new-in-docker-1-13.html#yun-xu-docker-service-create-ying-she-su-zhu-duan-kou-er-bu-shi-bian-jie-fu-zai-jun-heng-wang-luo-duan-kou

<a href="https://github.com/docker/docker/pull/25962" target="_blank">https://github.com/docker/docker/pull/25962</a>

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

但是由于大家需求很多,于是提供了一種折衷的辦法。1.13 允許建立網絡的時候,設定該網絡為 <code>attachable</code>,允許之後的 <code>docker run</code> 的容器連接配接到該網絡上。

我們建立一個預設的、不允許之後 <code>attach</code> 的網絡:

$ docker network create -d overlay mynet1

xmgoco2vfrtp0ggc5r0p5z4mg

然後再建立一個允許 <code>attach</code> 的網絡,這裡會使用 1.13 新加入的 <code>--attachable</code> 參數:

$ docker network create -d overlay --attachable mynet2

yvcyhoc6ni0436jux9azc4cjt

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

$ docker service create \

--name web \

--network mynet1 \

--network mynet2 \

nginx

vv91wd7166y80lbl833rugl2z

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

$ 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.

由于 <code>mynet1</code> 不允許手動 <code>attach</code> 是以這裡報錯了。

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

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'.

不過,<code>--attachable</code> 實際上是将網絡的安全模型打開了一個缺口,是以這不是預設設定,而且并不推薦使用。使用者在使用這個選項建立網絡的時候,一定要知道自己在做什麼。

<a href="https://github.com/docker/docker/pull/27917" target="_blank">https://github.com/docker/docker/pull/27917</a>

<a href="https://github.com/docker/docker/pull/28943" target="_blank">https://github.com/docker/docker/pull/28943</a>

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

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

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

現在 <code>--publish</code> 的新的參數形式和 <code>--mount</code> 差不多。參數值為 <code>,</code> 逗号分隔的鍵值對,鍵值間以 <code>=</code> 等号分隔。目前支援 4 項内容:

<code>protocol</code>: 支援 <code>tcp</code> 或者 <code>udp</code>

<code>mode</code>: 支援 <code>ingress</code> 或者 <code>host</code>

<code>target</code>: 容器的端口号

<code>published</code>: 映射到宿主的端口号

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

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

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

ubuntu@d1:~$ docker service create --name web \

--publish mode=host,published=80,target=80 \

運作成功後,檢視一下服務容器運作的節點:

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-&gt;80/tcp

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

但是,<code>host</code> 模式不同,它隻映射容器所在宿主的端口。是以,如果我們 <code>curl d1</code> 的話,應該什麼看不到網頁,而 <code>curl d3</code> 的話就會看到頁面:

root@d1:~$ curl localhost

curl: (7) Failed to connect to localhost port 80: Connection refused

root@d3:~$ curl localhost

&lt;!DOCTYPE html&gt;

&lt;html&gt;

&lt;head&gt;

&lt;title&gt;Welcome to nginx!&lt;/title&gt;

...

繼續閱讀