docker proxy Поддомены/домены для разных контейнеров

Пример конфигурации для nginxproxy/nginx-proxy:

docker-compose.yml с конфигом для прокси:

version: '3.9'
services:
  nginx-proxy:
    container_name: nginx-proxy-double-test-proxy
    image: nginxproxy/nginx-proxy
    ports:
      - "8888:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
    networks:
      - proxynet

networks:
  proxynet:
    name: custom_network

Отдельный docker-compose-app.yml для приложения, например:

version: '3.9'
services:
  whoami:
    container_name: nginx-proxy-double-test-app
    image: jwilder/whoami
    expose:
      - "8000"
    environment:
      - VIRTUAL_HOST=whoami-second-compose.local
      - VIRTUAL_PORT=8000
    networks:
      - proxynet

networks:
  proxynet:
    name: custom_network
    external: true

Makefile c командами для теста (или можно выполнять напрямую в терминале):

start:
	docker-compose -f ./docker-compose.yml up -d
	docker-compose -f ./docker-compose-app.yml up -d
stop:
	docker-compose -f ./docker-compose.yml stop  
	docker-compose -f ./docker-compose-app.yml stop    

test.proxy:
	curl -H "Host: whoami-second-compose.local" localhost:8888

sleep:
	sleep 1
  
retest: stop start sleep test.proxy

Источники:

vedro-compota's picture

Если у вас есть несколько файлов docker-compose.yml,
вы можете использовать функционал docker-compose --project-name
для создания проектов с разными именами для каждого файла.

Например, у вас может быть файл docker-compose-app1.yml,
содержащий настройки для app1, и файл docker-compose-app2.yml,
содержащий настройки для app2.
В таком случае вы можете запустить контейнер jwilder/nginx-proxy
с параметром --project-name для каждого файла, чтобы создать отдельные проекты:

css

docker-compose --project-name app1 up -d
docker-compose --project-name app2 up -d

При этом jwilder/nginx-proxy запускается один раз,
но для каждого проекта создается свой сетевой пространство
и DNS-сервер, что позволяет использовать разные домены для каждого проекта.

Пример docker-compose.yml файла для jwilder/nginx-proxy, который поддерживает два проекта app1 и app2, может выглядеть так:

yaml

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - certs:/etc/nginx/certs:ro
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - proxy_conf:/etc/nginx/conf.d
    networks:
      app1:
      app2:

networks:
  app1:
  app2:

volumes:
  certs:
  vhost:
  html:
  proxy_conf:

Пример docker-compose-app1.yml файла для app1 может выглядеть так:

yaml

version: '3'

services:
  app1:
    image: myapp1
    container_name: app1
    environment:
      - VIRTUAL_HOST=app1.example.com
      - LETSENCRYPT_HOST=app1.example.com
      - LETSENCRYPT_EMAIL=youremail@example.com
    networks:
      app1:

networks:
  app1:
    external:
      name: app1_app1

А пример docker-compose-app2.yml файла для app2 может выглядеть так:

yaml

version: '3'

services:
  app2:
    image: myapp2
    container_name: app2
    environment:
      - VIRTUAL_HOST=app2.example.com
      - LETSENCRYPT_HOST=app2.example.com
      - LETSENCRYPT_EMAIL=youremail@example.com
    networks:
      app2:

networks:
  app2:
    external:
      name: app1_app2

Обратите внимание, что в каждом файле docker-compose-app1.yml
и docker-compose-app2.yml используется отдельное имя сети,
которое является внешним для контейнеров,
и уже определено в файле docker-compose.yml.
Это позволяет контейнерам приложений быть доступными только в своих проектах

_____________
матфак вгу и остальная классика =)