Как в docker работать с несколькими проектами?

Добрый день.
Решил перейти с vagrant на docker. Много мануалов читал, суть везде одна - пишем конфиг, далее docker-compose build и up и переходите на localhost:8080 - там все работает. Попробовал - действительно работает. Но тут встают вопросы. Я до этого работал с openserver, затем перешел на vagrant. У меня около 20 проектов в одной среде (т.к. они все на php7.3, mysql 5.7, nginx) В общем различий нет, поэтому они все прекрасно работали на одной виртуалке vagrant. Очень мне нравился процесс прописывания урл => path. В итоге все 20 проектов можно было одновременно открыть - все они работали.

Но вот я на докере и у меня те же вопросы:
1) Как сделать так, чтобы все проекты одновременно работали?
2) Как проектам дать не localhost:8080, а нормальный урл типа project.dev?

Что-то по докеру одна и та же инфа везде, одни рассказы про преимущество контейнеров, одни "запустим localhost:8080", а шаг влево-вправо - уже инфы то и не найти...во всяком случае мне не удалось.
Заранее спасибо за ответы.
  • Вопрос задан
  • 1760 просмотров
Решения вопроса 2
все на php7.3, mysql 5.7, nginx

Раз у всех проектов одна среда, достаточно запустить по одному инстансу php-fpm, mysql, nginx и пользоваться ими из всех разрабатываемых проектов.

«Проект», получается, это папка с файлами, отдельная бд или таблицы на общем сервере MySQL, и прописанный в конфигах nginx
location /project-42 { root /projects/project-42; ... }

### или целый блок

server {
  listen 80;
  server_name  project42.dev;
  ... 
}


Пожалуй, лучше работать через docker-compose: весь конфиг в одном файле, общая сеть, сервисы друг друга видят.

Поднимите сначала один из проектов. Потом разберитесь, как добавить файлы остальных через volumes:
nginx:
  volumes:
    - "/freelance/projects/Project-0/:/var/www/project0"
    - "/freelance/projects/Project-42/:/var/www/project42"
    # ...
php-fpm:
  volumes:
    # то же самое сюда


2) Как проектам дать не localhost:8080, а нормальный урл типа project.dev?

В конфиге сервиса nginx в docker-compose.yml пропишите вместо 8080:8080:80, а в локальном файле hosts допишите 127.0.0.1 project.dev project42.dev
Ответ написан
YekitKsv
@YekitKsv
DevOps
Законфигурировать 20 проектов под докер сложно. Доменные имена прописывать каждому проекту нужно через dns или hosts, но тогда нужно извращаться с портами или подсетями в docker-compose. Плюс к этому, чтобы подружить несколько проектов в одном контейнере и переиспользовать тот-же mysql, нужно потратить не один вечер, изучая докер. А если на 20 проектов плодить по 3 контейнера nginx php mysql, то никаких ресурсов не хватит.
В общем по собственному опыту могу сказать: юзайте докер, только не держите в 1 пхп контейнере 20 проектов(не надо из докера делать вагрант), работайте по схеме: работаю с проектом X, запустил композ проекта X, работаю с проектом Y, выключил проект X и запустил Y. Но опять же это неудобно. Оставайтесь в dev режиме на vagrant+ansible, в stage и prod на docker+ansible. Ansible поможет держать пакеты под версиями, так что различий между стендами не должно быть, изменится только способ запуска проекта.
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
@bankinobi
Приятнее работать будет с таким количеством проектов, если пропускать их всех через traefik. Дополнительные 3-4 строки нотификаций к описанию проекта в docker-compose файле и все видится через одну точку входа.
Ответ написан
@Sha644
1. Запустить одновременно множество контейнеров с разными проектами.
2. Прописать локально доменные имена.
Имхо: Информации нет из-за docker-compose. Запрещать им пользоваться первые год знакомства с докером решило бы проблему.

Вашу задачу можно решить множеством подходов.
Например можете поднять контейнер nginx и использовать как реверс прокси. Оттуда уже перебрасывать на ваши контейнеры с проектами. Где-то на гитхабе валяется скриптик для автоматизации всего этого если вам лень править конфиги.
Ответ написан
@andrei_pro
1. Если проекты разные, то придется разрулить внешними портами 8081:80, 8082:80, если проект один из нескольких сервисов, можно сделать 1 прокси с 80 портом и редиректить на контейнеры с php-fpm
2. В /etc/hosts добавьте ваши домены на ip 127.0.0.1. Используйте local вместо dev
Ответ написан
@dmitriylanets
А зачем вам одновременно работать с несколькими проектами, подняли контейнеры через docker-compose сайта поработали, погасили, перешли на другой проект подняли сеть поработали , закрыли и тд
Ответ написан
Tonik
@Tonik
Ищете на гитхабе jwilder/nginx-proxy (почему то не позволяет запостить ссылку)
Ответ написан
Порт и хост по умолчанию можно задать через переменные в docker-compose.yml:

version: '3.4'

services:
  app:
    build:
      context: ..
      dockerfile: ./docker/Dockerfile
    restart: ${APP_RESTART_MODE:-always}
    volumes:
      - static:/usr/src/app/static
      - ${APP_PUBLIC_DIR:-./data}:/usr/src/app/public:rw
    environment:
      APP_SERVER_HOSTS: ${APP_SERVER_HOSTS:-www.project.com}
      APP_SERVER_PORT: ${APP_SERVER_PORT:-8080}
  nginx:
    build:
      context: .
      dockerfile: ./Dockerfile-nginx
    restart: ${APP_RESTART_MODE:-always}
    environment:
      NGINX_HOST: ${APP_SERVER_HOSTS:-www.project.com}
      NGINX_PORT: ${APP_SERVER_PORT:-8080}
    ports:
      - "${APP_SERVER_PORT:-8080}:${APP_SERVER_PORT:-8080}"
    volumes:
      - static:/usr/src/app/static
      - ${APP_PUBLIC_DIR:-./data}:/usr/src/app/public:ro
    command: /bin/ash -c "envsubst < /etc/nginx/conf.d/default.conf.tpl > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
    depends_on:
      - app
    links:
      - app


А изменить значения по умолчанию можно в файле .env (должен лежать в той же папке что и docker-compose.yml):
APP_RESTART_MODE=unless-stopped
APP_SERVER_HOSTS=project42.local www.project42.com
APP_SERVER_PORT=8181
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы