Docker容器端口映射规则调整方案

1.概述

 Docker提供三种用户自定义(user-defined)的网络驱动:bridge,overlay和macvlan。通常,我们使用的是Docker默认的网络模式Bridge模式,bridge模式可以将各个容器的端口设为对立的,这样外部宿主机或者容器需要通过该容器所在ip+该容器的端口进行访问,并且本宿主机可以访问本宿主机中的容器。
 创建宿主机与容器的端口映射,需要在docker run创建并运行容器的时候,通过-p指定端口映射规则。但是,我们也经常遇到创建容器时忘记设置端口映射,或者设置错了需要修改的情况。docker start运行容器后,并没有提供一个选项或设置可以修改指定的端口映射规则。那么这种情况我们该怎么处理呢?本文将以Mac for DockerDesktop为例进行说明。

2.解决方案

2.1.重建容器

 这种方法比较简单直接,即删除原有的缺少端口映射的容器,重新创建一个指定端口映射规则的容器。
 由于此方案需要重建容器,所以仅适用于创建镜像后还没开始配置或容器配置简单、配置成本较小的情况。

2.2.修改配置文件

 通过修改配置文件hostconfig.json和config.v2.json,可以实现docker容器端口映射规则的修改,具体操作步骤如下。

  • 1.确定容器ID
docker container inspect $ContainerName |grep Id
或者
docker inspect $ContainerName |grep Id 

示例:
Docker容器端口映射规则调整方案

  • 2.停止容器
docker stop $ContainerName

示例:
Docker容器端口映射规则调整方案

  • 3.停止docker服务
     以Mac for Docker Desktop为例,示例如下:

Docker容器端口映射规则调整方案

  • 4.进入docker容器配置文件所在目录
cd ~/Library/Containers/com.docker.docker/Data/vms/0/
  • 5.进入Docker内部Linux
     容器配置文件所在目录中有一个tty文件,通过这个文件可以登录docker内部的Linux。
screen tty 
遇到空白命令行,直接回车即可。 
  • 6.进入容器对应文件夹
cd /var/lib/docker/containers/
cd $ContainerId

示例:
Docker容器端口映射规则调整方案

 如上图所示,容器对应目录内包含config.v2.json和hostconfig.json两个配置文件,下一步分别对两个文件进行修改即可(务必都进行修改)。

  • 7.编辑修改config.v2.json

    • a.执行如下命令查看config.v2.json
cat /var/lib/docker/containers/{容器id}/config.v2.json

Docker容器端口映射规则调整方案

  • b.本地进行json格式化,虽然config.v2.json是json文件,但没有格式化,所以在本地对齐进行格式化,方便参数修改。
  • c.编辑ExposedPorts和Ports参数,参考之前内容或如下格式添加端口映射。
    Docker容器端口映射规则调整方案

Docker容器端口映射规则调整方案

  • d.添加完成后,将文件内容压缩成一行并覆盖写入config.v2.json即可。
  • 8.编辑修改hostconfig.json
     操作步骤同上,需要修改的参数为PortBindings,添加内容示例如下,端口配置之间用英文字符逗号隔开。

Docker容器端口映射规则调整方案

  • 9.退出docker的虚拟Linux
     这一步很关键,如果没有正常退出,配置文件将无法覆盖旧文件,修改无法生效。

    • a.按Ctrl+A+D,退出screen命令。
    • b.使用screen -ls命令,查看当前会话。
      Docker容器端口映射规则调整方案
    • c.使用kill命令,杀死当前会话。
    • d.退出会话
screen -wipe 
There is a screen on: 
    41557.ttys004.YandeMacBook-Pro  (Removed) 
1 socket wiped out. 
No Sockets found in /var/folders/d0/y2ythxgd2p54y1p46bv90wpm0000gn/T/.screen. 
  • 10.重启docker
     重新启动Mac for DockerDesktop,并启动容器。
docker start $ContainerName

2.3.构建自定义镜像

 通过docker commit将原有容器及容器中的文件、配置信息commit为新的自定义镜像,然后再通过这个自定义镜像创建容器。在docker run创建并运行容器的时候,通过-p指定所需的端口映射规则,具体操作如下。

  • 1.停止原有docker容器。
docker stop $ContainerName
  • 2.提交原有docker容器为自定义镜像。
docker commit [OPTIONS] $container [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。

Docker容器端口映射规则调整方案

  • 3.基于自定义镜像创建容器
docker run -it --name $new_containername -p 80:80 $imagename:tag

 到这里,添加指定端口映射的新容器就可以使用了。

3.总结

 综上,以上三种方式均可实现为运行中的容器调整端口映射规则,三种方式的优劣对比如下:

  • 优势

    • 通过删除原有容器并重建新容器的方式实现调整端口,操作简单、直接。
    • 修改配置文件的方式没有副作用,无需重新配置容器。
    • 通过构建自定义镜像、重建容器的的方式,操作简单且不会影响同一宿主机上的其他容器。
  • 劣势

    • 方案1重建容器后需要重新配置容器,比较麻烦。
    • 方案2修改配置文件后,需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,会影响其他容器服务。
    • 方案3实现方式曲折,在管理上会略显混乱。
上一篇:云服务器 ECS 镜像迁移:应用迁云之镜像迁移(1)概述


下一篇:使用DataX进行OTS实例间数据迁移