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

Rob*_*ert 31 docker docker-networking

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

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

小智 43

这个问题是关于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
Run Code Online (Sandbox Code Playgroud)

首先需要创建网络:

$ docker network create --driver=bridge network1 --subnet=172.19.0.0/24
$ docker network create --driver=bridge network2 --subnet=172.19.1.0/24
Run Code Online (Sandbox Code Playgroud)

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

$ docker run --net=host containerimage:latest
Run Code Online (Sandbox Code Playgroud)


cs.*_*lev 8

有人还在寻找这个问题的答案吗?\n有 2 个解决方案可以做到这一点:\n第一个是这里几乎完全详细的解决方案,但它确实适用于当前的 docker 版本 - 可以在此处找到完整的教程docker hub 论坛

\n

解决方案2是把所有事情都放在最底层。我已经包含了上面链接的详细注释部分,我也将其复制到此处:\n由于 docker 也使用 linux\xe2\x80\x99s 网络命名空间,因此您也可以在底层执行此操作。不幸的是,Docker 试图向用户隐藏这一点,但命名空间仍然存在于幕后。为了让它们由 ip netns 工具管理,请执行以下操作:

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

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

\n

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

\n
    \n
  1. 创建从 /proc/ 文件系统到 /var/run/ 的符号链接
  2. \n
\n

2.1. 首先,在/var/run/中创建一个netns目录

\n
$ sudo mkdir -p /var/run/netns\n
Run Code Online (Sandbox Code Playgroud)\n

2.2. 使用刚刚获得的 PID,创建符号链接

\n
$ sudo ln -sf /proc/<PID>/ns/net /var/run/netns/<YOUR DESIRED NETNS NAME FOR YOU CONTAINER>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

从现在开始,没有 docker 特定的东西,只需创建一对 veth,将它们启动,并将其一端连接到容器就可以了:

\n
$ sudo ip link add veth1_container type veth peer name veth1_root\n$ sudo ifconfig veth1_container up\n$ sudo ifconfig veth1_root up\n$ sudo ip link set veth1_container netns <YOUR NETNS NAME>\n$ sudo ip netns exec <YOUR NETNS NAME> ifconfig veth1_container up\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

我希望它有帮助。

\n

  • @Eksapsy 为什么你会对唯一真正回答问题的人投反对票?这个问题并不是在简单或最佳实践的背景下提出的;但问题得到了解答。 (3认同)

Ale*_*lex 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中提供


小智 5

这应该回答您的问题: 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
Run Code Online (Sandbox Code Playgroud)

Docker 在功能推出时在记录功能方面做得非常出色。


ges*_*lix 1

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

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