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