2

我有web應用程序。Docker - nginx代理 - 訪問容器之間的主機

  1. 公共Web應用(應用)
  2. API的網絡應用(應用)

我爲這個應用程序泊塢窗的配置。其容器中的每個應用程序。要從Web訪問此應用程序,請使用nginx配置容器,其中nginx代理所有請求。
所以我可以運行 - http://app1.dev/http://app2.dev/

但我需要有http://app2.dev/(訪問主機從APP1容器app2.dev)從APP1訪問。

平(從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 

​​

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 

回答

1

不知道您運行的是哪個版本的docker,但如果您(或能夠)運行1.10,則應該使用docker網絡而不是使用「link」。

如果您在同一個碼頭網絡上運行所有三個容器,則它們將通過其容器名稱訪問另一個容器。

這將允許你從app1到app2的呼叫,而無需通過代理返回(儘管我會稱之爲反模式,就好像你要將接口更改爲app2一樣,你將不得不更新app1和代理,我會通過您的代理app1調用app2,以便維護一個接口)。

有關泊塢網絡的更多信息: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 
+0

謝謝你的男人。這真的幫了我。 – Dmitry

+0

你好! 我試過同樣的事情,但沒有爲我工作。 Nginx仍然無法解析名稱。我是否明智地遺漏了某些許可? – MSIS

+0

我認爲你的意思是碼頭工人**網絡**創建我的網絡(沒有s) –

0
ports: 
    - "80:80" 
    - "443:443" 

暴露端口到主機。當你做

docker ps -a 

,你會看到這些端口上市

然而,揭露你需要在dockerfile使用曝光命令容器之間的端口。

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 

如果您有 - 正確鏈接容器,您將在hosts文件中看到其他容器的條目。

您可以使用hosts文件中的域名進行ping操作。

+0

我已經更新的問題。港口沒有問題。我可以從網上訪問應用程序。 – Dmitry

+1

每個容器hosts文件包含只記錄了這個容器 '172.19.0.8 \t proxy'(這是代理,爲APP1和APP2自己的IP) 但是你可以看到搬運工人,撰寫文件 - 是否有不正確的連接? 每個應用程序Dockerfile包含 - 「EXPOSE 80」 – Dmitry

相關問題