2

我有网络应用程序。

  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;
}

码头工人撰写

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
4

2 回答 2

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
于 2016-03-17T17:09:20.950 回答
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 中公开端口!

如果你做...

docker exec -it containerName bash

你将能够探索。

查看容器内的 hosts 文件。

cat /etc/hosts

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

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

于 2016-03-17T16:39:52.473 回答