使用1.9,有没有办法直接用两个或多个网络接口启动容器?
您可以在使用“docker network connect”启动容器后执行此操作,但这意味着该进程已在运行,可能会错过创建新进程。
答案 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工具进行管理,请执行以下操作:
$ 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,将它们拿起,然后将其一端连接到容器,就可以了:
$ 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在发布功能方面做得很好。