• 给运行中的docker容器动态添加端口映射


    发现一个正在跑的容易少定义了一个端口映射,删除重建肯定是不可取的。
    docker命令目前还没有动态添加的功能,只能自己去查阅资料解决了。

    目前,有三种办法:

    • 把正在运行的容器打包成为docker镜像,然后直接使用run命令重新添加端口映射。这个方法虽然简单,但对于比较大的容器就很耗时。命令如下:
    $ docker stop httpd-container
    httpd-container
    $ docker commit httpd-container httpd-image
    sha256:d43a3fcad051c90ac9b7dea9b2ddaodsa9o3d6dbdsadsc6893ef4r430
    然后删除老的,再运行出一个新的:
    $ docker rm httpd-container
    httpd-container
    $ docker run -d -p 83:80 --name httpd-container httpd-image
    8ds35c477ad74e80b3642abcrf45f91bf20cd3f0cbf3asd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 获取需要添加端口的,正在运行的docker容器的内网ip地址,然后在宿主机的防火墙上面添加端口映射,直接映射容器的ip地址即可
    查看防火墙上目前的规则:
    sudo iptables -t nat -vnL
    
    • 1
    • 2

    可以看到:

    Chain DOCKER (2 references)
     pkts bytes target     prot opt in     out     source               destination         
     1265 68587 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3307 to:10.244.192.59:3306
    24283 1440K DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6379 to:10.244.192.65:6379
     1238 69268 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9300 to:10.244.192.66:9300
     3759  201K DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:9200 to:10.244.192.66:9200
      282 14700 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:27018 to:10.244.192.67:27017
       29  1568 DNAT       tcp  --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6080 to:10.244.192.68:80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    再获得容器的IP地址:

    docker inspect containerId |grep IPAddress

    然后添加端口映射:

    sudo iptables -t nat -A DOCKER -p tcp --dport 9222 -j DNAT --to-destination 10.244.192.68:9222

    • 修改容器的配置文件,再重启docker服务,以及容器。
      先停止容器, 再修改配置:

    sudo vim /var/lib/docker/containers/<容器Id>/hostconfig.json

    {
      ...
      ...
      "PortBindings": {"9222/tcp":[{"HostIp":"","HostPort":"9222"}]},
      ...
      ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    再修改/var/lib/docker/containers/<容器Id>/config.v2.json文件:

    {
      ...
      "Config":
      {
        ...
        "ExposedPorts":
        {
          "80/tcp":{},
          "82/tcp":{},
          "8080/tcp":{}
        },
        ...
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    再重启docker服务:

    systemctl start docker

    最后重启容器即可。

  • 相关阅读:
    Java-多线程-ThreadPoolExecutor
    Golang 结构化日志包 log/slog 详解(五):LogValuer 和函数包装
    我在高职教STM32——GPIO入门之按键输入(1)
    华为OD 最大岛屿体积(100分)【java】A卷+B卷
    Java 泛型程序设计
    js 解决 H 指数
    diskMirror docker 使用容器部署 diskMirror 服务器!!!
    IntelliJ IDEA - 10 款 IDEA 宝贝插件,YYDS!
    汇编 寻址方式
    java图片转pdf ,pdf 导出
  • 原文地址:https://blog.csdn.net/jgku/article/details/127553259