为了使项目的开发更容易,我在 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
Run Code Online (Sandbox Code Playgroud)
将任何针对 'localhost' 的内容重定向到容器的主机。它在这种情况下有效,但我更愿意找到一种仅针对所需端口执行此操作的方法,因为我预计它在其他情况下不起作用。
这是我想出的办法,但它不起作用;当容器中的连接是到 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
Run Code Online (Sandbox Code Playgroud)
如果我理解得很好,对于开发,您希望localhost解析为特定容器,包括从另一个容器调用它时。
hosts正如您所提到的,重写您的文件并不是一个好主意,因为如果您将localhost设计为与……您的本地主机不同的东西,许多服务都可以试验问题。
但是您可以考虑一些解决方案。
如果运行搬运工人用Docker Toolbox,或用自己的虚拟机上Virtual Box,中间的虚拟机是可见的,所以localhost将代表它。您必须运行容器,公开此端口,然后在Virtualbox 中设置端口转发。如果我以Wordpress为例:
docker run -p 80:80 --name website -d wordpress它将使Wordpress在http://localhost:8080. 请注意,在MacOS下,内核会限制非特权端口转发(1024 以下的端口)。
这个端口转发可以在命令行中创建,如果你想把它放在一个脚本中:
VBoxManage modifyvm "default" --natpf1 "app,tcp,,8080,,80"
如果通过/ (或直接在 下)运行docker,您可以使用参数运行容器,如Scott的帖子所指定,并且您的服务将在localhost的此端口上可用(因为中间虚拟机是透明的,或者 Linux 下没有虚拟机): Docker for WindowsDocker for MacLinuxDocker Toolbox-p
docker run -p 5432:5432 --name myapp -d myimage将使myapp在localhost:5432.
您可以通过这种方式在主机上运行socat以将特定端口上的通信转发到您的容器:
socat TCP-LISTEN:5432,fork,reuseaddr,user=node,group=node,mode=777 TCP:172.19.0.1:5432 &
(其中172.19.0.1是您的容器 IP)
你的容器有自己的hosts文件,你可以通过发出这样的命令来查看:
docker run ubuntu cat /etc/hosts
您可以hosts使用--add-host参数添加条目:
docker run --add-host domain:1.2.3.4 --add-host domain2:5.6.7.8 ubuntu cat /etc/hosts
但是,此解决方案对 无用localhost,因为它不会删除以前的localhost关联。您正在寻找(以及更清晰)的是--network=host允许容器共享主机网络接口的参数:
docker run --network=host ubuntu
这样,您的容器将能够使用其端口调用本地主机上的其他容器服务。
当然,实现您想要的正确方法是将您的容器链接在一起并使用它们的链接名称而不是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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Wordpress容器将在其文件中有一个mysql条目hosts,指向mariadb容器 IP 地址。要查看它,请bash在Wordpress容器中打开一个会话并自己查看。
docker exec -ti wordpress bash
#cat /etc/hosts
Run Code Online (Sandbox Code Playgroud)
向我们展示您如何启动容器
端口映射可以在 docker run 命令中进行: -p hostport:containerport
如
docker run -p 5432:5432 --name mycontainer -d myimage
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10592 次 |
| 最近记录: |