Как запустить несколько экземпляров Docker одновременно на локальном хосте, используя docker compose? Простые LAMP микросайты - PullRequest
1 голос
/ 12 апреля 2020

Я оцениваю Docker как отход от Бродяги. Наша ситуация такова, что мы управляем примерно 20 микросайтами LAMP (WordPress) и нуждаемся в возможности одновременного запуска нескольких сайтов на наших локальных компьютерах.

Я смотрел на Docker Создать, но не могу понять, как разрешить запускать каждый из наших сайтов одновременно без конфликтующих портов. Каждый сайт представляет собой простое приложение Apache / MySQL / PHP. Существует ли конфигурация, методика или стратегия, позволяющая одновременно запускать несколько сайтов X на одном локальном хосте? Или, поскольку стек одинаков для каждого сайта, стоит ли мне использовать одну конфигурацию для управления ими всеми?

Мы будем использовать это только для локальной разработки, пока не готовы к развертыванию контейнеров в dev / prod или чем-то в этом роде - просто устаём от ресурсов и места в vagrant.

Ниже, где вещи сейчас. Я предположил бы, что каждый docker-compose.yml был бы почти идентичен для каждого из наших сайтов. Как запустить многие из них одновременно?

version: '3'

services:
  wp:
    image: wordpress:latest # https://hub.docker.com/_/wordpress/
    ports:
      - 127.0.0.1:80:80 # change ip if required
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html # Full wordpress project
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "${DB_NAME}"
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: "${DB_ROOT_PASSWORD}"
    depends_on:
      - db
    links:
      - db

  wpcli:
    image: wordpress:cli
    volumes:
      - ./config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - ./wp-app:/var/www/html
    depends_on:
      - db
      - wp

  pma:
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
    ports:
      - 127.0.0.1:8080:80
    links:
      - db:db

  db:
    image: mysql:latest # https://hub.docker.com/_/mysql/ - or mariadb https://hub.docker.com/_/mariadb
    ports:
      - 127.0.0.1:3306:3306 # change ip if required
    command: [
        '--default_authentication_plugin=mysql_native_password',
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci'
    ]
    volumes:
      - ./wp-data:/docker-entrypoint-initdb.d
      - db_data:/var/lib/mysql
    environment:
      MYSQL_DATABASE: "${DB_NAME}"
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"

volumes:
  db_data:

1 Ответ

2 голосов
/ 12 апреля 2020

Docker позволяет вам иметь другой локальный порт на хосте от порта внутри контейнера. (По аналогии с отображением бродячих портов). Таким образом, вы можете назначить каждому экземпляру свой порт.

Так, например, вы можете использовать порт 81 на локальном хосте для сопоставления с портом 80 внутри контейнера

    ports:
      - 127.0.0.1:81:80

Это самое простое решение.

Другое решение состоит в том, чтобы использовать обратный прокси-сервер (например, nginx, traefik) и предоставлять его только хосту, направляя запросы в правильный экземпляр docker контейнера.

...