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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 创建宿主机与容器的端口映射,可以在docker run创建并运行容器的时候,通过-p指定端口映射规则。但是,我们也经常遇到创建容器时缺少部分端口映射,或者设置错了需要修改的情况。docker start运行容器后,并没有提供一个选项或设置可以修改指定的端口映射规则。那么这种情况我们该怎么处理呢?

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 

示例:
image.png

  • 2.停止容器
docker stop $ContainerName

示例:
image.png

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

image.png

  • 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

示例:
image.png

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

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

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

image.png

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

image.png

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

image.png

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

    • a.按Ctrl+A+D,退出screen命令。
    • b.使用screen -ls命令,查看当前会话。
      image.png
    • 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时,将容器暂停。

image.png

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

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

3.总结

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

  • 优势

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

    • 方案1重建容器后需要重新配置容器,比较麻烦。
    • 方案2修改配置文件后,需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,会影响其他容器服务。
    • 方案3实现方式曲折,在管理上会略显混乱。
相关文章
|
2天前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
2天前
|
存储 Ubuntu 安全
Docker容器常用命令
Docker容器常用命令
10 1
|
8天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
13 0
|
17天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
13 0
|
28天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
17天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
28 0
|
17天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
32 0
|
25天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
28 1
|
28天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
48 1
|
29天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
379 1