53

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

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

4

5 回答 5

67

这个问题是关于 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
于 2016-09-08T14:11:47.117 回答
6

正如@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 中提供

于 2015-12-16T14:22:58.897 回答
4

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

解决方案 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 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 中显示的相同方式更改,在将其附加到容器之前或之后 - 并不重要,只是需要使用不同的命令(回想一下刚才提到的权限问题)。

我希望它有所帮助。

于 2018-06-29T11:07:24.783 回答
2

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

于 2019-11-09T19:17:46.077 回答
1

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

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

于 2015-12-07T01:10:03.510 回答