我现在正在阅读很多关于如何设置和运行docker堆栈的内容。但我总是遗漏的一件事是如何设置特定容器通过他们的域名响应访问,而不仅仅是使用docker dns响应他们的容器名称。
我的意思是,我说有一个外部可访问的微服务,例如:users.mycompany.com,它将进入处理用户api的微服务容器
然后,当我尝试访问customer-list.mycompany.com时,它将进入处理客户列表的微服务容器
当然,使用docker dns我可以访问它们并将它们链接到一个docker网络,但这只适用于想要访问容器到容器,而不是Internet到容器。
有人知道我应该怎么做吗?或者是设置它的最佳方式。
答案 0 :(得分:19)
因此,您需要使用端口发布的概念,以便可以通过主机上的端口访问容器中的端口。使用此方法,您可以从nginx设置一个简单的proxy_pass,它将users.mycompany.com重定向到myhost:1337(假设您将端口发布到1337 )
因此,如果您想这样做,您需要设置容器以使用以下方式公开某个端口:
docker run -d -p 5000:5000 training/webapp # publish image port 5000 to host port 5000
然后,您可以从主机卷曲您的localhost:5000来访问容器。
curl -X GET localhost:5000
如果您想在前面设置域名,则需要有一个Web服务器实例,允许您 proxy_pass 将您的主机名添加到容器中。
即。在nginx:
server {
listen 80;
server_name users.mycompany.com;
location / {
proxy_pass http://localhost:5000;
}
}
我建议您关注this tutorial,也许请查看docker run reference
答案 1 :(得分:1)
据我所知,Docker并没有提供开箱即用的功能。但肯定有几种解决方法。实际上,您需要在主机上部署DNS,以区分容器并在动态IP中解析其域名。所以你可以试试:
部署一些支持Docker的DNS解决方案(我建议您使用SkyDNSv1 / SkyDock);
配置您的主机使用此DNS(默认情况下,SkyDNS使容器按名称相互了解,但主机不知道它);
使用显式--hostname运行容器(您可能会使用scheme container_name.image_name.dev.skydns.local)
您可以跳过步骤#2并在容器内运行浏览器:它将按主机名发现Web应用程序容器。
答案 2 :(得分:0)
这是nginx和docker-compose的一种解决方案:
Nginx配置:
server {
listen 0.0.0.0:8097;
root /root/for/users.mycompany.com
...
}
server {
listen 0.0.0.0:8098;
root /root/for/customer-list.mycompany.com
...
}
server {
listen 0.0.0.0:80;
server_name users.mycompany.com;
location / {
proxy_pass http://0.0.0.0:8097;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
server {
listen 0.0.0.0:80;
server_name customer-list.mycompany.com;
location / {
proxy_pass http://0.0.0.0:8098;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Docker撰写配置:
services:
nginx:
container_name: MY_nginx
build:
context: .docker/nginx
ports:
- '80:80'
...