概述
我们在实际使用中,docker run
之后运行了容器,由于一些原因(如忘记映射端口,忘记映射配置文件)需要修改已经运行的容器,在有些时候我们的容器中经过运行已经有数据产生,如果直接删除容器在运行一个新的容器势必造成容器中的数据丢失。这里我记录三种修改运行中的Docker容器的方式,以修改容器端口为例:
方式一:重新创建容器
将原来运行中的容器删除,重新docker run
一个新的容器,简单粗暴。但如果没有和宿主机做文件映射,容器中的数据会丢失
删除容器
docker rm -f [容器名称]
运行容器
docker run ...
方式二:修改容器配置
我们容器中的数据和配置其实都存储我们的宿主机中存在,如果要修改容器的配置,我们直接修改容器在宿主机中的配置即可。
在宿主机中修改容器配置文件,容器配置文件路径:
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
说明:hash_of_the_container 是docker的hash值,通过docker ps
查看CONTAINER_ID就可以,文件夹的前面一部分会和CONTAINER_ID一样
编辑hostconfig.json文件
{
"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"],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "cppcc_default",
"PortBindings": {
"3306/tcp": [{
"HostIp": "",
"HostPort": "3308"
}]
},
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
}
}
“3306/tcp” 对应容器内部的端口,”HostPort”: “3308” 对应宿主机端口
端口修改之后,从起Docker即可
systemctl restart docker
通过修改容器的配置的方式不会导致容器中的数据丢失,缺点是需要重启Docker,如果宿主机上运行多个容器,重启时会对其他容器造成影响
方式三:使用docker commit 新建镜像
docker commit
命令可以把容器提交出一个新的镜像,这个镜像会保留容器中的所有数据和配置,之后用docker run
运行一个新的容器,不会对之前容器的数据造成影响
- 停止容器
docker stop [容器名称]
- 使用
docker commit
新建一个新镜像
docker commit [容器名称] [新镜像名称]
- 用新镜像名称运行一个新的容器
docker run --name [容器名称] -p 80:80 [新镜像名称]