Очень распространено в настоящее время развитие проектов из нескольких услуг. Наиболее распространенным примером состоит в том, чтобы иметь как минимум бэкэнд и интерфейс в качестве отдельных приложений. И в более сложных проектах у нас может быть еще много услуг, все работает параллельно.
Разработчик часто должен выполнять эти услуги одновременно на их местной машине.
Старый способ сделать это — просто начать каждый сервис вручную в отдельном терминале. Но это может быстро стать громоздким, так как вы могли испытать.
Некоторые популярные инструменты, такие как одновременно
или NPM-Run-all
Сделайте это проще, по стоимости добавления зависимостей. В сочетании с Пряжа рабочие пространства
или Лерна
они позволяют довольно гладкому опыту разработчика.
Благодаря этим инструментам разработчик может ввести уникальную команду, например пряжа dev
И иметь весь свой стек со всеми сервисами, запущенными автоматически. И один Ctrl + C
В терминале позволяет прекратить все услуги в одном шаге. Действительно хорошее право?
Однако есть некоторые минусы с этим подходом:
- Более сложные сценарии NPM в
Package.json.
- Новые зависимости добавлены в проект, который необходимо поддерживать
- Своего рода смешанные проблемы, где код проекта в настоящее время не только используется для создания услуг, но и для Orchestrate их
- Если вы используете
пряжи - рабочие пространства
: Каждая сервис теперь должен использовать пряжу. Вы получаете какую-то блокировку поставщика, которые соединяют ваши услуги вместе. А что, если мы хотим разные языки за услугу?
Лучший подход с Docker и Docker-Compose
После использования пряжи - рабочие пространства
В сочетании с NPM-Run-all
На некоторое время для всех моих проектов я недавно переключил, чтобы просто использовать Докер
с Docker-Compose
Отказ
Как я обнаружил, Docker-Compose
может достичь все вышеперечисленного, и больше:
✔️. Запуск всех услуг одновременно ✔️ Нет дополнительных зависимостей NPM с их дополнительной сложностью: нет одновременно
нет NPM-Run-all
нет пряжи рабочие пространства
И такие ✔️ 100% разделенные и независимые услуги, просто стандартные приложения ✔️ Умение использовать другой язык для каждой службы, разные версии узла или менеджеров пакетов ✔️. Проще умственной модели
На вершине этого, используя не только Docker-Compose
Но и отдельный Dockerfile
Для каждой службы, затем используя Docker-Compose
Для оркестрации в развитии мы получаем огромные преимущества:
- Возможность использования точно такой же стек во всех средах: разработка, постановка, производство, (…) и через весь трубопровод CD/CI.
- Чрезвычайно простая репликация среды развития на любой машине. Новый разработчик нужен только
Докер
иDocker-Compose
начать работать. Нет больше времени, потерянного в построении среды Dev! - Неважно, если ваши услуги нуждаются в разных версиях узла, или Ruby, Python, Clojure, базы данных, COBOL, … Все может быть развернуто на нетронутой машине только с 2 командами : Первоначальный
Составная сборка
Тогда только ежедневноDocker-Compose up
Отказ
Пример
Допустим, у нас есть стек из интерфейса и бэкэнда, как в JavaScript.
Вот наша структура проекта:
my-app - Readme.md - backend - Dockerfile - package.json - ... - frontend - Dockerfile - package.json - ... - dev - docker-compose.yml
Примечания:
- Каждая служба может быть на другом языке, версии узла, диспетчере пакетов, …
Docker-Compose.yml
может быть идеально в корневой папке проекта. Я просто хотел бы создать новыйdev
Папка для группировки всех инструментов связанных с DEV. Это также помогает уточнить всем разработчикам (даже сам), что этоDocker-Compose.yml
Файл только для использования в разработке.
Backend/dockerfile.
Наше Backend/Dockerfile
Например, написано с производственной средой, например, инструкциями Run Yarn - lockfile --frozen-lockfile
и CMD [«пряжа», «начало»]
для производства, но Docker-Compose
Позже позволит нам переопределить некоторые части локально, чтобы удовлетворить наши потребности в разработке.
# backend/Dockerfile ================= # (production-friendly) FROM node:14-alpine WORKDIR /usr/src/app # Copy these files from your host into the image COPY yarn.lock . COPY package.json . # Run the command inside the image filesystem RUN yarn --prod --frozen-lockfile # Copy the rest of your app's source code from your host to the image filesystem: COPY . . # Which port is the container listening on at runtime? # This should be the same port your server is listening to: EXPOSE 8080 # Start the server within the container: CMD [ "yarn", "start" ]
Frontend/Dockerfile
Почти идентична нашей Backend Dockerfile
, также написано для производства в виду. Docker-Compose
позволит нам переопределить некоторые инструкции на местном уровне, только для развития.
# frontend/Dockerfile ================= # (production-friendly) FROM node:14-alpine WORKDIR /usr/src/app COPY yarn.lock . COPY package.json . RUN yarn --prod --frozen-lockfile COPY . . EXPOSE 3000 CMD [ "yarn", "start" ]
dev/docker-compose.yml
version: "3" services: backend: build: "../backend" ports: - 8080:8080 command: sh -c "yarn && yarn dev" volumes: - ../backend:/usr/src/app frontend: build: "../frontend" ports: - 3000:3000 command: sh -c "yarn && yarn dev" volumes: - ../frontend:/usr/src/app
Здесь, при использовании 2 ранее определенного Dockerfile
Нам разрешено переопределить определенные команды и параметры.
В этом случае Порты
и команда
Переопределить значения Выставлять
и CMD
Отказ
Объемы
Позвольте нам отобразить папки Frontend и Backend на нашей машине к тему внутри контейнеров. Это означает, что теперь вы можете нормально редактировать файлы проекта в вашей IDE, все изменения отражены мгновенно внутри контейнеров.
Загрузка всего проекта
Для первого запуска, в терминале, просто введите:
$ cd dev $ docker-compose build
Это загрузит изображения, определенные в Dockerfile
S ( Узел: 14-Alpine
) и приготовьте всю окружающую среду как для интерфейса и бэкэнда.
Обратите внимание, что вам нужно запустить эту команду только один раз изначально, или после модификации A Dockerfile
Отказ
Чтобы запустить весь стек и запустить кодирование:
$ cd dev $ docker-compose up
Теперь вы должны быть в состоянии посетить ваш интерфейс на http://localhost: 3000 и твоя бэкэнда на http://localhost: 8080 Отказ
Ежедневное использование
Отныне все сценарии NPM и команды должны быть выполнены из строя в контейнерах, а не на хост-машине.
Например, если мы хотим добавить пакет классы
на интерфейс:
# in a new terminal: $ cd dev $ docker-compose exec frontend yarn add classnames
Фу! Это громоздко, и много печатать, если честно, не так ли? Не волнуйтесь, посмотрим, как сделать его лучше в следующем разделе:
И теперь мы можем иметь хорошие вещи!
1) Меньше нажатий клавиш благодаря псевдонимам Bash
Кто любит длинные громоздкие печатать? Никто.
Вот одно простое решение: давайте добавим псевдоним .sh
Файл под дев
:
my-app - dev - aliases.sh
Со следующим контентом:
# my-app/dev/aliases.sh alias be="docker-compose exec backend" alias fe="docker-compose exec frontend"
И давайте исходным в текущем терминале:
$ . dev/aliases.sh
Впредь:
# we can type this: $ fe yarn add classnames $ be yarn add -D nodemon # instead of: # $ docker-compose exec frontend yarn add classnames # $ docker-compose exec backend yarn add -D nodemon
Чтобы избежать источника вручную в каждом терминале, мы также можем сделать это один раз и для всех .bashrc.
:
# in /home//.bashrc # at the very end, just add this line: . / /dev/aliases.sh
Я бы порекомендовал сделать это только при непрерывной работе на проекте и удаление этой новой линии после того, как она больше не нужна.
2) более надежные развертывания в постановку, производство, …
Благодаря Dockerfile
S (написано для производства, помните?), мы можем запустить наши услуги в рамках той же ОС и контекста по всей нашей средам: разработка, тестирование, постановка, производство, …
Например, если вы используете Google Cloud Run Теперь вы можете предоставить ему Dockerfile
Для каждого сервиса и быть уверенным, что если ваш код работает нормально, он также должен работать идеально после развертывания.
3) Преимущества, которые приходят с Docker-Compose
Например, сейчас очень легко добавить дополнительный контейнер в зависимости от потребностей ваших проектов.
Допустим, нам нужен Postgres
База данных в версии 11.1 для разработки. Мы можем просто добавить его в Docker-Compose.yml
:
version: "3" services: backend: build: "../backend" ports: - 8080:8080 command: sh -c "yarn && yarn dev" volumes: - ../backend:/usr/src/app frontend: build: "../frontend" ports: - 3000:3000 command: sh -c "yarn && yarn dev" volumes: - ../frontend:/usr/src/app db: image: postgres:11.1 command: "-c logging_collector=on" restart: always ports: - 5432:5432 environment: POSTGRES_PASSWORD: changeme POSTGRES_USER: changeme POSTGRES_DB: changeme # Let's also provide an admin UI for the postgres # database, often useful during development: adminer: image: adminer restart: always ports: - 5000:8080
Заключение
Мы видели, как мы можем разработать несколько одновременных эксплуатационных услуг, каждый на любой язык, с любым видом базы данных, на любой машине, не устанавливая ни одно из них на сам хост-машина.
Нам просто нужно установить Докер
и Docker-Compose
(и IDE), и это так!
С помощью этого подхода каждый сервис — просто идеально содержащее обычное приложение.
Кроме того, теперь мы можем запустить каждую услугу в точно такой же системе (ОС) во всех средах и всех машинах разработчиков.
Посадочные новые разработчики и создание их среды развития могут традиционно занимать дни. С таким подходом это вопрос минут.
Это также делает его ближе к мгновенному для переключения между различными проектами, написанными на разных языках или языках.
Оригинал: «https://dev.to/danielres/simplify-development-deployments-with-docker-docker-compose-9ji»