Docker несколько независимых версий одного и того же docker -компонентного приложения на одном VPS - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь построить такую ​​структуру:

application-1/
├── docker/
│     ├── apache2
│     ├── php
│     ├── docker-compose.yml
├── src/
└── other-framework-files/

application-2/
├── docker/
│     ├── apache2
│     ├── php
│     ├── docker-compose.yml
├── src/
└── other-framework-files/   

Где каждое приложение является полностью независимым экземпляром одного и того же кода. Я хочу добраться до точки, где у меня может появиться мое приложение дважды и где я могу развиваться на двух «блоках» независимо.

Эта структура прекрасно работает для одного экземпляра.

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

cd application-1/
docker-compose up -d

Это мой docker -compose.yml файл

version: '3.7'
services:
  webapp:
    build:
      context: ./php/
      dockerfile: Dockerfile
    container_name: webapp
    image: php:7.4.2-fpm-alpine
    volumes:
      - ../:/srv/app
  apache2:
    build:
      network: host
      context: ./apache2/
      dockerfile: Dockerfile
    container_name: apache2
    image: httpd:2.4.39-alpine
    ports:
      - 8080:80
    volumes:
      - ../:/srv/app
  mysql:
    container_name: mysql
    image: mysql:latest
    ports:
      - 13306:3306
    volumes:
      - mysql:/var/lib/mysql:cached
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: content
      MYSQL_USER: content
      MYSQL_PASSWORD: content
  redis:
    container_name: redis
    image: redis:5.0.6-alpine
    ports:
      - 16379:6379
    volumes:
      - redis:/data:cached

volumes:
  mysql:
    driver: local
  redis:
    driver: local

Это прекрасно работает для одного экземпляра приложения.

Когда я go до

http://123.123.123:8080 (my Digital Ocean droplet)

Я вижу свой веб-сайт, и все хорошо.

Однако, если я хочу скопировать это в приложение 2 и запустить его оттуда, я не могу заставить это работать. Для второго приложения я попытался изменить имя всех контейнеров, а также изменил порты следующим образом:

version: '3.7'
services:
  webapp2:
    build:
      context: ./php/
      dockerfile: Dockerfile
    container_name: webapp2
    image: php:7.4.2-fpm-alpine
    volumes:
      - ../:/srv/app
  apache2-2:
    build:
      network: host
      context: ./apache2/
      dockerfile: Dockerfile
    container_name: apache2-2
    image: httpd:2.4.39-alpine
    ports:
      - 8081:80
    volumes:
      - ../:/srv/app
  mysql2:
    container_name: mysql2
    image: mysql:latest
    ports:
      - 13309:3306
    volumes:
      - mysql:/var/lib/mysql:cached
    environment:
      MYSQL_ROOT_USER: root
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: content
      MYSQL_USER: content
      MYSQL_PASSWORD: content
  redis2:
    container_name: redis2
    image: redis:5.0.6-alpine
    ports:
      - 16380:6379
    volumes:
      - redis:/data:cached

volumes:
  mysql2:
    driver: local
  redis2:
    driver: local

Делая это, я надеялся, что смогу получить два полностью независимых мульти-контейнера composer Программы. Чтобы два разработчика могли работать отдельно над одним и тем же приложением.

Но когда я пытаюсь получить к нему доступ вот так

http://123.123.123:8081

Оно просто ничего не загружает. Говорит, что сайт недоступен. Это не ударил apache или что-нибудь. Это просто не работает.

Кто-нибудь сможет указать мне правильное направление здесь? Мне не нужно никаких причудливых решений. Это просто для разработки, просто для начала, и тогда я могу попробовать что-то настроить.

ОБНОВЛЕНИЕ:

Это мой конфиг apache2. Я изменил webapp на webapp2 для второго экземпляра.

LoadModule deflate_module /usr/local/apache2/modules/mod_deflate.so
LoadModule proxy_module /usr/local/apache2/modules/mod_proxy.so
LoadModule proxy_fcgi_module /usr/local/apache2/modules/mod_proxy_fcgi.so
LoadModule rewrite_module modules/mod_rewrite.so

<VirtualHost *:80>
    ServerName www.content.local
    ServerAlias content.local
    # Proxy .php requests to port 9000 of the php-fpm container
    ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://webapp:9000/srv/app/public/$1
    DocumentRoot /srv/app/public
    <Directory /srv/app/public>
        DirectoryIndex index.php
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # Send apache logs to stdout and stderr
    CustomLog /proc/self/fd/1 common
    ErrorLog /proc/self/fd/2
</VirtualHost>

1 Ответ

0 голосов
/ 06 апреля 2020

Самое главное, вам на самом деле не нужно ничего переименовывать, кроме внешних (хост-портов), и вы должны иметь возможность повторно использовать тот же docker -компонованный файл, используя пространство имен. Пространство имен достигается с помощью флага --project-name (или -p) в compose. И составить команду с этим будет сделано следующим образом:

docker-compose -p customprojectname1 up -d

Здесь ваше customprojectname1 по существу устанавливает пространство имен - измените его на что-то другое для вашего 2-го экземпляра et c. Опять же, вам все равно придется менять порты хоста, поскольку они будут конфликтовать, но больше ничего не должно.

Что касается вашего исходного решения с переименованием всего - скорее всего, ваша проблема связана с томами, которые вы забыли переименовать в v2 :

т.е. для mysql у вас есть точка монтирования, установленная на mysql ниже:

mysql2:
container_name: mysql2
image: mysql:latest
ports:
  - 13309:3306
volumes:
  - mysql:/var/lib/mysql:cached

Какой ваш старый mysql том - из старого стека (не переименован). То же самое с Redis. Так что это должны быть mysql2 и redis2. Опять же, вместо того, чтобы делать это, go с решением для пространств имен, о котором я упоминал выше.

И последнее, не забудьте проверить журналы контейнеров для каждого из порожденных контейнеров на случай, если у них будет больше подсказок.

...