docker-compose: делиться подключением БД к нескольким веб-сайтам - PullRequest
1 голос
/ 25 октября 2019

У меня есть установщик Docker, обслуживающий два блога WordPress с прокси и использующий следующую структуру и файл docker-compose:

.
├── nginx-proxy
│   └── docker-compose.yml
└── blogs
    └── docker-compose.yml

docker-compose.yml

version: "3"

services:
  db:
    container_name: ${CONTAINER_DB_NAME}
    image: mariadb:latest
    restart: unless-stopped
    volumes:
      - ${DB_PATH}:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

  wordpress1:
    depends_on:
      - db
    container_name: ${CONTAINER_WP_NAME1}
    image: wordpress:latest
    restart: unless-stopped
    volumes:
      - ${WP_CORE}:/var/www/html
      - ${WP_CONTENT}:/var/www/html/wp-content
      - ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
    environment:
      WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME1}:3306
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE1}
      WORDPRESS_DB_USER: ${MYSQL_USER1}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD1}
      WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX1}
      VIRTUAL_HOST: ${DOMAINS1}
      LETSENCRYPT_HOST: ${DOMAINS1}
      LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL1}
    logging:
      options:
        max-size: ${LOGGING_OPTIONS_MAX_SIZE1:-200k}

  wordpress2:
    depends_on:
      - db
    container_name: ${CONTAINER_WP_NAME2}
    image: wordpress:latest
    restart: unless-stopped
    volumes:
      - ${WP_CORE}:/var/www/html
      - ${WP_CONTENT}:/var/www/html/wp-content
      - ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
    environment:
      WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME2}:3306
      WORDPRESS_DB_NAME: ${MYSQL_DATABASE2}
      WORDPRESS_DB_USER: ${MYSQL_USER2}
      WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD2}
      WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX2}
      VIRTUAL_HOST: ${DOMAINS2}
      LETSENCRYPT_HOST: ${DOMAINS2}
      LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL2}
    logging:
      options:
        max-size: ${LOGGING_OPTIONS_MAX_SIZE2:-200k}

networks:
  default:
    external:
      name: ${NETWORK}

Но я бы хотел сделать его более ремонтопригодным. Я хочу реорганизовать это, чтобы создать отдельный контейнер для базы данных mysql, изменить рефакторинг каждой конфигурации блога в свой собственный файл docker-compose и ссылаться на базу данных в каждой конфигурации блога, например:

.
├── db
│   └── docker-compose.yml
├── blog1
│   └── docker-compose.yml
├── blog2
│   └── docker-compose.yml
└── blog3
    └── docker-compose.yml

dbконтейнер

version: "3"

services:
  db:
    container_name: ${CONTAINER_DB_NAME}
    image: mariadb:latest
    restart: unless-stopped
    volumes:
      - ${DB_PATH}:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
  default:
    external:
      name: ${NETWORK}

блог1 контейнер

version: "3"

services:
  wordpress1:
    depends_on:
      - db // Does Docker knows this is db service I created outside it?
    container_name: ${CONTAINER_WP_NAME1}
    image: wordpress:latest
    restart: unless-stopped
    volumes:
        - ${WP_CORE}:/var/www/html
        - ${WP_CONTENT}:/var/www/html/wp-content
        - ./conf.d/php.ini:/usr/local/etc/php/conf.d/php.ini
    environment:
        WORDPRESS_DB_HOST: ${CONTAINER_DB_NAME1}:3306
        WORDPRESS_DB_NAME: ${MYSQL_DATABASE1}
        WORDPRESS_DB_USER: ${MYSQL_USER1}
        WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD1}
        WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX1}
        VIRTUAL_HOST: ${DOMAINS1}
        LETSENCRYPT_HOST: ${DOMAINS1}
        LETSENCRYPT_EMAIL: ${LETSENCRYPT_EMAIL1}
    logging:
        options:
        max-size: ${LOGGING_OPTIONS_MAX_SIZE1:-200k}
networks:
  default:
    external:
      name: ${NETWORK}

... и т. д.

Я понятия не имею, как обрабатывать соединение БД. Сегодня я разместил ссылку на него в разделе «depen_on», поскольку конфигурация службы db находится в том же файле, что и блог. Но как мне вызвать экземпляр db, когда сайты объявлены в отдельных файлах? Знает ли Докер, что "db" - это служба db, объявленная извне этому файлу?

Любые идеи были бы великолепны!

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вы можете указать несколько файлов составления при запуске команды составления docker, например, вы можете создать один блог с:

docker-compose -f db.yml -f blog1.yml up

или всеми ними:

docker-compose -f db.yml -f blog1.yml -f blogX.yml up

Подробнее о о том, как указать несколько файлов составления

Обратите внимание, что вы также можете использовать переменную окружения для указания ваших файлов:

COMPOSE_FILE=db.yml:blog1.yml docker-compose up

Подробнее здесь

0 голосов
/ 25 октября 2019

Самый простой способ настроить это - использовать отдельную базу данных для каждого приложения. Так что разбейте это на blog1/docker-compose.yml и так далее, как вы описываете, но каждый из этих файлов Compose должен быть автономным с собственными службами db: и wordpress:. Затем вы можете запустить столько копий, сколько захотите, при условии, что (а) вы установили разные опубликованные значения ports: для каждой копии и (б) запустили каждую копию из каталога с другим именем.

Вы также должны позволить Compose задавать имена контейнеров для вас;это уменьшит вероятность столкновений. Удалите поля container_name:. Контейнеры могут по-прежнему связываться друг с другом, используя в качестве имен хостов свое имя services:;например, установите WORDPRESS_DB_HOST: db:3306. Есть docker-compose ... эквивалентов для большинства стандартных простых команд docker, но если вам нужно напрямую взаимодействовать с контейнером, они обычно называются такими вещами, как blog1_db_1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...