我想使用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.loc
和site2.loc
。我使用的是微服務架構,site2.loc
是site1.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和Site2兩個nginx容器。我雖然已經解決了這個問題,但是我想通過虛擬主機(通過像http://site2.loc這樣的鏈接)訪問site2.loc,而不是通過docker dns服務名稱。 –
PHP: ... 鏈接: - nginx的:site1.loc - nginx的:site2.loc 這應該通過創建兩個別名nginx的容器和nginx的辦會重定向到正確的虛擬主機 –
通常配置是當nginx鏈接php時,在這個方向上,不是相反的。並且不可能同時從php鏈接回nginx。這是Docker雙向鏈接中衆所周知的問題。如果沒有額外的dns容器或沒有使用服務發現軟件,就不能解決這個問題,比如Consul。或者如果我不瞭解你的話,請顯示docker-compose config的工作示例。 –