Docker容器创建后怎样更改“目录映射”,“端口映射”关系,同时解答现有的网上答案,修改后不生效的问题。

在这里插入图片描述

  • @不能熬夜的程序猿 原创文档,可自由复制,请注明出处
  • 欢迎点赞分享评论
  • 少啰嗦,先看东西

前言:

大家看到我的文章,相信大家刚接触过docker容器,对怎样改目录映射或端口映射有所疑问,现在我教大家怎样改 已经创建好的容器,改目录映射或端口映射

一、更改创建后容器映射关系的几种方式

大家都知道docker容器创建后,是不容易修改映射关系的,但还是有几种办法修改

  • 删掉容器重新创建
  • 对现有容器构建镜像,再从这个镜像重新启动一个新的容器
  • 更改现有容器的配置文件(重点讲述内容)

现,我将从这三个角度,教大家怎样给更改映射关系

二、通过删掉容器重新创建的方式更改映射关系

  • 优点:简单、快捷、方便
  • 缺点:数据不同步问题,需要对新容器进行相关配置

步骤:

  1. 删除现有的容器
  2. 重新创建容器
  3. 查看容器的相信信息
[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 ~]

三、通过构建镜像的方式更改映射关系

  • 优点:保存资料,更改映射关系。简单
  • 缺点:生成镜像耗时较长

步骤:

  1. 对现有的容器进行保存镜像
  2. 删除原有的容器
  3. 通过新镜像,生成新的容器
  4. 查看新容器的相关配置信息
[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,认识我一下吧 @不能熬夜的程序猿,感谢你的学习

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值