如何给正在运行的Docker容器添加功能?

18

在容器启动后添加功能(例如:NET_ADMIN)是否有可能?

几天前我启动了一个容器,其中的一个服务被运行在其他服务器上的多个进程所使用。我需要为其添加一个回环接口,但不幸的是,我忘记使用 --cap-add=NET_ADMIN 启动容器,因此现在无法添加该接口。

我正在寻找一种方法,是否可以将此功能以某种方式授予该容器。


默认情况下,容器中包含一个回环接口,即使你启动时没有网络也是如此。你使用了哪些选项来启动你的容器而不带网络? - BMitch
要求是添加额外的环回接口以分配附加的IP地址。 - VanagaS
给正在运行的容器添加功能会很不错。如果您需要开始使用iptables,这也是必要的。 - jjmontes
Docker 并不是为生产系统而设计的,它能够在其能力范围内运行得很好,但是你经常会发现开发人员没有关注到的问题。这就是其中之一,如果不重启容器,你无法完成它。 - John
4个回答

17
  1. 停止容器:

    docker stop your-container
    
    获取容器的ID:
  2. docker inspect your-container
    
    修改默认位于/var/lib/dockerhostconfig.json文件:
  3. vim /var/lib/docker/containers/ID/hostconfig.json
    
    搜索 "CapAdd" 并将其值更改为您需要的值(默认为 null):
    ...,"CapAdd":["NET_ADMIN"],"CapDrop":null,...
    
  4. 重新启动主机上的Docker守护进程以重新加载容器配置:

  5. service docker restart
    
  6. 重新启动您的容器:

  7. docker start your-container
    

8
只是一种猜测,因为我不知道 OP 的要求,但我相信他们想要无停机时间,所以你的答案并没有比“嘿,只需创建一个具有正确权限的不同容器”更有区别,是吗? - linuxbandit
我尝试在 Docker 版本 19.03.12 上添加 ["SYS_TRACE"],但没有成功。 - Jinu
1
确认在 Docker 版本 19.03.5 上添加 ["NET_ADMIN"] 是有效的。 - Tomo Česnik
2
为什么会有这么多赞?问题很清楚:如何对正在运行的容器进行操作。答案是从“停止容器”开始。如果你要停止容器,就不需要编辑JSON文件,只需使用docker run --cap-add命令即可。但是,考虑到某些容器需要半个小时才能重新启动(比如大型数据库),这并不是一个解决方案。 - John

8
不,您不能修改正在运行的容器的功能。这些只能在您第一次创建或运行(这只是创建 + 启动)容器时定义。您需要创建一个具有所需功能的新容器。
我应该指出,您可以使用 docker network connect 为正在运行的容器分配其他网络接口,但我不知道您是否可以使用任何回环驱动程序来使用此技术解决您的问题。

我在该容器内安装了应用程序,该程序使用硬编码的(可访问的)IP地址与外部服务进行通信。我已经在同一个容器内安装了外部服务。回环设置是为了确保服务在容器内部进行通信。 - VanagaS
最佳实践是将每个服务安装在单独的容器中。您可以让它们在自己的Docker网络上运行,并将这些网络附加到正在运行的容器上。从您的其他问题和此问题来看,似乎您正在尝试将容器用作虚拟机而不是应用程序隔离工具,这对于容器来说非常不合适。 - BMitch
服务只是另一个WAR文件,可以在相同的J2EE服务器内运行。我不想创建另一个不必要的镜像,否则将不会使用它。 - VanagaS

0
我希望这篇回答可以帮助到2022年的某个人。如果你想启动容器,请尝试以下操作:使用--cap-add=NET_ADMIN选项启动容器。命令如下:docker run .. -cap-ad=NET_ADMIN ....

下投票。它将创建新的容器,而不是更新现有的容器。 - likern

-5

您可以使用docker exec -it {container_id} /bin/bash在正在运行的容器内运行命令。它将为您创建一个bash,您可以在其中运行命令。但通常不建议对镜像状态进行修改,因为这会降低镜像的可移植性。


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