启动具有多个网络接口的容器

时间:2015-12-05 20:22:02

标签: docker docker-networking

使用1.9,有没有办法直接用两个或多个网络接口启动容器?

您可以在使用“docker network connect”启动容器后执行此操作,但这意味着该进程已在运行,可能会错过创建新进程。

5 个答案:

答案 0 :(得分:40)

这个问题是关于docker和多个网络接口的搜索。虽然不是问题中的必需版本,但我在这里留下了一些信息:

使用Docker 1.12+,可以为docker容器添加多个网络接口,但需要首先创建容器,然后在启动容器之前连接第二个(和子序列)网络NIC:

$ docker create --network=network1 --name container_name containerimage:latest
$ docker network connect network2 container_name
$ docker start container_name

首先需要创建网络:

$ docker network create --driver=bridge network1 --subnet=172.19.0.0/24
$ docker network create --driver=bridge network2 --subnet=172.19.1.0/24

此外,您可以使用docker run中的--network = host参数启动连接dockerhost网络接口的容器:

$ docker run --net=host containerimage:latest

答案 1 :(得分:5)

正如@gesellix回答的那样,目前还不可能。

您可以在下面找到此问题 https://github.com/docker/docker/issues/17750

这方面有一些待定的改进。 正如我从讨论中看到的那样 - 当前的想法是创建容器(使用docker create),连接网络(docker network connect)然后启动(docker start)。

您可以在https://github.com/docker/docker/pull/17796

的评论中查看推理

UPD:#17750已关闭,可在1.10

中使用

答案 2 :(得分:1)

不,这是不可能的。文档还显示必需的命令行选项--net仅接受单个网络名称:http://docs.docker.com/engine/reference/run/#network-settings

还请记住,Docker 1.9会不断更新容器中的/etc/hosts文件,以便正在运行的进程不能依赖该文件的初始状态。最好的方法是让您的进程了解更新,方法是手动读取/etc/hosts文件或查询DNS服务器。这样,当第二个网络连接时,您就不会遇到问题。

答案 3 :(得分:1)

有人还在寻找这个问题的答案吗? 有两种解决方案: 首先是这里几乎全部详细介绍的内容,但是它可以与当前的docker版本一起使用-完整的教程可以在此处找到docker hub forum

解决方案2是在底层进行所有操作。我已经在上面的链接中加入了详细评论部分,我也将其复制到此处: 由于docker也使用linux的网络名称空间,因此您也可以在底层进行此操作。不幸的是,Docker试图向用户隐藏此名称,但名称空间仍然存在。为了使它们由ip netns工具进行管理,请执行以下操作:

  1. 获取正在运行的容器的进程ID(pid):

$ sudo docker inspect -f '{{.State.Pid}}' <container name>

<container name>不是您的label:tag名称,它是容器启动后docker自动为其分配的名称-通过docker ps命令获取您的名称并查找最后一列(NAME)。

  1. 创建从/ proc /文件系统到/ var / run /的符号链接 2.1。首先,在/ var / run /中创建一个netns目录 $ sudo mkdir -p /var/run/netns

2.2。使用刚刚获得的PID,创建符号链接 $ sudo ln -sf /proc/<PID>/ns/net /var/run/netns/<YOUR DESIRED NETNS NAME FOR YOU CONTAINER>

现在,如果执行ip netns list,将看到容器的网络名称空间。

从现在开始,没有docker专用的东西,只需创建一对veth,将它们拿起,然后将其一端连接到容器,就可以了: $ sudo ip link add veth1_container type veth peer name veth1_root

$ sudo ifconfig veth1_container up

$ sudo ifconfig veth1_root up

$ sudo ip link set veth1_container netns <YOUR NETNS NAME>

$ sudo ip netns exec <YOUR NETNS NAME> ifconfig veth1_container up

最后一个命令可能有点复杂,但是由于缺少权限,似乎无法在容器中本地显示此接口:)

请注意,也可以按照解决方案1中所示的相同方式更改MAC地址,然后再将其附加到容器上,或者之后-没关系,只需要使用不同的命令即可(请回想一下权限问题上面刚刚提到的。)

希望对您有帮助。

答案 4 :(得分:0)

这应该回答您的问题: https://success.docker.com/article/multiple-docker-networks

上面文章中给出的示例:

    STEP 1:
    ## Create Networks ##
    docker network create bluenet
    docker network create rednet`

    STEP 2a: (automatically running)
    ## Create (1) Container in background called "c1" running busybox image ##
    docker run -itd --net bluenet --name c1 busybox sh

    STEP 2b: (created only to run later)
    ## Create (1) Container (notice no run flag - it is only created) ##
    docker create -it --net bluenet --name c1 busybox sh

    STEP 3:
    ## Attach remaining Network ##
    docker network connect rednet c1
    docker start c1

Docker在发布功能方面做得很好。