Я нахожусь в ситуации, когда мне нужно несколько экземпляров образа Docker.Каждому экземпляру нужен свой собственный домен и сертификат SSL.
Я подумал о следующем решении: я использую jwilder / nginx-proxy и jrcs / letsencrypt-nginx-proxy-companion для обработки виртуальных хостов и сертификатов SSL.Например:
version: "3.1"
volumes:
certs:
vhost.d:
nginx:
services:
nginx-proxy:
image: jwilder/nginx-proxy
restart: always
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
ports:
- "80:80"
- "443:443"
volumes:
- certs:/etc/nginx/certs
- vhost.d:/etc/nginx/vhost.d
- nginx:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
letsencrypt-nginx-proxy-companion:
image: jrcs/letsencrypt-nginx-proxy-companion:v1.9.1
depends_on:
- nginx-proxy
volumes:
- certs:/etc/nginx/certs
- vhost.d:/etc/nginx/vhost.d
- nginx:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
swarm_network:
driver: overlay
external: true
Фактическое приложение состоит из 3 контейнеров.PHP FPM, MySQL, Nginx.Каждое приложение получило бы свой собственный файл компоновки, содержащий конкретные env-переменные, имена томов и т. Д.:
version: "3.1"
volumes:
{appName}-symfony:
{appName}-mysql:
services:
webserver:
depends_on:
- php-fpm
image: nginx:alpine
restart: always
working_dir: /var/www/application
environment:
VIRTUAL_HOST: foo.bar
LETSENCRYPT_HOST: foo.bar
LETSENCRYPT_EMAIL: some value
volumes:
- {appName}-symfony:/var/www/application
- ./nginx.conf:/etc/nginx/conf.d/default.conf
mysql:
image: percona:5.7
restart: always
volumes:
- {appName}-mysql:/var/lib/mysql
environment:
some: env
php-fpm:
depends_on:
- mysql
image: app/image:1.0.0
restart: always
working_dir: /var/www/application
volumes:
- {appName}-symfony:/var/www/application
- ./php-ini-overrides.ini:/etc/php/7.2/fpm/conf.d/99-overrides.ini
environment:
some: env
networks:
swarm_network:
driver: overlay
external: true
Приложения не часто посещаются, поэтому достаточно решения с одним узлом.В качестве инструмента ochestration должно быть достаточно чего-то вроде стека Docker или даже docker-compose.
Это также означает, что все контейнеры должны находиться в одной сети, верно?
Это решениеполезно или я упускаю важные моменты?