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

Posted

技术标签:

【中文标题】启动具有多个网络接口的容器【英文标题】:Start container with multiple network interfaces 【发布时间】:2016-03-10 16:32:09 【问题描述】:

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

你可以在容器启动后使用“docker network connect”来做,但这意味着该进程已经在运行,可能会错过新的创建。

【问题讨论】:

docker service create --network frontend --network backend ... 【参考方案1】:

这个问题是关于 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.13.1 这不会创建多个网络接口,它只是将多个IP地址添加到eth0。【参考方案2】:

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

你可以在下面找到这个问题 https://github.com/docker/docker/issues/17750

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

你可以在https://github.com/docker/docker/pull/17796的cmets中检查推理

UPD:#17750 已关闭,将在 1.10 中提供

【讨论】:

如果我需要在同一个网络上拥有多个 IP 地址怎么办?网络连接只是将 ip 更改为另一个。【参考方案3】:

还有人在寻找这个问题的答案吗? 有两种解决方案可以做到这一点: 第一个是几乎完整的这里,但它确实适用于当前的 docker 版本 - 完整的教程可以在这里找到docker hub forum

解决方案 2 是在底层做所有事情。我已经包含了上面链接的详细评论部分,我也在这里复制: 由于 docker 也使用 linux 的网络命名空间,因此您也可以在底层执行此操作。不幸的是,Docker 试图对用户隐藏这一点,但名称空间仍然存在于底层。为了让它们被 ip netns 工具管理,请执行以下操作:

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

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

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

    创建从 /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 pair,将它们打开,并将它的一端附加到容器上,你就可以了: $ 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

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

请注意,MAC 地址也可以按照我在解决方案 1 中显示的相同方式更改,在将其附加到容器之前或之后 - 并不重要,只是需要使用不同的命令(回想一下权限问题上面提到过)。

希望对你有帮助。

【讨论】:

转到此处获取脚本,为您完成这方面的一切工作:https://github.com/cslev/add_veth_to_docker/ 手动方法的重要优点是它可以添加任何受支持类型的接口,而不仅仅是 veth(a.t.m. 我对 vcan 感兴趣)。 我要投反对票,因为您的回答只是......总体上过于设计和复杂。不仅仅是最后一个命令。它在不必要的情况下过于过度设计并且不符合良好的 docker 实践。我们使用 docker 的主要原因只是为了摆脱这一点。我看不出这将如何帮助某人而不是让他更加困惑,尤其是当这不是问题所要求的。该问题询问如何启动具有多个网络的 docker 容器,而无需稍后添加它们。而你在这里的技巧完全错过了重点。 @Eksapsy 你为什么要对唯一真正回答这个问题的人投反对票?这个问题不是在简单或最佳实践的背景下提出的;但问题得到了回答。 什么意思? :/ 一个不好的答案仍然是一个答案,我们有反对票和赞成票是有原因的。我还能用它们做什么?如果答案违反规则,我只会举报,不会投反对票。【参考方案4】:

这应该可以回答您的问题: 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 在发布功能时做得很好。

【讨论】:

【参考方案5】:

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

还请记住,Docker 1.9 会不断更新容器内的/etc/hosts 文件,因此正在运行的进程不能依赖该文件的初始状态。最好的方法是通过手动读取/etc/hosts 文件或通过查询dns 服务器让您的进程知道更新。这样,连接第二个网络时就不会出现问题。

【讨论】:

我可以肯定。我试过docker run -it --network bridge --network mynet /bin/bash——不走运,invalid reference format。还为选项 ... --network bridge mynet... 尝试了两个参数,但 Docker 认为 mynet 是我想要使用的图像。

以上是关于启动具有多个网络接口的容器的主要内容,如果未能解决你的问题,请参考以下文章

11、Docker的网络功能-配置容器网桥

K8S的网络接口CNI及灵雀云的实践

docker 网络

接口配置文件

#yyds干货盘点#--k8s-网络模型

docker——网络配置