如何在Docker Swarm模式下让主机网络正常工作

6
从最近合并到docker 17.06版本的this PR中,我们现在可以支持使用swarm服务进行主机网络。然而,当我尝试使用非常类似的命令时,我看到了一个错误:
$ docker service create --name nginx-host --network host nginx                                                              
Error response from daemon: could not find the corresponding predefined swarm network: network host not found

我正在运行17.06版本的候选版:

$ docker version
Client:
 Version:      17.06.0-ce-rc2
 API version:  1.30
 Go version:   go1.8.3
 Git commit:   402dd4a
 Built:        Wed Jun  7 10:07:14 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.06.0-ce-rc2
 API version:  1.30 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   402dd4a
 Built:        Wed Jun  7 10:06:06 2017
 OS/Arch:      linux/amd64
 Experimental: true

我的命令与docker现在支持的有何不同?

2个回答

7

与docker开发人员讨论后,我们得知此功能需要在升级到17.06之后初始化swarm。在swarm init运行之前创建的主机和桥接网络无法与节点本地网络一起使用。由于这是一个测试环境,我重新创建了我的swarm:

$ docker swarm leave --force
Node left the swarm.

$ docker swarm init
Swarm initialized: current node (***) is now a manager.

...

现在,docker service create 命令可以正常工作:
$ docker service create --name nginx-host --network host nginx
i83udvgk0qga0k7toq4v7kh0x

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                                                                                             PORTS
i83udvgk0qga        nginx-host          replicated          1/1                 docker.io/library/nginx@sha256:41ad9967ea448d7c2b203c699b429abe1ed5af331cd92533900c6d77490e0268

为了验证,让我们检查容器内的网络接口:
$ docker ps | grep nginx
7024a2764b46        nginx               "nginx -g 'daemon ..."   16 hours ago        Up 16 hours                             nginx-host.1.i2blydombywzhz9zy06j8wrzf

$ docker exec 702 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether ***
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether ***
...

1
有没有办法从 yml 配置文件中获取 --network host 功能,而不是从命令行获取? - dev93
@dev93 你尝试过什么,遇到了什么错误?最好将其作为一个单独的问题发布。 - BMitch
2
当我在配置文件中添加“networks”参数时,Swarm部署会默默失败。我仍在寻找解决方案。也许像这个https://dev59.com/yl0a5IYBdhLWcg3wYn12#51741599一样。我的问题是将防火墙规则应用于Docker流量,并且使用主机网络只是我尝试探索的其中一条路径。 - dev93

1
是的 @dev93,有一种方法可以通过docker-compose文件(yml)使用主机网络来创建swarm服务。
version: "3.9"
services:  
  nginx:
    image: nginx
    networks:
      - outside

networks:
    outside:
      name: "host"
      external: true

如果你来到这里并且正在阅读这篇文章,你可能也想知道一旦你使用主机网络启动服务后,就无法再加入覆盖网络了。当使用主机时,不允许连接其他网络。

1
这并没有回答问题。一旦你拥有足够的声望,你就可以在任何帖子上发表评论;相反,提供不需要提问者澄清的答案。- 来自审核 - pmacfarlane
是的,这是对@dev03问题的回答。我的目标不是为了增加声望积分,我根本不在乎。你删除了一条非常重要的信息,可能会节省别人几个小时的搜索时间,这是你的责任。 - Kano
回答不是正确的地方来回应评论。需要回答的是BMitch提出的问题,而不是dev03。 - pmacfarlane
是的,有道理。 - Kano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接