概述

我们在实际使用中,docker run之后运行了容器,由于一些原因(如忘记映射端口,忘记映射配置文件)需要修改已经运行的容器,在有些时候我们的容器中经过运行已经有数据产生,如果直接删除容器在运行一个新的容器势必造成容器中的数据丢失。这里我记录三种修改运行中的Docker容器的方式,以修改容器端口为例:

方式一:重新创建容器

将原来运行中的容器删除,重新docker run一个新的容器,简单粗暴。但如果没有和宿主机做文件映射,容器中的数据会丢失

删除容器

  1. docker rm -f [容器名称]

运行容器

  1. docker run ...

方式二:修改容器配置

我们容器中的数据和配置其实都存储我们的宿主机中存在,如果要修改容器的配置,我们直接修改容器在宿主机中的配置即可。

在宿主机中修改容器配置文件,容器配置文件路径:

  1. /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json

说明:hash_of_the_container 是docker的hash值,通过docker ps 查看CONTAINER_ID就可以,文件夹的前面一部分会和CONTAINER_ID一样

编辑hostconfig.json文件

  1. {
  2. "Binds": ["/cppcc/docker/mysql/data/db:/var/lib/mysql:rw", "/cppcc/docker/mysql/log:/var/log/mysql:rw", "/cppcc/docker/mysql/data/conf:/etc/mysql/conf.d:rw"],
  3. "ContainerIDFile": "",
  4. "LogConfig": {
  5. "Type": "json-file",
  6. "Config": {}
  7. },
  8. "NetworkMode": "cppcc_default",
  9. "PortBindings": {
  10. "3306/tcp": [{
  11. "HostIp": "",
  12. "HostPort": "3308"
  13. }]
  14. },
  15. "RestartPolicy": {
  16. "Name": "always",
  17. "MaximumRetryCount": 0
  18. }
  19. }

“3306/tcp” 对应容器内部的端口,”HostPort”: “3308” 对应宿主机端口

端口修改之后,从起Docker即可

  1. systemctl restart docker

通过修改容器的配置的方式不会导致容器中的数据丢失,缺点是需要重启Docker,如果宿主机上运行多个容器,重启时会对其他容器造成影响

方式三:使用docker commit 新建镜像

docker commit 命令可以把容器提交出一个新的镜像,这个镜像会保留容器中的所有数据和配置,之后用docker run 运行一个新的容器,不会对之前容器的数据造成影响

  1. 停止容器
  1. docker stop [容器名称]
  1. 使用docker commit新建一个新镜像
  1. docker commit [容器名称] [新镜像名称]
  1. 用新镜像名称运行一个新的容器
  1. docker run --name [容器名称] -p 80:80 [新镜像名称]