Docker - nginx代理 - 访问容器之间的主机

时间:2016-03-17 16:28:47

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

我有网络应用程序。

  1. 公共网络应用(app1)
  2. api web app(app2)
  3. 我为这个应用程序制作了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
    

2 个答案:

答案 0 :(得分:1)

不确定您运行的docker版本是什么,但如果您(或能够)运行1.10,则应使用docker网络而不是使用“link”。

如果您在同一个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

答案 1 :(得分:0)

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中EXPOSE端口!

如果你这样做......

docker exec -it containerName bash

你将能够探索。

查看容器内的hosts文件。

cat /etc/hosts

如果你有 - 正确链接容器,你会在hosts文件中看到另一个容器的条目。

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