У меня есть одно приложение node.js (веб-приложение) и два приложения lumen (api, customer-api), балансировка нагрузки которых выполняется контейнером nginx, прослушивающим порт 80.
Мой файл docker-compose.yml:
version: '2'
services:
nginx:
build:
context: ../
dockerfile: posbytz-docker/nginx/dockerfile
volumes:
- api
- customer-api
ports:
- "80:80"
networks:
- network
depends_on:
- web-app
- api
- customer-api
web-app:
build:
context: ../
dockerfile: posbytz-docker/web-app-dockerfile
volumes:
- ../web-app:/posbytz/web-app
- /posbytz/web-app/node_modules
ports:
- "3004:3004"
networks:
- network
api:
build:
context: ../
dockerfile: posbytz-docker/api-dockerfile
volumes:
- ../api:/var/www/api
networks:
- network
customer-api:
build:
context: ../
dockerfile: posbytz-docker/customer-api-dockerfile
volumes:
- ../customer-api:/var/www/customer-api
networks:
- network
redis:
image: redis
ports:
- "6379:6379"
networks:
- network
memcached:
image: memcached
ports:
- "11211:11211"
networks:
- network
mysql:
image: mysql:5.7
volumes:
- ./db-data:/var/lib/mysql
ports:
- "3306:3306"
networks:
- network
adminer:
image: adminer
restart: always
ports:
- "9001:8080"
networks:
- network
networks:
network:
driver: bridge
Поскольку я использую мостовую сеть, я могу получить доступ к каждому контейнеру из другого контейнера, используя имена контейнеров. Но вместо этого я хочу получить доступ к контейнерам, используя имя_сервера их конфигурации nginx.
Ниже приведены настройки nginx для каждого приложения,
Веб-app.conf:
server {
listen 80;
server_name posbytz.local;
resolver 127.0.0.11 valid=10s;
location / {
proxy_pass http://web-app:3004;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
api.conf:
server {
listen 80;
index index.php index.html;
root /var/www/api/public;
server_name api.posbytz.local;
resolver 127.0.0.11 valid=10s;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
клиент-api.conf
server {
listen 80;
index index.php index.html;
root /var/www/customer-api/public;
server_name customer-api.posbytz.local;
resolver 127.0.0.11 valid=10s;
location / {
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass customer-api:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
проблема
Я хочу получить доступ к контейнерам api и customer-api из контейнера веб-приложения. Проблема в том, что когда я пытаюсь curl http://nginx
, я получаю ответ только из контейнера API. Есть ли способ получить доступ к контейнеру customer-api через контейнер nginx?
Что я пробовал
Когда я вручную сопоставил IP-адрес контейнера nginx (172.21.0.9) с соответствующим им именем server_name в файле / etc / hosts в контейнере веб-приложения, похоже, он работает.
Что я добавил в файл / etc / hosts в контейнере веб-приложения:
172.21.0.9 api.posbytz.local
172.21.0.9 customer-api.posbytz.local
Есть ли другой способ добиться этого без ручного вмешательства?