为了使项目的开发更容易,我在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
向我们展示如何启动您的容器
端口映射可以在泊坞窗运行命令中发生:-p 主机端口:容器端口
如
docker run -p 5432:5432 --name mycontainer -d myimage
如果我理解得不错的话,对于开发来说,您会希望localhost解析到一个特定的容器,包括从另一个容器调用它的时候。
正如你所提到的,重写你的主机
文件不是一个好主意,因为如果你将localhost设计为与本地主机不同的东西,那么许多服务可能会尝试问题。您当地的主人。
但您可以考虑一些解决方案。
如果使用Docker Toolbox
运行docker,或者自己在使用Virtual Box
的虚拟机上运行docker,中间虚拟机是可见的,因此localhost
将表示它。您必须运行容器,公开此端口,然后在Virtualbox中设置端口转发。如果我使用Wordpress作为示例:
docker运行-p80:80——网站名称-d wordpress
它将使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