windows - 主机名到 docker 容器的映射?
问题描述
当 Apache 直接安装在主机上时,我在其中添加了一个内部主机名"C:\Windows\System32\drivers\etc\hosts"
并使用虚拟主机轻松访问本地不同的项目说:http://foo.test
和http://bar.test
.
为每个项目使用 docker 容器,我可以通过在docker-compose
文件中分配主机端口来访问项目。
我希望docker可能有一些内部工具来实现通过主机名访问容器。
如这些相对较旧但精彩的文章中所述,使用反向代理可能是一种解决方案。
- https://www.alexecollins.com/developing-with-docker-proxy-container/
- http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/
但是因为我相信这是一个非常普遍的开发需求,我希望 Docker 有内置的东西来解决它。
解决方案
我解决这个问题的方法如下。考虑我有容器 A 和 B 都运行网络服务器。我只是在我的本地机器上添加了一个反向代理,它查看主机名,然后代理到相应的容器。
但是我没有通过硬编码的 IP 地址进行代理,而是通过本地端口进行代理。因此,不要将两个容器都绑定到端口 80,而是将它们绑定到随机的本地端口(例如 4041)并通过该端口进行代理。这样你就可以将容器 IP 与主机分离。
我的 nginx 文件看起来像这样:
server {
server_name example.com # Add <host lan ip> example.com to your /etc/hosts file
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # These two lines ensure that the
proxy_set_header Connection "Upgrade"; # a WebSocket is used
proxy_pass http://localhost:4041/;
}
<snip>
添加多个容器仅意味着您必须编辑 1 个 nginx 代理文件,并将端口绑定到本地计算机。Docker ip 和您的本地主机文件之间没有耦合。