前戏
如果我们启动了一个容器,并且将宿主机的端口和容器的端口映射上了。有时候我们需要更改宿主机的端口或者要添加映射端口。这里提供三种方案
新建容器
这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上端口映射。例如下面的 rabbitmq 容器,映射了三个端口到宿主机上
docker run -id --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ -p 15692:15692 \ -v /opt/rabbitmq/data:/var/lib/rabbitmq \ -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest \ rabbitmq:3.8.3-management
修改容器配置文件
修改配置文件的话,需要停止 docker 服务
systemctl stop docker
容器的配置文件路径:cd /var/lib/docker/containers/{容器id}/hostconfig.json
我们进入到 243f14b67efbd5b841fed1f6d820f6f47370c17f251ecf3b95b89f5e255483f3/ 目录里面,这个容器就是上面的 rabbitmq 容器
打开 hostconfig.json 文件,内容如下
文件中其中有一项是 PortBindings,其中 15672/tcp 对应的是容器内部的 15672 端口,HostPort 对应的是映射到宿主机的端口 15672。5672/tcp 对应的是容器内部的 5672 端口,HostPort 对应的是映射到宿主机的端口 5672。按需修改端口
然后在修改 config.v2.json 文件
如果没有ExposedPorts 在 config.v2.json 里面添加一个配置项 "ExposedPorts":{"80/tcp":{}} , 将这个配置项添加到 "Tty": true, 前面,如果有就添加 "80/tcp":{} 端口即可。
注意:80 为实际容器需要映射的端口
然后重启docker服务,再启动容器服务就可以了
systemctl restart docker
优缺点:这个方法的优点是没有副作用,操作简单。缺点是需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,就会影响其他容器服务。
利用docker commit新构镜像
docker commit:把一个容器的文件改动和配置信息 commit 到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的 docker 镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。
docker stop container01 # 停止docker容器 docker commit container01 new_image:tag # commit该docker容器 docker run --name container02 -p 80:80 new_image:tag #用前一步新生成的镜像重新起一个容器
优缺点:这种方式的优点是不会影响统一宿主机上的其他容器,缺点是管理起来显得比较乱,没有第二种方法那么直观。