如何将域名分配给docker中的容器

Chr*_*mas 21 dns docker docker-compose

这些天我正在阅读很多关于如何设置和运行docker堆栈的内容.但我总是错过的一件事是如何设置特定容器通过他们的域名响应访问,而不仅仅是使用docker dns响应他们的容器名称.

我的意思是,说我有一个外部可访问的微服务,例如:users.mycompany.com,它将进入处理用户api的微服务容器

然后,当我尝试访问customer-list.mycompany.com时,它将进入处理客户列表的微服务容器

当然,使用docker dns我可以访问它们并将它们链接到docker网络,但这只适用于想要访问容器到容器,而不是Internet到容器.

有人知道我应该怎么做吗?或者是设置它的最佳方式.

Mag*_*cky 24

因此,您需要使用端口发布的概念,以便可以通过主机上的端口访问容器中的端口.使用此方法,您可以从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
Run Code Online (Sandbox Code Playgroud)

然后,您可以从主机curl your localhost:5000访问容器.

curl -X GET localhost:5000
Run Code Online (Sandbox Code Playgroud)

如果要在前面设置域名,则需要有一个Web服务器实例,允许您将主机名proxy_pass到容器.

即在nginx中:

server {
  listen 80;
  server_name users.mycompany.com;
  location / {
    proxy_pass http://localhost:5000;
  }
}
Run Code Online (Sandbox Code Playgroud)

我建议你按照本教程,也许检查docker run reference


fic*_*489 8

这是一种使用 nginx 和 docker-compose 的单一解决方案:

  • users.mycompany.com位于端口 8097 上的 nginx 容器中
  • customer-list.mycompany.com位于端口 8098 上的 nginx 容器中

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Docker 撰写配置:

services:
  nginx:
    container_name: MY_nginx
    build:
      context: .docker/nginx
    ports:
      - '80:80'
    ...
Run Code Online (Sandbox Code Playgroud)


小智 5

据我所知,Docker 并未立即提供此功能。但这里肯定有几种解决方法。事实上,您需要在主机上部署一个 DNS,以区分容器并在动态 IP 中解析它们的域名。所以你可以尝试:

  1. 部署一些支持 Docker 的 DNS 解决方案(我建议您使用SkyDNSv1 / SkyDock);

  2. 配置您的主机以使用此 DNS(默认情况下SkyDNS使容器通过名称相互了解,但主机不知道);

  3. 使用显式运行容器--hostname(您可能会使用 schema container_name.image_name.dev.skydns.local

您可以跳过第 2步并在容器内运行浏览器。它将通过主机名发现 Web 应用程序容器。