如何禁用正在运行的Docker容器的网络?

11
我想要正常启动一个Docker容器,运行它,在其中安装一些东西,然后我希望禁用网络,以便在其中运行更多命令,但它们不应该访问网络。如何为正在运行的容器实现这样的操作?
我使用docker-py,我知道我可以使用network_disabled来禁用整个容器的网络。但我不确定如何在容器创建后禁用网络。理想情况下,我将使用命令sleep infinity运行容器,然后docker exec一些命令,然后禁用网络,最后再使用docker exec运行几个命令。

您希望容器无法访问互联网,还是其他容器,或两者都不允许? - halfer
1
为什么需要在容器启动后运行命令,而不是将这些命令的输出提交到镜像中?您是否正在进行某些必须在容器启动时完成且无法永久完成的更新操作? - Marc Sances
是的,在另一个CI流程中创建图像,将图像推送到注册表,然后在原始CI中拉取您的自定义图像。 - halfer
我真的不想保留那张图片。 - Mitar
您可以每次在CI系统中构建它,但有时构建镜像的速度足够慢,拉取它会更快。通常,构建CI以使其运行快速是一个好主意。 - halfer
显示剩余3条评论
2个回答

16

也许一个选项是docker network disconnect

说明

从网络中断开容器的连接

用法

docker network disconnect [OPTIONS] NETWORK CONTAINER
创建一个连接到默认桥接网络的容器。
docker container run --rm -it alpine ping 8.8.8.8

然后一段时间后,将其断开:

docker network disconnect bridge <container-name>

输入图像描述


2
如果 docker network disconnect bridge <container-name> 对您无效,请尝试 docker network disconnect docker_default <container-name>。要重新连接容器,请运行:docker network connect docker_default <container-name> - patryk.beza

1
你应该使用标准模式在此处编写一个Dockerfile,以执行所需的软件安装并构建镜像。这实际上非常适合你的即时需求,因为一旦构建了镜像,就可以在没有网络的情况下运行它。
一个典型的Dockerfile框架可能看起来更或少像这样:
FROM ubuntu:18.04
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      thing-to-run-without-network
CMD ["/usr/bin/thing-to-run-without-network"]

然后您可以构建并运行它,如下所示:
docker build -t no-net-test .
docker run --rm --net none no-net-test

通常情况下,您应该设置图像,以便docker run可以完成容器所需的所有操作,而无需docker exec(除了手动调试)。您不应该在正在运行的容器中安装任何东西:一旦您docker rm容器,您的工作将会丢失,并且删除和重新启动容器是非常常见的。

是的,在我的情况下,我可以接受一些东西被丢失,因为所有这些命令都是在 CI 运行期间动态生成并运行的。所以这就是为什么创建一个镜像只是为了运行命令,然后擦除所有内容听起来有点过分,我想知道是否有一种更简单的方法只是在容器运行期间删除网络连接。 - Mitar

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