在 1.9 中,有没有办法用两个或多个网络接口直接启动容器?
您可以在使用“docker network connect”启动容器后执行此操作,但这意味着该进程已经在运行,并且可能会错过新进程的创建。
在 1.9 中,有没有办法用两个或多个网络接口直接启动容器?
您可以在使用“docker network connect”启动容器后执行此操作,但这意味着该进程已经在运行,并且可能会错过新进程的创建。
这个问题是关于 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的评论中检查推理
UPD: #17750 已关闭,将在 1.10 中提供
有人还在寻找这个问题的答案吗?有两种解决方案可以做到这一点:第一种是这里几乎完全详细的解决方案,但它确实适用于当前的 docker 版本 - 完整的教程可以在这里找到docker hub 论坛
解决方案 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 服务器让您的进程知道更新。这样,当连接第二个网络时,您就不会遇到问题。