【发布时间】:2016-03-10 16:32:09
【问题描述】:
在 1.9 中,有没有办法用两个或多个网络接口直接启动容器?
你可以在容器启动后使用“docker network connect”来做,但这意味着该进程已经在运行,可能会错过新的创建。
【问题讨论】:
-
docker service create --network frontend --network backend ...
在 1.9 中,有没有办法用两个或多个网络接口直接启动容器?
你可以在容器启动后使用“docker network connect”来做,但这意味着该进程已经在运行,可能会错过新的创建。
【问题讨论】:
docker service create --network frontend --network backend ...
这个问题是关于 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
【讨论】:
正如@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 中提供
【讨论】:
还有人在寻找这个问题的答案吗? 有两种解决方案可以做到这一点: 第一个是几乎完整的这里,但它确实适用于当前的 docker 版本 - 完整的教程可以在这里找到docker hub forum
解决方案 2 是在底层做所有事情。我已经包含了上面链接的详细评论部分,我也在这里复制: 由于 docker 也使用 linux 的网络命名空间,因此您也可以在底层执行此操作。不幸的是,Docker 试图对用户隐藏这一点,但名称空间仍然存在于底层。为了让它们被 ip netns 工具管理,请执行以下操作:
$ sudo docker inspect -f '{{.State.Pid}}' <container name>
<container name> 不是您的 label:tag 名称,它是容器启动后 docker 自动分配给它的名称 - 通过 docker ps 命令获取您的名称并查找最后一列 (NAME)。
$ 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://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 在发布功能时做得很好。
【讨论】:
不,这是不可能的。文档还显示必要的命令行选项 --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 是我想要使用的图像。