tha*_*smo 373 port lxc docker linux-containers
我不确定我是否在这里误解了一些东西,但似乎只能通过从图像创建一个新容器来设置端口映射.有没有办法将端口映射分配给现有的Docker容器?
小智 427
我也对这个问题感兴趣.
正如@Thasmo所提到的,只能通过docker run
命令指定端口转发.
其他命令docker start
没有-p
选项,docker port
只显示当前转发.
要添加端口转发,我始终按照以下步骤操作:
停止运行容器
docker stop test01
Run Code Online (Sandbox Code Playgroud)提交容器
docker commit test01 test02
Run Code Online (Sandbox Code Playgroud)
注意:上面test02
是我从test01
容器构建的新图像.
从提交的图像中重新开始
docker run -p 8080:8080 -td test02
Run Code Online (Sandbox Code Playgroud)第一个8080是本地端口,第二个8080是集装箱端口.
hol*_*vaj 254
您可以通过直接编辑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
Run Code Online (Sandbox Code Playgroud)
因此,您无需使用此方法创建图像.您也可以在此处更改重启标志.
PS您可以访问https://docs.docker.com/engine/admin/,了解如何根据主机正确重启docker引擎.我曾经sudo systemctl restart docker
重新启动在Ubuntu 16.04上运行的docker引擎
raj*_*kan 17
不确定是否可以将端口映射应用于正在运行的容器.您可以在运行与创建新容器不同的容器时应用端口转发.
$ docker run -p <public_port>:<private_port> -d <image>
Run Code Online (Sandbox Code Playgroud)
将开始运行容器.本教程介绍端口重定向.
小智 16
在Fujimoto Youichi的例子test01
是一个容器,而是test02
一个图像.
在此之前,docker run
您可以删除原始容器,然后再次为容器指定相同的名称:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
Run Code Online (Sandbox Code Playgroud)
(-P
用于将端口暴露给随机端口而不是手动分配).
Sea*_* C. 11
编辑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;
}
}
Run Code Online (Sandbox Code Playgroud)
将配置复制到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;
}
Run Code Online (Sandbox Code Playgroud)
小智 10
If you run docker run <NAME>
it will spawn a new image, which most likely isn't what you want.
If you want to change a current image do the following:
docker ps -a
Take the id of your target container and go to:
cd /var/lib/docker/containers/<conainerID><and then some:)>
Run Code Online (Sandbox Code Playgroud)
Stop the container:
docker stop <NAME>
Run Code Online (Sandbox Code Playgroud)
Change the files
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
Run Code Online (Sandbox Code Playgroud)
And change file
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
Run Code Online (Sandbox Code Playgroud)
Restart your docker and it should work.
rof*_*rol 10
# 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
Run Code Online (Sandbox Code Playgroud)
i
进入插入模式。"HostPort":"80"
为"HostPort":"8092"
Escape
并书写:wq
。按Enter
。docker101tutorial
。否则HostPort
将恢复对 的更改。8092
。8092
主机上的端口。基于@holdfenytolvaj 的回答。
如果您对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}
Run Code Online (Sandbox Code Playgroud)
这只是一个技巧,不建议与我的方案配合使用,因为我无法停止容器,希望对您有所帮助。
我们使用诸如ssh之类的方便工具轻松完成此操作。
我正在使用ubuntu主机和基于ubuntu的docker映像。
当需要映射新端口时,
在docker内部运行以下命令
ssh -R8888:localhost:8888 <username>@172.17.0.1
Run Code Online (Sandbox Code Playgroud)
172.17.0.1是docker接口的ip(您可以通过ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
在主机上运行来获取此地址
)。
在这里,我将本地8888端口映射回了主机8888。您可以根据需要更改端口。
如果还需要一个端口,则可以终止ssh并使用新端口向其添加-R一行。
我已经用netcat测试过了。
小智 6
/var/lib/docker/containers/${container_id}
目录并编辑hostconfig.json
PortBindings.HostPort
您想要的更改。 归档时间: |
|
查看次数: |
344485 次 |
最近记录: |