如何更改正在运行的Docker容器的网络?

48

我正在尝试更新正在运行的Docker容器的网络。

注意:在运行容器时我没有附加任何网络。

[root@stagingrbt ~]# docker network connect host cdf8d6e3013d
Error response from daemon: container sharing network namespace with another container or host cannot be connected to any other network

[root@stagingrbt ~]# docker network connect docker_gwbridge cdf8d6e3013d
error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/networks/docker_gwbridge/connect: EOF


[root@stagingrbt ~]# docker network create -d host my-host-network
Error response from daemon: only one instance of "host" network is allowed


[root@stagingrbt ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
495080cf93e3        bridge              bridge              local
cf0408d6f13f        docker_gwbridge     bridge              local
2c5461835eaf        host                host                local
87e9cohcbogh        ingress             overlay             swarm
84dbd78101e3        none                null                local
774882ac9b09        sudhirnetwork       bridge              local

1
你好,能否提供更多细节说明你想要实现什么?你正在尝试获取什么设置?根据错误信息,似乎docker不支持它。 - Mattias Wadman
如何更改正在运行的Docker容器的网络? - sudhir tataraju
抱歉,问题可能不太清楚。我的意思是,我认为您并没有以错误的方式使用命令来更改正在运行容器的网络设置,而是尝试以不受支持的方式进行更改。 - Mattias Wadman
5个回答

51

当您启动容器时,例如:

docker run -d --name alpine1 alpine

默认情况下,它连接到 bridge 网络,请使用以下命令进行检查:

docker container inspect alpine1

如果您尝试使用以下方式将其连接到 主机 网络:

docker network connect host alpine1

你遇到了一个错误:

Error response from daemon: container cannot be disconnected from host network or connected to host network

你需要删除容器并重新在主机网络上运行它:

docker stop alpine1
docker rm alpine1
docker run -d --network host --name alpine1 alpine

在桥接网络上不存在这种限制。您可以启动一个容器:

docker run -d --name alpine2 alpine

将其从桥接网络中断开,并重新连接到另一个桥接网络。

docker network disconnect bridge alpine2
docker network create --driver bridge alpine-net
docker network connect alpine-net alpine2

需要注意的是,根据文档

主机网络驱动程序仅适用于Linux主机,并且不支持Docker Desktop for Mac、Docker Desktop for Windows或Docker EE for Windows Server。


但如果我连接到桥接网络,我的运行中的Docker容器所有端口都不会暴露,而且因为我的Swarm在运行docker swarm leave命令后再次运行相同的命令,所以我遇到了下面的错误。[root@stagingrbt ~]# docker network connect docker_gwbridge cdf8d6e3013d 连接期间出错:Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/networks/docker_gwbridge/connect: EOF - sudhir tataraju
2
这应该被标记为答案。 - eco
我想强调,在docker network disconnect bridge alpine2命令中,“bridge”应该被替换为容器当前连接的Docker网络的名称。 - Speedy

7
如果您想绕过命令行并通过 Portainer 更改 Docker 容器的网络,可以这样做。我不确定最佳方法是什么,但以下步骤对我有效(将默认在桥接网络上运行的容器更改为主机网络):
  1. 在容器列表中,单击容器名称(例如我的是 emby)
  2. 停止容器
  3. 单击 复制/编辑
  4. 向下滚动到 高级容器设置 并选择网络选项卡
  5. 将网络更改为 host(或任何您想要设置的内容)
  6. 点击上面的 部署容器.
  7. 确认您要替换旧容器(或者如果您想保险起见并保留旧容器,则部署它以新名称)。
  8. 完成!Advanced container settings 的屏幕截图

救命稻草,运行得非常好 - mouchin777
1
尽管有价值,但OP正在使用Linux系统,因此需要一个命令行答案。即请参考Ortomala Lokni的答案。你所做的只是在不同的网络上创建一个新容器,这并没有回答OP的问题:“我正在尝试更新正在运行的Docker容器的网络。”正在运行的容器。 - eco
很好!这对数据量没有任何影响,这正是我想要的! - Jerther

1

我不确定我们是否可以在运行时更改容器网络,但是假设新的Docker网络已经存在,您可以运行以下命令来更新容器网络。

执行版本:20.10.21社区版
# docker stop <container-name>
# docker network disconnect <old-network-id> <container-name> 
# docker network connect <new-network-id> <container-name>
# docker start <container-name>

注意:您无法从其他网络切换到主机网络。

0
Run or connect a container to a specific network: Note first of all, the network must exist already on the host. Either specify the network at container creation/startup time (docker create or docker run) with the --net option; or attach an existing container by using the docker network connect command. For example:

docker网络连接my-network my-container


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0
如果您正在使用“swarm mode”并且想要连接到外部网络,请使用以下方法:
version: '3.6' # not 3.4

services:
  a_service:
    image: "nginx:alpine"
    command: sleep 10000
    networks:
      - outside

networks:
  outside:
    name: host
    external: true

使用docker stack deploy -c filename.yml temp_stack命令部署堆栈。
另外,检查开放的端口。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接