当前位置: 首页 > 知识库问答 >
问题:

如何将docker容器中的单个端口重定向到容器的主机?

吕文林
2023-03-14

为了使项目的开发更容易,我在docker容器中放置了它所依赖的几个服务。这使得项目配置中的“localhost”在传递给其中一个容器时具有不同的含义。

编辑

清楚地说,我试图将容器的一个端口转发到主机,因此当容器中运行的进程试图访问localhost:5432时,它将连接到主机的端口5432。

结束

我目前正在使用

HOST_IP=`ip route | grep default | awk '{ printf "%s",$3 }'`
cat /etc/hosts | sed "s/127.0.0.1/$HOST_IP/" > /tmp/etc_hosts
cp /tmp/etc_hosts /etc/hosts

将目标为“本地主机”的任何内容重定向到容器的主机。它在这种情况下有效,但我更愿意找到一种方法来只为所需的端口执行此操作,因为我预计它在其他情况下不起作用。

以下是我想出的办法,但它不起作用;当容器中的连接指向localhost:5432时,它会尝试连接到容器的5432,而不是主机的:

# --- These are the things that should make redirecting port 5432 to the host machine
#     work, provided the container is run in privileged mode.
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv4.conf.all.route_localnet=1
iptables -t nat -A PREROUTING -p tcp --dport 5432 -j DNAT --to 172.19.0.1:5432
iptables -A FORWARD -d 172.19.0.1 -p tcp --dport 5432 -j ACCEPT
iptables -t nat -A POSTROUTING -j MASQUERADE

共有2个答案

商德泽
2023-03-14

向我们展示如何启动您的容器

端口映射可以在泊坞窗运行命令中发生:-p 主机端口:容器端口

docker run  -p 5432:5432 --name mycontainer -d myimage
廖招
2023-03-14

如果我理解得不错的话,对于开发来说,您会希望localhost解析到一个特定的容器,包括从另一个容器调用它的时候。

正如你所提到的,重写你的主机文件不是一个好主意,因为如果你将localhost设计为与本地主机不同的东西,那么许多服务可能会尝试问题。您当地的主人。

但您可以考虑一些解决方案。

如果使用Docker Toolbox运行docker,或者自己在使用Virtual Box的虚拟机上运行docker,中间虚拟机是可见的,因此localhost将表示它。您必须运行容器,公开此端口,然后在Virtualbox中设置端口转发。如果我使用Wordpress作为示例:

  1. docker运行-p80:80——网站名称-d wordpress
  2. 虚拟盒子-

它将使Wordpress在http://localhost:8080可用。请注意,在MacOS下,内核限制非特权端口转发(1024下的端口)。

这个端口转发可以在命令行中创建,如果你想把它放在一个脚本中:
VBoxManage 修改vm “默认” --natpf1 “应用程序,tcp,,8080,,80”

如果通过docker for Windows/Dopper for Mac(或直接在Linux下)运行docker,而不是通过docker Toolbox,则可以使用Scott文章中指定的-p参数运行容器,并且您的服务将在此端口的本地主机上可用(因为中间虚拟机是透明的,或者Linux下没有虚拟机):

docker运行-p 5432:5432——将myapp命名为-d myimage将使myapp在本地主机上可用:5432

您可以通过这种方式在主机上运行socat以将特定端口上的通信转发到您的容器:

socat TCP-LISTEN:5432,fork,reuseaddr,用户=节点,组=节点,模式=777 TCP:172.19.0.1:5432

(其中172.19.0.1是您的容器IP)

您的容器有自己的host文件,您可以通过发出这样的命令来查看:

docker运行ubuntu猫 /etc/hosts

您可以使用--add host参数将条目添加到主机

< code > docker run-add-host domain:1 . 2 . 3 . 4-add-host domain 2:5 . 6 . 7 . 8 Ubuntu cat/etc/hosts

但是,此解决方案对<code>localhost

< code > docker run-network = host Ubuntu

这样,您的容器将能够使用端口调用localhost上的其他容器服务。

当然,实现所需内容的正确方法是将容器链接在一起,并使用它们的链接名称而不是 localhost。

docker run -d  --name mariadb -e MYSQL_ROOT_PASSWORD=password mariadb 
docker run -d --name="wordpress" -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --link mariadb:mysql wordpress

在这种情况下,Wordpress容器将在其hosts文件中有一个mysql条目,指向Mariadb容器IP地址。要查看它,请在Wordpress容器中打开一个bash会话并自行查看。

docker exec -ti wordpress bash
#cat /etc/hosts
 类似资料:
  • 我想从一个服务器设置服务多个站点: 到目前为止,我只发现docker在使用静态IPS时进行端口重定向。 是否可以通过主机名使用docker进行端口重定向? 我使用一个免费的亚马逊EC2 Insance。 谢谢博

  • 我有一个在 docker 容器中运行的 mysql 容器,该容器故意无法通过任何端口访问,但可供其他 Docker 容器访问。 例如,考虑以下mysql容器 现在我想在我的主机上存在的mysql中运行一个转储文件。 但是我得到了回应 如何将我的主机输出到docker容器? 请注意一件事,它不是关于错误的,通过删除-it或-i,我没有收到错误,但我无法通过管道输出到docker容器。 问题是如何将任

  • 问题内容: 我想将我的docker容器的所有日志重定向到单个日志文件以进行分析。我试过了 但这使登录两个不同的文件。我已经试过了 但它没有用。 问题答案: 无需重定向日志。 Docker默认将日志存储到一个日志文件中。要检查日志文件路径,请运行命令: 打开该日志文件并进行分析。 如果您重定向日志,则只能在重定向之前获取日志。您将无法看到实时日志。 编辑: 要查看实时日志,可以在以下命令中运行 注意

  • 问题内容: 主机可以打开Docker容器访问端口吗?具体来说,我在主机上运行了MongoDB和RabbitMQ,我想在Docker容器中运行一个进程以侦听队列并(可选)写入数据库。 我知道我可以将端口从容器转发到主机(通过- p选项),并可以从Docker容器中连接到外部环境(即Internet),但我不想公开RabbitMQ和MongoDB端口从主持人到外界 编辑:一些澄清: 我必须执行此技巧才

  • 问题内容: 我正在尝试从主机系统调用docker的mysqldump,以从golang保存mysql dump。它可以与主机mysqldump正常工作,但不能与docker的mysqldump一起工作。 } 我只有非空数据库的 空mysql dump 问题答案: 解决方案是: } 没有“> dbname.sql”

  • 在Ubuntu 20.04上运行新的Docker 20.10.1。此版本包括对主机的支持。码头工人。Linux上dockerd中的内部 我在使用SSL证书的容器中运行了一系列服务,我想使用Telegraf(稍后发送到Grafana仪表板)检查证书是否过期。 所有带有网络接口和Telegraf的服务都运行在同一个Docker主机上。所有服务都在自己的网桥网络中。我想在端口9000上从Telegraf