在 docker run 创建并运行容器的时候, 可以通过 - p 指定端口映射规则. 但是, 很有可能刚开始你忘记设置了, 或者说设置错了需要修改.
docker start 运行容器并没有提供一个 - p 选项, 让你指定端口映射规则. 一个解决方案就是把原来的容器删掉, 重新建一个.
要是无状态的应用类镜像还好, 如果是数据库镜像, 那重新建一个简直就是 nightmare:) 啊
下面我列出几种解决方案:
方法一: 修改镜像配置文件, 重启 docker
容器的配置文件在
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.JSON
其中的 hash_of_the_container 是 docker 镜像的 hash 值, 可以通过 docker ps 或者 docker inspect container_name 查看.
其中有一项是 PortBindings, 例如上面这个例子中, 5432/tcp 对应的是容器内部的 5432 端口, HostPort 对应的是映射到宿主机的端口, 把这个数字修改一下就可以了. 然后重启 docker 服务:
systemctl restart docker
最后 start docker 镜像.
这个方法的好处是没有副作用, 操作也很简单, 缺点是需要重启整个 docker 服务, 如果在同一个宿主机上运行着很多镜像的话, 有可能会影响其他容器的服务.
方法二: 利用 docker commit
第一步: 停止 docker 容器
docker stop container01
第二步: commit 该 docker 容器
docker commit container01 new_image:tag
docker commit: 把一个容器的文件改动和配置信息 commit 到一个新的镜像. 这在测试的时候会很有用, 把容器所有的文件改动核配置信息导入到一个崭新的 dockers 镜像, 然后用这个镜像起一个容器, 这对之前的那个容器不会产生任何影响. 需要注意的是:
第三步: 用前一步新生成的镜像重新起一个容器
docker run --name container02 -p 80:80 new_image:tag
这种方法的好处是不会影响统一宿主机上的其他容器, 缺点是管理起来显得一团糟, 不像第一种方法那么直观.
我一般偏好于第一种方法, 但是如果在不能影响统一宿主机上其他服务的情况下, 也只能采取第二种方法.
来源: https://juejin.im/post/5c5ba3f55188252f304816c8