我不确定我是否误解了这里的某些内容,但似乎只能通过从映像创建新容器来设置端口映射。是否有办法将端口映射分配到现有的Docker容器?


当前回答

在Fujimoto Youichi的例子中,test01是一个容器,而test02是一个图像。

在运行docker之前,你可以删除原来的容器,然后重新给容器分配相同的名称:

$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01

(使用-P将端口暴露给随机端口,而不是手动分配)。

其他回答

如果你不适应Docker深度配置,iptables将是你的朋友。

iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}

iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}

iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}

这只是一个技巧,不是推荐的方法。这适用于我的场景,因为我无法停止容器。

对于Windows和Mac用户,还有另一种非常简单友好的方法来更改映射端口:

下载kitematic 进入容器的“设置”页面,在“端口”页签中,可以直接在那里修改已发布的端口。 再次启动容器

使用实例在Docker Desktop下修改容器的HostPort(适用于Windows 10 / MacOS)

# list all containers
$ docker ps -a
$ docker stop docker101tutorial 
# Use grep to get id of container
$ docker inspect docker101tutorial | grep -i id
        "Id": "sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb",
# run plain ubuntu docker image with shell and change it's namespace to docker host
# https://stackoverflow.com/questions/60408574/how-to-access-var-lib-docker-in-windows-10-docker-desktop/60411313#60411313
# https://forums.docker.com/t/the-location-of-images-in-docker-for-windows/19647/4
$ docker run -it --privileged --pid=host ubuntu nsenter -t 1 -m -u -i sh
# We want to find out the directory of docker101tutorial container. We are looking for:
# `"Image":"sha256:fff0a4b22d6f3d2eb8d2748b8a8bbc9967ea87199988acee8e86ac70bce9c3eb"`
# in /var/lib/docker/containers/*/config.v2.json
$ find /var/lib/docker/containers/ -name config.v2.json -exec grep -H fff0a4b22d {} \;
/var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/config.v2.json
# edit it
$ vi /var/lib/docker/containers/c1eda20b30f058bce9f8ece3b47a21641df5b399770e12ab57416a954d3c8bbf/hostconfig.json

按i键插入模式。 修改"HostPort":"80"为"HostPort":"8092" 按“退出”键,输入:wq。按回车。 现在不启动/停止docker101tutorial。否则,对HostPort的修改将被恢复。 右键单击Docker桌面托盘图标,然后单击“重新启动”。 在Docker Desktop的容器列表中,查看您的容器。显示的端口应该变为8092。 启动容器。现在它将被映射到主机上的端口8092。

基于@holdfenytolvaj的答案。

可以通过直接编辑hostconfig修改端口映射。Json文件 /var/lib/docker/containers/ hash_of_the_container / hostconfig。/var/snap/docker/common/var-lib-docker/containers/[hash_of_the_container]/hostconfig. Json或/var/snap/docker/common/var-lib-docker/containers/[hash_of_the_container]/hostconfig. Json。如果你安装Docker作为一个snap. json,我相信。

你可以通过docker inspect <container_name>命令来确定[hash_of_the_container],“Id”字段的值就是哈希值。

停止容器(docker Stop <container_name>)。 停止docker服务(根据Tacsiazuma的评论) 修改文件。 重新启动docker引擎(刷新/清除配置缓存)。 启动容器(docker Start <container_name>)。

所以你不需要用这种方法创建一个图像。您还可以在这里更改重启标志。

附注:您可以访问https://docs.docker.com/engine/admin/了解如何根据您的主机正确重新启动docker引擎。我使用sudo systemctl restart docker重新启动在Ubuntu 16.04上运行的docker引擎。

停止docker引擎和容器。 进入/var/lib/docker/containers/${container_id}目录,编辑hostconfig.json 编辑PortBindings。HostPort您想要更改。 启动码头引擎和容器。