9102 года, изучите Docker

Node.js Docker
9102 года, изучите Docker

Docker требуется для недавней работы и разработки. В этой статье демонстрируется несколько демонстраций с нуля.Если вы раньше не сталкивались с Docker, вы можете шаг за шагом выполнить шаги, чтобы углубить свое понимание Docker.

Больше фото, попробуйте посмотреть 💻

Эта статья написана фронтенд-разработчиками DJI.HelKyleОригинал и общий доступ к Nuggets, пожалуйста, укажите, нужно ли вам перепечататьпроисхождение

Какие проблемы может решить Docker

Независимо от того, насколько велика или мала ваша компания, существуют более или менее несоответствия между средой разработки и производственной средой. Некоторые разработчики используют Windows, некоторые разработчики используют Mac, а производственная среда может использовать Linux, запуская несколько приложений одновременно, каждое приложение зависит от разных версий узла, и разные службы могут по-прежнему занимать один и тот же порт. Поэтому мы часто слышим такие вопросы: «Локал явно хорош, почему нельзя онлайн?»

(Мой личный опыт: я давно разработал интерфейсный проект, и мне нужно было локально собрать среду LEMP. Я следил за учебным пособием в течение нескольких дней, не написав ни одной строки кода внешнего интерфейса. Позже, из-за какие-то "необъяснимые" проблемы, несколько раз повторял Reinstalled.)

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

демонстрационная среда

Среда, в которой выполняется эта статья, — macOS 10.14.1, версия Docker 18.09.0.

Концепция: образ против контейнера

Образ формируется путем наложения ряда исторических операций, и каждая операция с изображением создает новый слой, доступный только для чтения. Например, если вы записываете содержимое в контейнер, отправляете его, а затем удаляете, две исторические записи будут быть сгенерирован слой чтения, что-то вродеgit commits, а контейнер можно понимать как работающую систему слой истории изображений + записываемый слой. В доступном для записи слое нет проблем с выполнением любых операций. Если вы не отправите его, соответствующие изменения будут потеряны после того, как контейнер будет удалил, вродепромежуточная область git.

(Личное понимание, не обязательно верное)

docker

Установить Докер

Установить докер на мак

brew cask install docker

Установите Docker в других средах Просмотрздесь.

После завершения установки запустите hello-world, чтобы попробовать.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

Эта команда подключится к локальной службе Docker. Служба Docker обнаруживает, что локального образа hello-world нет, поэтому перейдите на рынок образов Docker, чтобы загрузить образ, затем создайте новый контейнер, выполните определенную команду и выведите Hello от Докера!

В этой статье не объясняются основные команды докера, а начинается непосредственно с дела.

Запустите службу nginx

docker run -d -p 80:80 --restart=always  nginx:latest

Описание параметра:runзапустить изображение-dПусть контейнер работает в фоновом режиме-pУкажите сопоставление портов, порт 80 хоста сопоставляется с портом 80 контейнера.--restartРежим перезапуска, устанавливайте всегда, при каждом запуске докера будет запускаться контейнер nginx.

nginx

Поскольку локального зеркала nginx:latest у меня нет, я сначала зайду на рынок зеркал, чтобы загрузить его. начать полностью открытоhttp://localhost:80Вы можете сразу увидеть страницу приветствия nginx.

hello nginx

Если вы хотите изменить страницу приветствия, вы можете перейти на страницу модификации в контейнере.

docker exec -it 4591552a4185 bash

Описание параметра:
execСделайте что-нибудь с контейнером
-itЗаставьте контейнер принимать стандартный ввод и выделите псевдотерминал.
4591552a4185уникальный тег только что запущенного контейнера nginx
bashУкажите интерактивную программу как bash

exec

путь к файлу по умолчанию nginx/usr/share/nginx/html/index.html, вы можете использовать echo для непосредственной записи содержимого.

echo '<h1>Hello Docker<h1/>' > /usr/share/nginx/html/index.html

ctrl + D, чтобы выйти из контейнера, повторно посетите localhost:80, чтобы увидеть Hello Docker.

hello docker

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

(Поскольку предыдущая демонстрация занимала порт 80, давайте сначала убьем ее.)

docker kill 4591552a4185

Docker предоставляет функцию монтирования данных, то есть вы можете указать определенные пути в контейнере для сопоставления с хост-машиной, изменить команды, добавить-vпараметр для запуска нового контейнера.

docker run -d -p 80:80  -v ~/docker-demo/nginx-htmls:/usr/share/nginx/html/ --restart=always  nginx:latest

После успешного запуска docker поможет вам создать каталог~/docker-demo/nginx-htmls, теперь в нем ничего нет, добавляем index.html.

html

открыть сноваhttp://localhost:80, вы также можете увидеть привет, докер.

hello docker

Далее давайте воспользуемся Node + Redis + Docker для демонстрации отображения PV.

Запустите команду:

docker run -d -p 6379:6379 -v ~/docker-demo/redis:/data redis:latest

Запустите контейнер Redis и сохраните данные в~/docker-demo/redisсодержание. (Учитывая производительность, Redis не записывает данные на диск в режиме реального времени)

Запустите узел-сервер с помощью koa, подключитесь к Redis и добавляйте единицу к счетчику каждый раз, когда осуществляется доступ к /.

const Redis = require('ioredis');
const Koa = require('koa');
const Router = require('koa-router');

const router = new Router();
const app = new Koa();

const redis = new Redis(`redis://127.0.0.1:6379/0`);

router.get('/', async (ctx, next) => {
  await next();
  await redis.incr('pv');
  const current = await redis.get('pv');
  ctx.body = `current pv: ${current}`;
});
 
app
  .use(router.routes())
  .use(router.allowedMethods());

app.listen(3000);

доступhttp://localhost:3000, вы можете увидеть результат.

pv

Рекомендуемое использованиеmedisВизуально просматривать данные Redis.

medis

Хорошо, среда разработки завершает разработку функций, а доставка и обслуживание переходят в режим онлайн. Мы предполагаем, что среда сборки запустит четыре службы узлов, одну службу Redis и одну службу nginx для выполнения нагрузки.

На данный момент нам нужно встроить службу нашего узла в образ и добавить файл dockerfile.

# 基于最新的 node 镜像
FROM node:latest
# 复制当前目录下所有文件到目标镜像 /app/ 目录下
COPY . /app/
# 修改工作目录
WORKDIR /app/
# yarn 一下,安装依赖
RUN ["yarn"]
# 启动 node server
ENTRYPOINT ["node", "index.js"]

См. дополнительные инструкции по файлу dockerfileздесь

Вы можете собрать его локально и запустить командуdocker build . --tag=pv, то черезdocker imagesВы можете увидеть новое изображение, которое вы только что построили.

Продолжайте спускаться вниз и упорядочивайте группы контейнеров.Docker официально предоставляет инструмент docker-compose. Добавить в каталог проектаdocker-compose.ymlдокумент.

# 使用 docker-compose 2.2 版本
version: "2.2"
# 定义 services
services:
  redis:
    image: redis:latest
    volumes:
      - "~/docker-demo/pv/data/:/data/"

  web:
    # 放大4倍,也就会有四个 node server
    scale: 4
    build: .
    # 新增环境变量
    environment:
      - REDIS_HOST=redis://redis:6379/0
    # 依赖关系
    depends_on:
      - redis

  nginx:
    image: nginx:latest
    depends_on:
      - web
      - redis
    ports:
      - 80:80
    volumes:
      - "./default.conf:/etc/nginx/conf.d/default.conf"

Дополнительные инструкции по созданию докеров см.здесь

Недавно добавленная переменная среды REDIS_HOST=redis://redis:6379/0 в веб-службе предназначена для ссылки ioredis, и соответствующий файл js необходимо изменить.

const redis = new Redis(process.env.REDIS_HOST);

redis://redis:6379/0Первый Redis — это протокол, а второй Redis — хост службы. Службы могут взаимодействовать друг с другом через хост.

Скопируйте файл default.conf в контейнер nginx и измените его.

upstream web {
  server pv_web_1:3000;
  server pv_web_2:3000;
  server pv_web_3:3000;
  server pv_web_4:3000;
}

server {
    #...

    location / {
      proxy_pass http://web;
    }

    #...
}

Добавьте вышестоящую службу web, где pv — это имя файла моего проекта, web — это имя службы, определенное в файле компоновки докеров, а 1–4 — это серийный номер, автоматически присвоенный докером при выходе масштаба. После запуска nginx обращаетсяhttp://pv_web_1:3000Запрос достигнет первого веб-контейнера.

Все готово, сочиняем!

compose-up

Хорошо, теперь посетитеhttp://localhost:80

result

На данный момент мы завершили развертывание приложения, и количество обращений к pv каждый раз автоматически увеличивается на единицу, а после балансировки нагрузки nginx оно будет рандомно попадать в разные контейнеры. 🎉🎉🎉

Суммировать

В этой статье демонстрируются некоторые операции с докером, связанные с внешним интерфейсом, из которых видно, что он очень удобен для разработки, тестирования и развертывания программного обеспечения. Содержание в этой статье — только верхушка айсберга, более полное исследование можно увидетьДокер — от начала до практикиЭта книга.

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

Эта статья написана фронтенд-разработчиками DJI.HelKyleОригинал и общий доступ к Nuggets, пожалуйста, укажите, нужно ли вам перепечататьпроисхождение

Статьи по Теме