docker 进入运行容器 面试官:如何修改正在运行的 Docker 容器端口映射?问倒一大片。。。

这是一道真实的大厂面试题,今天,民工哥就和大家一起来讨论一下这个话题。分以下两种情况来深入学习这个知识点。容器未启动?如果你的容器还没有构建时,想添加端口映射时

这是一道真实的大厂面试题,今天,民工哥就和大家一起来讨论一下这个话题。

分以下两种情况来深入学习这个知识点。

容器未启动?

如果你的容器还没有构建时,想添加端口映射时,你只需要在创建容器的时候添加-p参数,想添加几个端口映射就追加几个-p参数。类似于如下示例:

docker run --name api_dfo_hyperf_ws   
-v /Users/pudongping/glory/codes/dfo/api_dfo_hyperf:/api_dfo_hyperf   
-p 9502:9502   
-p 9503:9503   
-p 9504:9504   
-p 9505:9505 -it   
--entrypoint /bin/sh   
alex/alex_api_dfo:v1.0  

docker容器暴露端口的形式有四种

-p    
#将指定的容器端口映射到宿主机所有地址的一个随机端口

-p : 
#将容器端口映射到指定的主机端口

-p ::
#将容器端口映射到主机指定ip的随机端口

-p ::
#将容器端口映射到指定主机ip的指定端口

容器已启动?方法一: 删除原有容器,重新建新容器

这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上端口映射。

docker run -d -uroot -p 8989:8080 --name jenkins1 -v /home/wcy/jenkins_node:/var/jenkins_home jenkins/jenkins:2.289.3-centos

优缺点:优点是简单快捷,在测试环境使用较多。缺点是如果是数据库镜像,那重新建一个又要重新配置一次,就会比较麻烦。

方法二:修改容器配置文件,重启docker服务

但是想修改或者添加端口时,先停止掉正在运行的容器。

以下内容都是以容器 id 为cbe26510c276进行操作的,请务必将容器 id 换成你自己需要修改的容器 id。

docker stop {容器的名称或者 id }  

比如:

docker stop cbe26510c276  

查看容器完整的hash_of_the_container数值:

docker inspect {容器的名称或者 id } | grep Id  
  
# 比如:  
docker inspect cbe26510c276 | grep Id  
# 会得到如下结果:  
# "Id": "cbe26510c276fa9a4487a8c2af8cbb49410f2a5305149d2b26eb8ce37c777d00"  

打开hostconfig.json配置文件

vim /var/lib/docker/containers/{hash_of_the_container}/hostconfig.json 

比如:

vim /var/lib/docker/containers/cbe26510c276fa9a4487a8c2af8cbb49410f2a5305149d2b26eb8ce37c777d00/hostconfig.json  

如果你不想先查看完整的容器hash_of_the_container数值,你也可以直接先切换到当前容器相关目录中cd /var/lib/docker/containers/{hash_of_the_container}*,然后再去编辑hostconfig.json配置文件。

cd /var/lib/docker/containers/{hash_of_the_container}*  

比如

cd /var/lib/docker/containers/cbe26510c276*  

然后再去编辑hostconfig.json配置文件:

vim hostconfig.json  

修改hostconfig.json配置文件

在hostconfig.json配置文件中,找到”PortBindings”:{}这个配置项,然后进行修改。我这里添加了两个端口映射,分别将宿主机的8502端口以及8505端口映射到容器的8502端口和8505端口。

HostPort对应的端口代表宿主机的端口。

建议容器使用什么端口,宿主机就映射什么端口,方便以后管理。当然,具体情况,具体分析。

{  
    "PortBindings": {  
        "8502/tcp": [  
            {  
                "HostIp""",  
                "HostPort""8502"  
            }  
        ],  
        "8505/tcp": [  
            {  
                "HostIp""",  
                "HostPort""8505"  
            }  
        ]  
    }  

如果config.v2.json配置文件或者config.json配置文件中也记录了端口,也需要进行修改,如果没有,就不需要改。

只需要修改”ExposedPorts”: {}相关之处。

{  
    "Args": [],  
    "Config": {  
        "ExposedPorts": {  
            "8502/tcp": {},  
            "8505/tcp": {}  
        },  
        "Entrypoint": [  
            "/bin/sh"  
        ]  
    }  
}  

最后重启 docker,然后查看容器相关配置信息是否已经修改完毕

# 重启 docker  
service docker restart  
# 或者  
systemctl restart docker  

查看容器相关配置信息:

docker inspect {容器的名称或者 id }  
# 比如:  
docker inspect cbe26510c276  

配置符合你的要求后,再次启动容器:

docker start {容器的名称或者 id }  
# 比如:  
docker start cbe26510c276  

优缺点:这个方法的优点是没有副作用,操作简单。缺点是需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,就会影响其他容器服务。

方法三:利用docker commit新构镜像

docker commit:把一个容器的文件改动和配置信息commit到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。

停止docker容器

docker stop container01

commit该docker容器

docker commit container01 new_image:tag

用前一步新生成的镜像重新起一个容器

docker run --name container02 -p 80:80 new_image:tag

优缺点:这种方式的优点是不会影响统一宿主机上的其他容器,缺点是管理起来显得比较乱,没有第二种方法那么直观。

Docker Desktop for Mac

How to login the VM of Docker Desktop for Mac

因为在 Docker for MacOS 中,容器的宿主机并不是 MacOS 本身,而是在 MacOS 中运行的一个 VM 虚拟机。虚拟机的路径可以通过查看 Docker Desktop 的配置界面Disk image location配置获得。

那么我们如何进入这个虚拟机呢?

最简单的方式是采用 justincormack/nsenter1 进入,这个镜像只有 101KB,已经非常小了。

docker run -it --rm --privileged --pid=host justincormack/nsenter1  

然后再进入/var/lib/docker/containers目录修改config.v2.json配置文件和hostconfig.json配置文件即可。整体来说,在 MacOS 上除了进入/var/lib/docker/containers目录时,进入方式有所不同以外,修改配置文件方式和上文一样。需要注意的是,修改的时候请使用vi编辑器,因为这个镜像没有安装vim编辑器的。

比如:

vi /var/lib/docker/containers/a7377587b9f08cfe87af9a8ffa4da0f90bf07fb0a1cd6833a5ffcd9c37b842d0/config.v2.json  
  
vi /var/lib/docker/containers/a7377587b9f08cfe87af9a8ffa4da0f90bf07fb0a1cd6833a5ffcd9c37b842d0/hostconfig.json  

链接:blog.csdn.net/weixin_42274846/article/details/127912450

读者专属技术群

构建高质量的技术交流社群,欢迎从事后端开发、运维技术进群(备注岗位,已在技术交流群的请勿重复添加),相互帮助,一起进步!请文明发言,主要以技术交流、内推、行业探讨为主。

广告人士勿入,切勿轻信私聊,防止被骗

docker进入容器后能干嘛_docker进容器_docker 进入运行容器

原创文章,作者:筱凯,如若转载,请注明出处:https://www.jingyueyun.com/ask/433.html

(0)
筱凯筱凯
上一篇 2024 年 7 月 11 日
下一篇 2024 年 7 月 11 日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

云产品限时秒杀。精选云产品高防服务器,500M大带宽限量抢购  >>点击进入