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