在docker run创建并运行容器的时候,可以通过-p指定端口映射规则,但是如果我们在开始忘记了设置端口映射或者设置错了需要修改的话,docker并没有一个命令可以直接对已有的容器修改端口映射规则,那这个时候该怎么办呢?我们可以用下面的方法解决这个问题。
1.删除原有容器,重新创建新容器
这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上端口映射。
# 以nginx容器为例
docker rm -f nginx
docker run -p 80:8080 --name nginx nginx:latest
优点:简单快捷,在测试环境使用较多;
缺点:如果容器配置参数较多的话,比如数据卷,环境变量等,那重新创建容器又要重新配置一次,就比较麻烦了,而且如果没有映射数据卷的数据就会丢失。
2.修改容器配置文件,并重启docker服务
/var/lib/docker/containers/
其中,配置文件 hostconfig.json
- docker ps或者docker inspect查看容器id
- docker stop停止该容器
- systemctl stop docker停止docker服务
- 进入该容器对应目录/var/lib/docker/containers/[hash_of_the_container]
- 修改hostconfig.json文件中的端口映射
- systemctl start docker启动docker服务
- docker start启动该容器
- 启动其他所有容器
vim hostconfig.json
文件中其中有一项是PortBindings,即为端口映射规则
如果之前没有端口映射, 应该有这样的一段:
"PortBindings":{}
如果增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"8080"}]}
如果之前有端口映射,应该是这样的:
"PortBindings":{"8081/tcp":[{"HostIp":"","HostPort":"8081"}]}
如果修改已有端口映射,直接该端口号就行
"PortBindings":{"8081/tcp":[{"HostIp":"","HostPort":"8082"}]}
前一个数字是容器端口, 后一个是宿主机端口,即将宿主机的8082端口映射到容器的8080端口
注意,一定要先停止docker服务,否则修改不会生效。
优点:没有副作用,操作简单;
缺点:需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,就会影响其他容器服务。
3.使用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
优点:不会影响统一宿主机上的其他容器;
缺点:管理起来显得比较乱,没有第二种方法那么直观。
小结
如果容器可以删掉重启的话,直接用第一种方法,简单直接;
如果容器重启会导致数据丢失,则使用第二种方法,但注意修改后要启动其他所有容器;
第三种一般不推荐使用。