我不确定在这里是否误解了一些东西,但是似乎只能通过从映像创建新容器来设置端口映射。是否可以将端口映射分配给现有Docker容器?
我不确定在这里是否误解了一些东西,但是似乎只能通过从映像创建新容器来设置端口映射。是否可以将端口映射分配给现有Docker容器?
Answers:
您可以通过直接编辑 hostconfig.json
文件
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
您可以通过docker inspect <container_name>
命令确定[hash_of_the_container] ,“ Id”字段的值为哈希。
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
因此,您无需使用这种方法来创建图像。您也可以在此处更改重新启动标志。
PS:您可以访问https://docs.docker.com/engine/admin/,以了解如何根据主机正确重启Docker引擎。我曾经sudo systemctl restart docker
重启过在Ubuntu 16.04上运行的Docker引擎
hostconfig.json
和config.v2.json
使其工作。使用@rohitmohta提供的链接查看详细信息。
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
一旦让tty运行,就可以导航到/ var / lib /
我对这个问题也很感兴趣。
如@Thasmo所述,只能使用docker run
(和docker create
)命令指定端口转发。
其他命令docker start
没有-p
选项,docker port
仅显示当前转发。
要添加端口转发,我总是遵循以下步骤,
停止运行容器
docker stop test01
提交容器
docker commit test01 test02
注意:上面test02
是我正在从test01
容器中构造的新图像。
从提交的映像重新运行
docker run -p 8080:8080 -td test02
其中第一个8080是本地端口,第二个8080是容器端口。
docker start
?
不确定是否可以应用端口映射正在运行的容器。您可以在运行与创建新容器不同的容器时应用端口转发。
$ docker run -p <public_port>:<private_port> -d <image>
将开始运行容器。本教程介绍了端口重定向。
docker run
创建并启动一个新的容器。等同于docker create
接着执行docker start
。
现在编辑hostconfig.json似乎无法正常工作。它仅以暴露该端口而不发布给主机为结尾。对我来说,提交和重新创建容器不是最佳方法。没有人提到docker network
吗?
最好的解决方案是在同一网络中使用反向代理
如果您以前的容器不在任何命名容器中,请创建一个新的网络。
docker network create my_network
将现有容器加入创建的网络
docker network connect my_network my_existing_container
启动反向代理服务(例如nginx),发布所需的端口,加入同一网络
docker run -d --name nginx --network my_network -p 9000:9000 nginx
(可选)在Nginx中删除default.conf
docker exec nginx rm /etc/nginx/conf.d/default.conf
创建一个新的Nginx配置
server
{
listen 9000;
location / {
proxy_pass http://my_existing_container:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
将配置复制到nginx容器。
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
重新启动nginx
docker restart nginx
优点:要发布新端口,您可以安全地停止/更新/重新创建nginx容器,而无需触摸业务容器。如果您需要nginx的停机时间为零,则可以添加更多反向代理服务加入同一网络。此外,一个容器可以加入多个网络。
编辑:
要反向代理非HTTP服务,配置文件会有所不同。这是一个简单的示例:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
如果运行docker run <NAME>
,它将生成一个新图像,这很可能不是您想要的。
如果要更改当前图像,请执行以下操作:
docker ps -a
获取目标容器的ID,然后转到:
cd /var/lib/docker/containers/<conainerID><and then some:)>
停止容器:
docker stop <NAME>
变更档案
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
并更改文件
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
重新启动您的泊坞窗,它应该可以工作。
如果您对Docker深度配置IPtable不满意,可以采取另一种解决方法。
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}
这只是一个技巧,不建议与我的方案配合使用,因为我无法停止容器,希望对您有所帮助。
DOCKER_PORT
到MACHINE_PORT
,应该更改哪些部分?
我们使用诸如ssh之类的方便工具轻松完成此操作。
我正在使用ubuntu主机和基于ubuntu的docker映像。
当需要映射新端口时,
在docker内部运行以下命令
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1是docker接口的ip(您可以通过ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
在主机上运行来获取此地址
)。
在这里,我将本地8888端口映射回了主机8888。您可以根据需要更改端口。
如果还需要一个端口,则可以终止ssh并使用新端口向其添加-R一行。
我已经用netcat测试过了。
对于Windows和Mac用户,还有另一种非常简单友好的方式来更改映射端口:
下载风筝
转到容器的设置页面,在“端口”选项卡上,可以直接在此处修改已发布的端口。
再次启动容器
简短的答案:您不能将端口映射分配给现有的Docker容器
您需要一个新的容器...进行处理。
如果只想更改正在运行的容器的端口,则可以执行以下操作:
sudo docker停止NAME
sudo docker run -d -p 81:80名称
如:
“ -d”到后台/守护docker
“ -p”启用端口映射
用于通过浏览器访问的“ 81”个外部(公开)端口
“ 80”内部Docker容器侦听端口
docker run
命令中,NAME
是要从其运行容器的映像的名称,而在中docker stop
,NAME
是指要停止的容器的名称。