浅析如何为正在运行的容器添加端口映射

  在docker run创建并运行容器的时候,可以通过-p指定端口映射规则,但是如果后期想要为正在运行的容器添加额外的端口映射该怎么做呢?

方法一:删除原来容器,重新run一个容器。

  这种方法只适合没有状态的容器或者没有持久化的容器,毕竟重建后的容器是一个全新的,之前配置的东西全还原了。

  也可以将之前容器中的数据通过docker cp命令拷贝出来,再拷贝进新的容器中。

  优缺点:优点是简单快捷,在测试环境使用较多。缺点是如果是数据库镜像,那重新建一个又要重新配置一次,就比较麻烦了。

方法二:修改容器的配置文件,需要重启docker进程

  容器的配置文件:/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

  其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。

[root@moapp-0003 /]# cd /var/lib/docker/containers/
[root@moapp-0003 containers]# ll
total 44
drwx------ 4 root root 4096 Aug  6 19:31 357c552fa26f5842dc37e3b8853d19e58b9a112d4d257b8cf308d7f252dbe0ea
drwx------ 4 root root 4096 Aug  9 16:45 4d37327019e992627e44f3dc8aa963ab8315789fb4c92021d47c79a1e414b9bf
drwx------ 4 root root 4096 Jul 30 18:35 80a017540797c04cb6f9166b0e5ec041436015f2722d0e09624af48f2f9f02c0
drwx------ 4 root root 4096 Aug  9 16:45 82cebce4e95aafa27c8f184d3edf51a6902d92c5a2d7016c5c7af74cc997d052
drwx------ 4 root root 4096 Aug  6 19:01 83f7d00ce0c3ace78c8e67fe3fca81f8d092b7b160fe53a6b38708f71ccbe28d
drwx------ 4 root root 4096 Aug  6 19:31 9f3628be004afdabb2c729d4036f89419092f7e6746b745a672ba3fbd794d0d3
drwx------ 4 root root 4096 Aug  6 18:37 ad9c74999c66df2858803a1934e1b53f907ec3a200f48f0af3a19f8ac03ba240
drwx------ 4 root root 4096 Aug  6 18:54 b789e232595120745ed883ca5aac18f05aaa23f7457bd51078ac79c18be23f56
drwx------ 4 root root 4096 Aug 12 13:13 c52c17402e346c9a3f0767b43b1d913445d1bf717848cb527d13027f05938562
drwx------ 4 root root 4096 Aug 11 18:35 ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb
drwx------ 4 root root 4096 Jul 30 18:33 ff1982f102b142368ae0a60821e904dd5fb94d33ee02dc1e4dcca6daf37f3901
[root@moapp-0003 containers]# docker ps
CONTAINER ID   IMAGE                                                               COMMAND                  CREATED        STATUS        PORTS                          NAMES
c52c17402e34   my_pg:13.3                                                          "docker-entrypoint.s…"   4 hours ago    Up 4 hours    5432/tcp, 0.0.0.0:33->22/tcp   test_pg_12
ce0d1247e00c   new_pg:13.3                                                         "docker-entrypoint.s…"   23 hours ago   Up 23 hours   5432/tcp, 0.0.0.0:23->22/tcp   pg_ssh
82cebce4e95a   swr.cn-north-4.myhuaweicloud.com/cloud-modb/test_edu_app:latest     "sh -c 'java -Djava.…"   3 days ago     Up 3 days     8083/tcp                       test_edu-app.1.d759qj88i4gnb51sw7sg55vt3
9f3628be004a   swr.cn-north-4.myhuaweicloud.com/cloud-modb/test_edu_front:latest   "docker-entrypoint.s…"   5 days ago     Up 5 days     3002/tcp                       test_edu-front.1.jpg779sjxn8gpcvd58vbula41
80a017540797   postgres:11.11                                                      "docker-entrypoint.s…"   12 days ago    Up 12 days    0.0.0.0:5432->5432/tcp         test_postgres
ff1982f102b1   redis:5.0                                                           "docker-entrypoint.s…"   12 days ago    Up 12 days    6379/tcp                       test_edu-redis.1.nvd6mr3vquf8zcjusox8lwkyw
[root@moapp-0003 containers]# cd ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb/
[root@moapp-0003 ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb]# ll
total 32
-rw-r----- 1 root root    0 Aug 11 18:35 ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb-json.log
drwx------ 2 root root 4096 Aug 11 18:35 checkpoints
-rw------- 1 root root 3211 Aug 11 18:35 config.v2.json
-rw-r--r-- 1 root root 1512 Aug 11 18:35 hostconfig.json
-rw-r--r-- 1 root root   13 Aug 11 18:35 hostname
-rw-r--r-- 1 root root  174 Aug 11 18:35 hosts
drwx------ 2 root root 4096 Aug 11 18:35 mounts
-rw-r--r-- 1 root root  144 Aug 11 18:35 resolv.conf
-rw-r--r-- 1 root root   71 Aug 11 18:35 resolv.conf.hash
[root@moapp-0003 ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb]# cat hostconfig.json
{"Binds":null,"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"22/tcp":[{"HostIp":"","HostPort":"23"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"CgroupnsMode":"host","Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"private","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"UTSMode":"","UsernsMode":"","ShmSize":67108864,"Runtime":"runc","ConsoleSize":[0,0],"Isolation":"","CpuShares":0,"Memory":0,"NanoCpus":0,"CgroupParent":"","BlkioWeight":0,"BlkioWeightDevice":[],"BlkioDeviceReadBps":null,"BlkioDeviceWriteBps":null,"BlkioDeviceReadIOps":null,"BlkioDeviceWriteIOps":null,"CpuPeriod":0,"CpuQuota":0,"CpuRealtimePeriod":0,"CpuRealtimeRuntime":0,"CpusetCpus":"","CpusetMems":"","Devices":[],"DeviceCgroupRules":null,"DeviceRequests":null,"KernelMemory":0,"KernelMemoryTCP":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":null,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0,"MaskedPaths":["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths":["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]}
[root@moapp-0003 ce0d1247e00c9697dc911a035f71cc498610ce4c4c26d63a9f71fb8f8fab9fdb]#

  其实进入 这个 目录 cd /var/lib/docker/containers/,然后根据 docker ps 查看到容器 id ,就可以根据 容器 id 找到对应的容器的目录了,进入目录,就可以找到 hostconfig.json

  hostconfig.json 文件中其中有一项是PortBindings,其中 22/tcp 对应的是容器内部的22端口,HostPort对应的是映射到宿主机的端口 23。

  停止docker服务,systemctl stop docker;按需修改端口,然后启动docker服务,再启动你的容器就可以了。

  优缺点:这个方法的优点是没有副作用,操作简单。缺点是需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,就会影响其他容器服务。

方法三:使用docker commit将当前容器创建为一个镜像,在启动这个镜像时映射新的端口号出来。

  docker commit:把一个容器的文件改动和配置信息commit到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。

1、停止docker容器:docker stop container01

2、commit该docker容器:docker commit container01 new_image:tag

3、用前一步新生成的镜像重新起一个容器:docker run --name container02 -p 80:80 new_image:tag

    优缺点:这种方式的优点是不会影响统一宿主机上的其他容器,缺点是管理起来显得比较乱,没有第二种方法那么直观。比较适合测试使用。

原文地址:https://www.cnblogs.com/goloving/p/15133961.html