【问题标题】:Docker - nginx proxy - access hosts between containersDocker - nginx 代理 - 访问容器之间的主机
【发布时间】:2016-07-04 03:31:29
【问题描述】:

我有网络应用程序。

  1. 公共网络应用 (app1)
  2. api 网络应用 (app2)

我为此应用程序进行 docker 配置。每个应用程序都在其容器中。要从 Web 访问此应用程序,请使用 nginx 配置容器,其中 nginx 代理所有请求。
所以我可以运行 - http://app1.dev/http://app2.dev/

但我需要从 app1 访问 http://app2.dev/(从 app1 容器访问主机 app2.dev)。

Ping(来自 app1 容器):

PING app2.dev (127.0.53.53) 56(84) bytes of data.
64 bytes from 127.0.53.53: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 127.0.53.53: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 127.0.53.53: icmp_seq=3 ttl=64 time=0.038 ms

我还应该配置什么,才能从 app1 容器访问 http://app2.dev/ 主机?

Nginx 代理配置

upstream app1_upstream {
    server app1;
}
upstream app1_upstream {
    server app2;
}
server {
    listen 80;

    server_name app1.dev
                app2.dev;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;

        if ($host = "app1.dev") {
            proxy_pass http://app1;
        }

        if ($host = "app2.dev") {
            proxy_pass http://app2;
        }
    }

    error_log  /var/log/nginx/proxy_error.log;
    access_log /var/log/nginx/proxy_access.log;
}

Docker 编写

version: '2'
services:
    proxy:
        build: ./proxy/
        ports:
            - "80:80"
            - "443:443"
        links:
            - app1
            - app2
            - app1:app1
            - app2:app2
        hostname: proxy

    app1:
        build: ./app1/
        volumes:
            - ../app1/:/var/www/app1
        hostname: app1

    app2:
        build: ./app2/
        volumes:
            - ../app2/:/var/www/app2
        hostname: app2

docker-compose ps

app1      /sbin/my_init  Up      80/tcp                                   
app2     /sbin/my_init  Up      80/tcp                                   
proxy_1   /sbin/my_init  Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

【问题讨论】:

    标签: nginx docker virtualization docker-compose docker-networking


    【解决方案1】:

    不确定您运行的是哪个版本的 docker,但如果您正在(或能够)运行 1.10,您应该使用 docker 网络而不是使用“链接”。

    如果您在同一个 docker 网络上运行所有三个容器,那么它们将可以通过它们的容器名称相互访问。

    这将允许您在不通过代理返回的情况下从 app1 调用 app2(尽管我将其称为反模式,就好像您要将接口更改为 app2 一样,您必须更新 app1 和代理,我会让 app1 通过您的代理调用 app2,以便您维护一个接口)。

    有关 Docker 网络的更多信息:https://docs.docker.com/engine/userguide/networking/dockernetworks/

    TLDR:

    # create bridge network (for single host)
    docker networks create my-network
    

    然后也改变你的作曲:

    version: '2'
    services:
        proxy:
            build: ./proxy/
            ports:
                - "80:80"
                - "443:443"
            networks:
                - my-network
            hostname: proxy
    
        app1:
            build: ./app1/
            volumes:
                - ../app1/:/var/www/app1
            networks:
                - my-network
            hostname: app1
    
        app2:
            build: ./app2/
            volumes:
                - ../app2/:/var/www/app2
            networks:
                - my-network
            hostname: app2
    
    networks:
       my-network:
        external: true
    

    【讨论】:

    • 您好!我尝试了同样的事情,但没有为我工作。 Nginx 仍然无法解析名称。我错过了什么许可吗?
    • 我认为你的意思是 docker network create my-network (without an s)
    【解决方案2】:
    ports:
        - "80:80"
        - "443:443"
    

    向主机公开端口。当你这样做

    docker ps -a
    

    您将看到列出的这些端口

    但是,要在容器之间公开端口,您需要在 dockerfile 中使用 EXPOSE 命令。

    https://docs.docker.com/engine/reference/builder/#expose

    What i should configure else, to have access to http://app2.dev/ host from app1 container?
    

    您必须在 dockerfile 中公开端口!

    如果你做...

    docker exec -it containerName bash
    

    您将能够探索。

    查看容器内的 hosts 文件。

    cat /etc/hosts
    

    如果您正确地 --link 容器,您将在 hosts 文件中看到另一个容器的条目。

    您可以使用 hosts 文件中的域名 ping。

    【讨论】:

    • 我已经更新了问题。端口没有问题。我可以从网络访问应用程序。
    • 每个容器主机文件仅包含此容器172.19.0.8 proxy 的记录(这是用于代理,对于 app1 和 app2 他们自己的 ip)但是您可以看到 docker-compose 文件 - 是否存在不正确的链接?每个应用程序 Dockerfile 包含 - EXPOSE 80
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2020-02-17
    • 2017-02-18
    相关资源
    最近更新 更多