2016-10-05 193 views
0

我想使用Docker容器來分離我的新項目基礎結構,並且我是Docker中的新手。我遇到了一個問題。首先,我將展示我的配置示例,然後解決問題。如何從鏈接的PHP Docker容器連接到Docker容器中的nginx vhost?

配置示例

nginx: 
     restart: always 
     image: nginx:latest 
     expose: 
      - 80 
     ports: 
      - 8181:80 
#   - 80:80 
     volumes: 
      - ../.:/code 
      - ./docker/nginx/hosts:/etc/nginx/conf.d/ 
      - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf 
     links: 
      - php 
php: 
     restart: always 
     build: docker/php5.6-fpm 
    # image: php:5.6-fpm 
    # ports: 
    #  - 9000:9000 
     volumes: 
      - ../.:/code 
     links: 
       - redis_loc 
       - postgres_loc 
       - memcached_loc 
       - rabbitmq_loc 

這是一個例子。我已經放棄了*_loc服務的詳細信息。 因此,我有兩個本地域進行開發,如site1.locsite2.loc。我使用的是微服務架構,site2.locsite1.loc的微服務。

我有用於所有微服務代碼的公共php容器和 我有用於所有配置了*.loc.conf配置文件的微服務的nginx容器。 Nginx聽取Docker網絡中的80端口。 該主機通過主機上的8181端口可用。 在本地(主機)機器上,我將前端nginx與配置爲代理的*.loc配置相同,配置爲8181類似物。 我也有我的/etc/hosts記錄

127.0.0.1 site1.loc 
127.0.0.1 site2.loc 

所以,我可以在瀏覽器本地網站打開,並與他們獨立工作。

問題

的問題是,即site2.loc是微服務,所以它應該是從site1.loc PHP代碼訪問。 而現在,當我嘗試發送請求,從site1.loc PHP代碼,我發現了錯誤site2.loc:

'stream_socket_client(): unable to connect to site2.loc:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)' 

腓找不到site2.loc的方式。

我已經嘗試在nginx和php容器上使用docker-compose功能extra_hosts,但它對我沒有幫助。

#  extra_hosts: 
#   - "site1.loc:nginx" 
#   - "site2.loc:nginx" 

我試圖配置自定義網絡,但後來我意識到,這是錯誤的方式。

另外我已經試過jwilder/nginx-proxy,但它使vhosts只適用於本地機器,不在PHP容器內。

我清楚地明白,問題的根源在於php容器內的環境對site2.loc主機並不知情。我想我需要某種主機映射或dns進行配置。

但我不知道如何實現這樣的配置,並找不到任何示例(我昨天半天搜索了一下)。

我怎樣才能讓site2.loc php代碼訪問site2.loc?

UPD

我已經想通了,我需要使用領事。沒有領事有沒有其他辦法?

UPD

指示與在extra_hosts參照172.17.0.1的主機的幫助下方式。提示,如何爲製作選擇一種方法 - extra_hosts,dns,Consul?鑑於我在服務器上有幾個項目在附近,在容器中或沒有。

回答

1

您是否需要外部訪問您的microservice site2.loc?如果沒有,你可以在兩個nginx的集裝箱拆1和Site2,那麼你可以做這樣的用戶定義的網絡:

  1. 創建一個名爲網絡「應用網」
  2. 當您創建的每個服務連接它們到網絡並給它們一個別名(--network-alias),讓我們假設你把別名site2放在微服務上
  3. Docker中有一個內部DNS服務器,它將解析容器的域名。所以當你想從PHP代碼訪問site2時,只需使用「site2」即可解析成PHP容器可訪問的IP地址(如果它們全部連接到同一個用戶定義的網絡)

Just確保PHP進程可以訪問與nginx具有相同路徑的PHP文件。

編輯:在泊塢窗撰寫我認爲淨別名與服務名稱automaticaly設置
EDIT2:其實搬運工撰寫是建立一個網絡automaticaly https://docs.docker.com/compose/networking/#/networking-in-compose

+0

主要這裏的一點是 - 斯普利特1和Site2兩個nginx容器。我雖然已經解決了這個問題,但是我想通過虛擬主機(通過像http://site2.loc這樣的鏈接)訪問site2.loc,而不是通過docker dns服務名稱。 –

+0

PHP: ... 鏈接: - nginx的:site1.loc - nginx的:site2.loc 這應該通過創建兩個別名nginx的容器和nginx的辦會重定向到正確的虛擬主機 –

+0

通常配置是當nginx鏈接php時,在這個方向上,不是相反的。並且不可能同時從php鏈接回nginx。這是Docker雙向鏈接中衆所周知的問題。如果沒有額外的dns容器或沒有使用服務發現軟件,就不能解決這個問題,比如Consul。或者如果我不瞭解你的話,請顯示docker-compose config的工作示例。 –

相關問題