Docker容器创建后怎样更改“目录映射”,“端口映射”关系,同时解答现有的网上答案,修改后不生效的问题。
@不能熬夜的程序猿 原创文档,可自由复制,请注明出处欢迎点赞分享评论少啰嗦,先看东西文章目录前言:一、更改创建后容器映射关系的几种方式二、通过删掉容器重新创建的方式更改映射关系三、通过构建镜像的方式更改映射关系四、通过更改配置文件更改映射关系对目录映射对config.v2.json文件更改对hostconfig.json修改以下内容对端口映射对config.v2.json修改以下内容对hostco
- @不能熬夜的程序猿 原创文档,可自由复制,请注明出处
- 欢迎点赞分享评论
- 少啰嗦,先看东西
文章目录
前言:
大家看到我的文章,相信大家刚接触过docker容器,对怎样改目录映射或端口映射有所疑问,现在我教大家怎样改 已经创建好的容器,改目录映射或端口映射
一、更改创建后容器映射关系的几种方式
大家都知道docker容器创建后,是不容易修改映射关系的,但还是有几种办法修改
- 删掉容器重新创建
- 对现有容器构建镜像,再从这个镜像重新启动一个新的容器
- 更改现有容器的配置文件(重点讲述内容)
现,我将从这三个角度,教大家怎样给更改映射关系
二、通过删掉容器重新创建的方式更改映射关系
- 优点:简单、快捷、方便
- 缺点:数据不同步问题,需要对新容器进行相关配置
步骤:
- 删除现有的容器
- 重新创建容器
- 查看容器的相信信息
[root@node3 ~] docker ps # 查看现有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
762ab431b802 nginx:latest "/docker-entrypoint.…" 43 minutes ago Up 23 minutes 0.0.0.0:83->80/tcp, 0.0.0.0:2443->1443/tcp nginx
[root@node3 ~] docker rm -f 762ab431b802 # 删除现有的容器 docker rm -f <容器id>
762ab431b802
[root@node3 ~] docker run -d --name nginx -v /home/nginx1:/var/lib -p 81:80 nginx:latest
591ebbe238c2cfd6f0699a547c233b01474d7fe79f822c1d23e39dd4391bbe57 # 重新生成容器,别忘了,正确的目录或端口映射关系
[root@node3 ~]
[root@node3 ~]
[root@node3 ~] docker ps # 查看新生成的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
591ebbe238c2 nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 3 seconds 0.0.0.0:81->80/tcp nginx
[root@node3 ~] docker inspect 591ebbe238 # 查看容器的相关配置信息
[root@node3 ~]
三、通过构建镜像的方式更改映射关系
- 优点:保存资料,更改映射关系。简单
- 缺点:生成镜像耗时较长
步骤:
- 对现有的容器进行保存镜像
- 删除原有的容器
- 通过新镜像,生成新的容器
- 查看新容器的相关配置信息
[root@node3 ~] docker ps # 查看现有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
591ebbe238c2 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:81->80/tcp nginx
[root@node3 ~] docker commit 591ebbe238c2 nginx:v1.1 # 对现有的容器进行保存镜像
sha256:c37168e5ac37b8ca0502b10ca028ba6ec5531d56e8e9c8b919c4bc053042d57d
[root@node3 ~] docker rm -f 591ebbe238c2 # 删除原有的容器
591ebbe238c2
[root@node3 ~] docker run -d --name nginx -v /home/nginx1:/var/lib -v /home/nginx2:/home nginx:v1.1 # 将新保存的镜像,重新启动一个容器
6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73
[root@node3 ~] docker ps # 查看现有的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6bad3dd6c96e nginx:v1.1 "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 80/tcp nginx
[root@node3 ~] docker inspect 6bad3dd6c # 查看现有容器的相关信息
[root@node3 ~]
四、通过更改配置文件更改映射关系
- 优点: 适应性强,无需重新构建容器,相关配置可保留
- 缺点:较麻烦,而且需要对整个docker服务重新,将会影响其他容器,启动时间耗时较长
对目录映射
启动一个容器,并将容器现有的映射关系 /home:/var/lib 改成 /home/docker:/var/lib/docker
[root@node3 ~] docker run -d --name nginx -v /home:/var/lib nginx:latest # 启动一个容器
dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0
[root@node3 ~]
[root@node3 ~] docker inspect nginx # 查看刚创建的nginx容器的mounts,目录映射信息,如下图
docker inspect nginx ,查看容器mounts信息,大约在输出内容的中部
可以明显看到mounts中定义的
“Source”: “/home” # 这是定义的宿主机目录路径
“Destination”: “/var/lib” # 这是定义的容器内部目录地址
对现有容器进行目录映射的改变
改变成
“Source”: “/home/docker” # 这是新定义的宿主机目录路径
“Destination”: “/var/lib/docker” # 这是新定义的容器内部目录地址
[root@node3 ~] docker ps # 查看当前容器的id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dfdc43e970fc nginx:latest "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp nginx
# cd /var/lib/docker/containers/< 容器id>/ # 到该容器的存放位置
[root@node3 ~] cd /var/lib/docker/containers/dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0/
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] ll
total 28
drwx------ 2 root root 6 Feb 7 10:47 checkpoints
-rw------- 1 root root 3005 Feb 7 10:47 config.v2.json # 配置文件一
-rw-r----- 1 root root 1272 Feb 7 10:47 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0-json.log
-rw-r--r-- 1 root root 1484 Feb 7 10:47 hostconfig.json # 配置文件二
-rw-r--r-- 1 root root 13 Feb 7 10:47 hostname
-rw-r--r-- 1 root root 174 Feb 7 10:47 hosts
drwx------ 2 root root 6 Feb 7 10:47 mounts
-rw-r--r-- 1 root root 88 Feb 7 10:47 resolv.conf
-rw-r--r-- 1 root root 71 Feb 7 10:47 resolv.conf.hash
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] docker stop nginx
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] vim config.v2.json
更改容器路径位置的两个配置文件
对config.v2.json文件更改
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] docker stop nginx
nginx
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] vim config.v2.json
此时不要慌张,这些文字都堆在一起了,没法看,需要进行json格式化输出
在vim的命令模式下,输入%!python -m json.tool 格式化输出
此时,格式化输出,做好,找到Mounts的相关语句
更改一些内容
- 在这里需要对宿主机目录路径的 /home 改成 /home/docker
- 在这里需要对d容器内部路径地址的 /var/lib/ 改成 /var/lib/docker
保存,并退出即可
对hostconfig.json修改以下内容
修改前几行的定义的bind内容,即可
重启,docker服务,并重新启动容器
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] systemctl restart docker
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] docker start nginx
nginx
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0]
[root@node3 dfdc43e970fcc64356979ba41e8ecdf425b70a5191216eb17d3eae7a8f3c74a0] docker inspect nginx
再次查看修改后的目录映射关系
完成,修改完成
对端口映射
在这里我不过度解释相关解释,参考上面的目录映射相关解释说明
启动新的容器,并将该容器的端口映射关系 83:80 改成 84:82
[root@node3 ~] docker run -d --name nginx -p 83:80 nginx:latest
f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f
[root@node3 ~]
[root@node3 ~] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5b6d3e9c1c6 nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:83->80/tcp nginx
[root@node3 ~] docker inspect nginx
可以看出来,现有的端口映射关系
[root@node3 ~] docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5b6d3e9c1c6 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:83->80/tcp nginx
[root@node3 ~] cd /var/lib/docker/containers/f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f/
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] ll
total 28
drwx------ 2 root root 6 Feb 7 11:21 checkpoints
-rw------- 1 root root 2827 Feb 7 11:21 config.v2.json
-rw-r----- 1 root root 1072 Feb 7 11:21 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f-json.log
-rw-r--r-- 1 root root 1510 Feb 7 11:21 hostconfig.json
-rw-r--r-- 1 root root 13 Feb 7 11:21 hostname
-rw-r--r-- 1 root root 174 Feb 7 11:21 hosts
drwx------ 2 root root 6 Feb 7 11:21 mounts
-rw-r--r-- 1 root root 88 Feb 7 11:21 resolv.conf
-rw-r--r-- 1 root root 71 Feb 7 11:21 resolv.conf.hash
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] docker stop nginx
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] vim config.v2.json
对config.v2.json修改以下内容
找到ExposePorts定义的内容,将80 改成82 的端口号,改完之后,保存并推出即可
对hostconfig.json修改以下内容
找到PortBindings定义的内容,改成正确的端口号,即可,保存并推出
重启docker服务,并重启容器,查看容器端口映射关系
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] systemctl restart docker
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f]
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f]
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] docker start nginx
nginx
[root@node3 f5b6d3e9c1c6561de37ee363e8ceca83b65c7ab95bdcc9fc089c24bf4ffb3a4f] docker inspect nginx
OK,完成
如果你修改了不成功的话,请往下看,下面解释修改后不生效的问题
五、对现有网上答案,修改后不生效的问题解答
cd 容器的存放位置
[root@node3 6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73] pwd
/var/lib/docker/containers/6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73
[root@node3 6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73]
[root@node3 6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73] ll
total 28
-rw-r----- 1 root root 1271 Feb 7 09:39 6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73-json.log
drwx------ 2 root root 6 Feb 7 09:39 checkpoints
-rw------- 1 root root 3243 Feb 7 09:39 config.v2.json # 配置文件config
-rw-r--r-- 1 root root 1512 Feb 7 09:39 hostconfig.json # 配置文件hostconfig
-rw-r--r-- 1 root root 13 Feb 7 09:39 hostname
-rw-r--r-- 1 root root 174 Feb 7 09:39 hosts
drwx------ 2 root root 6 Feb 7 09:39 mounts
-rw-r--r-- 1 root root 88 Feb 7 09:39 resolv.conf
-rw-r--r-- 1 root root 71 Feb 7 09:39 resolv.conf.hash
[root@node3 6bad3dd6c96ecc27708a490eb41bf46e6c6dd456c307ed6c444c7a3817ee8a73]
大家看上图,对某个容器有两个相关配置文件
- config.v2.json
- hostconfig.json
这两个配置文件,这以下需要注意的问题
- 两个配置都需要更改,同时更改的内容需要一样
- 需要先停止容器(或者停掉docker服务),再进行更改。
因为容器正在运行中,你更改配置文件,再停止容器(或者停掉docker服务),dockers相关组件,会对配置文件进行重写,所以会出现,写了之后不生效问题。 - 更改完成之后需要对docker服务重启,而不是docker容器重启
- 一定要先停止容器,再修改,修改后直接重启docker服务,再启动容器
如果其中哪一个环节出错,都会出现,修改后不生效的问题
OK,认识我一下吧 @不能熬夜的程序猿,感谢你的学习
更多推荐
所有评论(0)