[转帖]Docker容器动态添加端口

docker,容器,动态,添加,端口 · 浏览次数 : 0

小编点评

**方法 1:修改iptables端口映射** 1. 登录到宿主机。 2. 使用 `sudo iptables -t nat -vnL1` 命令查看iptables设置。 3. 添加一条规则: ``` Chain DOCKERtarget prot opt source destinationRETURN all -- 0.0.0.0/0 0.0.0.0/0DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:801.2.3.4. ``` 4. 保存iptables设置。 5.重启docker容器服务。 **方法 2:修改容器配置文件** 1. 打开容器的配置文件:`docker run -it --rm --name containerId /bin/bash`。 2. 修改配置文件中的`PortBindings`和`ExposedPorts`属性。 3. 保存配置文件。 4. 重启容器服务。 **方法 3:生成新的镜像并添加端口映射** 1. 创建一个新的镜像:`docker build -t heropoo/example2 .`。 2. 使用新的镜像运行容器:`docker run -d -p 8000:80 heropoo/example`。 3. 登录到容器中:`docker exec -it containerId /bin/bash`。 4. 修改`config.v2.json`文件中的`ExposedPorts`和`Ports`属性。 5. 保存配置文件。 6. 返回到宿主机。 7. 使用新的镜像登录容器:`docker login heropoo/example2`。 8. 登录后复制`PortBindings`属性的值。 9. 修改配置文件中`PortBindings`的`80/tcp`和`443/tcp`项,设置映射端口。 10. 保存配置文件。 11. 启动容器服务。

正文


方法1 修改iptables端口映射

docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。

比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:

sudo iptables -t nat -vnL
  • 1.

在结果中有一条:

Chain DOCKER
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:80
  • 1.
  • 2.
  • 3.
  • 4.

我们可以看到docker创建了一个名为DOKCER的自定义的链条Chain。而我开放80端口的容器的ip是172.17.0.3

也可以通过inspect命令查看容器ip:

docker inspect containerId |grep IPAddress
  • 1.

我们想再增加一个端口映射,比如​​8081->81​​,就在这个链条是再加一条规则:

sudo iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.3:81
  • 1.

如果加错了或者想修改:

先显示行号查看

sudo iptables -t nat -vnL DOCKER --line-number
  • 1.

删除规则3

sudo iptables -t nat -D DOCKER 3
  • 1.

方法2 修改容器配置文件

修改配置前需要先关闭docker容器的配置文件​​/var/lib/docker/containers/[containerId]​​​目录下,​​hostconfig.json​​​和​​config.v2.json​​ 修改好之后,重启容器服务。

docker容器被创建后会在服务器上保存一个文件夹,配置文件也放在此处,解决方法就是找到映射段都得配置文件修改就行了。

修改之前先停掉docker

$ systemcel stop docker

    在 /var/lib/docker/containers/[容器ID]/下找到hostconfig.json
    找到映射IP的位置,复制一个已映射的IP,修改为自己需要的就好(443是我新增的)

    "PortBindings": {
    "80/tcp": [
    {
    "HostIp": "",
    "HostPort": "80"
    }
    ],
    "443/tcp": [
    {
    "HostIp": "",
    "HostPort": "443"
    }
    ]
    }

      相同的目录下找到config.v2.json
      该文件中有两处需要修改

      "ExposedPorts": {
      "443/tcp": {},
      "80/tcp": {}
      }

         

        "Ports": {
        "443/tcp": [
        {
        "HostIp": "0.0.0.0",
        "HostPort": "443"
        }
        ],
        "80/tcp": [
        {
        "HostIp": "0.0.0.0",
        "HostPort": "80"
        }
        ]
        }

          修改完之后启动docker

          $ systemctl start docker

             执行成功之后启动容器然后查看容器运行状态就可以看到新增加的端口在映射关系里已存在。

            同理也可以去除端口映射。

            方法3 把运行中的容器生成新的镜像,然后运行新的镜像

            1. 提交一个运行中的容器为镜像
            docker commit containerid heropoo/example

              2.运行​​heropoo/example​​镜像并添加8080映射容器80端口

              docker run -d -p 8000:80 heropoo/example /bin/sh

                 

                与[转帖]Docker容器动态添加端口 相似的内容:

                [转帖]Docker容器动态添加端口

                方法1 修改iptables端口映射 docker的端口映射并不是在docker技术中实现的,而是通过宿主机的iptables来实现。通过控制网桥来做端口映射,类似路由器中设置路由端口映射。 比如我们有一个容器的80端口映射到主机的8080端口,先查看iptables到底设置了什么规则:登录后复制

                [转帖]docker容器跨主机网络overlay

                https://www.cnblogs.com/machangwei-8/p/15757120.html 目录 拉取镜像,运行容器 浏览器上访问Consul 修改host1,host2的docker daemon配置文件 创建网络 验证 在overlay中运行容器 运行 查看一下这两个网卡 查看生成

                [转帖]Docker容器跨主机通信overlay网络的解决方案

                https://www.jb51.net/article/237838.htm 一、Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一

                [转帖]docker 容器基础技术:linux cgroup 简介

                https://cizixs.com/2017/08/25/linux-cgroup/ Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、

                [转帖]Docker容器管理技术-高级网络管理

                Docker容器管理技术-高级网络管理 https://www.jianshu.com/p/5859a2fe4377 1. Docker本地网络类型 1.1查看支持网络类型 docker network ls 1.2 测试使用各类网络类型 docker run network=xxx none :

                [转帖]Docker 容器运行 ivorysql 之体验

                当下容器运行应用已经越来越火,只要主机上能运行 Docker,就可以通过镜像来运行应用,不需要考虑环境是否满足应用的运行条件。今天就给大家分享一下使用镜像运行 ivorysql 数据库。如果你容器运行过 postgresql,那就比较容易上手了,几乎是一样的体验,稍微有点差别,后面会说明。 友情提示

                【转帖】Docker容器四种网络模式

                https://blog.whsir.com/post-5268.html docker自身默认提供了四种网络模式:none、bridge、container、host。除了这四种网络模式外,还可以通过插件自定义一些网络模式,比如macvlan、overlay等。 默认的这四种网络模式其实很好理解,

                [转帖]docker容器自动重启,看完这篇彻底明白了

                一. JVM内存区域的划分 1.1 java虚拟机运行时数据区 java虚拟机运行时数据区分布图: JVM栈(Java Virtual Machine Stacks): Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈,因此栈存储的信息都是跟当

                [转帖]Docker容器无法访问网络问题(网段冲突)

                近日在使用docker在腾讯云服务器上部署项目 运行容器时死活访问不了网络,不论是外网还是内网。 最后找到原因是docker容器ip网段与服务器内网ip网段冲突导致的 使用此命令查看到 ifconfig 1 可以看到ip段冲突了 咱们重建docker的ip段 首先删除docker的网卡docker0

                [转帖]Docker容器日志查看与清理(亲测有效)

                1. 问题 docker容器日志导致主机磁盘空间满了。docker logs -f container_name噼里啪啦一大堆,很占用空间,不用的日志可以清理掉了。 2. 解决方法 2.1 找出Docker容器日志 在linux上,容器日志一般存放在/var/lib/docker/container