Рубрики
Uncategorized

Упростите разработку и развертывание с Docker + Docker-Compose

Очень распространено в настоящее время развитие проектов из нескольких услуг. Наиболее распространенным примером является … Теги с промежуточным, докером, дежопами, развитием.

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

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

Старый способ сделать это — просто начать каждый сервис вручную в отдельном терминале. Но это может быстро стать громоздким, так как вы могли испытать.

Некоторые популярные инструменты, такие как одновременно или 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»