因为在 Docker for MacOS 中,容器的宿主机并不是 MacOS 本身,而是在 MacOS 中运行的一个 VM 虚拟机。虚拟机的路径可以通过查看 Docker Desktop 的配置界面Disk image location
配置获得。
那么我们如何进入这个虚拟机呢并设置容器呢?
可以采用 justincormack/nsenter1 进入,这个镜像只有 101KB,已经非常小了。
docker run -it --rm --privileged --pid=host justincormack/nsenter1
- –rm 表示在退出的时候就自动删除该容器;
- –privileged 表示允许该容器访问宿主机(也就是我们想要登录的 VM )中的各种设备;
- –pid=host 表示允许容器共享宿主机的进程命名空间(namespace),或者通俗点儿解释就是允许容器看到宿主机中的各种进程;
先停止容器,
在终端运行以上命令之后自动进入容器
然后 cd /var/lib/docker/containers/ 可以看到安装的所有容器,找到要修改端口的容器id,cd 进入,可以看到 hostconfig.json 和 config.v2.json 文件
由于justincormack/nsenter1容器未安装 vim,只能使用 vi 打开 hostconfig.json 和 config.v2.json 文件,并修改对应的端口
修改hostconfig.json
配置文件
在hostconfig.json
配置文件中,找到"PortBindings":{}
这个配置项,然后进行修改。我这里添加了两个端口映射,分别将宿主机的端口 9501,9510
端口映射到容器的9501,9510
端口。
HostPort
对应的端口代表宿主机的端口,实际端口按需修改,如下:
{"PortBindings":{"9501/tcp":[{ "HostIp":"","HostPort":"9501"}],"9510/tcp":[{"HostIp":"","HostPort":"9510"}]}}
修改config.v2.json
配置文件
修改"ExposedPorts": {}
相关之处,需要和 HostPort 中端口对应,如下:
{"Args":[],"Config":{"ExposedPorts":{"9501/tcp":{},"9510/tcp":{}},"Entrypoint":["/bin/sh"]}}
修改好之后 :wq 保存退出,再重启 docker desktop 服务之后,可以看到端口已经修改完成