Docker требуется для недавней работы и разработки. В этой статье демонстрируется несколько демонстраций с нуля.Если вы раньше не сталкивались с Docker, вы можете шаг за шагом выполнить шаги, чтобы углубить свое понимание Docker.
Больше фото, попробуйте посмотреть 💻
Эта статья написана фронтенд-разработчиками DJI.HelKyleОригинал и общий доступ к Nuggets, пожалуйста, укажите, нужно ли вам перепечататьпроисхождение
Какие проблемы может решить Docker
Независимо от того, насколько велика или мала ваша компания, существуют более или менее несоответствия между средой разработки и производственной средой. Некоторые разработчики используют Windows, некоторые разработчики используют Mac, а производственная среда может использовать Linux, запуская несколько приложений одновременно, каждое приложение зависит от разных версий узла, и разные службы могут по-прежнему занимать один и тот же порт. Поэтому мы часто слышим такие вопросы: «Локал явно хорош, почему нельзя онлайн?»
(Мой личный опыт: я давно разработал интерфейсный проект, и мне нужно было локально собрать среду LEMP. Я следил за учебным пособием в течение нескольких дней, не написав ни одной строки кода внешнего интерфейса. Позже, из-за какие-то "необъяснимые" проблемы, несколько раз повторял Reinstalled.)
После использования Docker мы можем быстро собрать среду через одну команду в конфигурационном файле, а также можем изолироваться от других сервисов, не затрагивая друг друга, объясним это на примерах.
демонстрационная среда
Среда, в которой выполняется эта статья, — macOS 10.14.1, версия Docker 18.09.0.
Концепция: образ против контейнера
Образ формируется путем наложения ряда исторических операций, и каждая операция с изображением создает новый слой, доступный только для чтения. Например, если вы записываете содержимое в контейнер, отправляете его, а затем удаляете, две исторические записи будут быть сгенерирован слой чтения, что-то вродеgit commits, а контейнер можно понимать как работающую систему слой истории изображений + записываемый слой. В доступном для записи слое нет проблем с выполнением любых операций. Если вы не отправите его, соответствующие изменения будут потеряны после того, как контейнер будет удалил, вродепромежуточная область git.
(Личное понимание, не обязательно верное)
Установить Докер
Установить докер на мак
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:latest у меня нет, я сначала зайду на рынок зеркал, чтобы загрузить его. начать полностью открытоhttp://localhost:80Вы можете сразу увидеть страницу приветствия nginx.
Если вы хотите изменить страницу приветствия, вы можете перейти на страницу модификации в контейнере.
docker exec -it 4591552a4185 bash
Описание параметра:
exec
Сделайте что-нибудь с контейнером
-it
Заставьте контейнер принимать стандартный ввод и выделите псевдотерминал.
4591552a4185
уникальный тег только что запущенного контейнера nginx
bash
Укажите интерактивную программу как bash
путь к файлу по умолчанию 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.
Каждый раз, когда вы изменяете содержимое, вам нужно вручную вводить контейнер, что слишком громоздко, и 👆 упомянул, что прямые изменения контейнера не будут сохранены, а если контейнер будет удален, данные также будут потеряны.
(Поскольку предыдущая демонстрация занимала порт 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.
открыть сноваhttp://localhost:80
, вы также можете увидеть привет, докер.
Далее давайте воспользуемся 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, вы можете увидеть результат.
Рекомендуемое использованиеmedisВизуально просматривать данные Redis.
Хорошо, среда разработки завершает разработку функций, а доставка и обслуживание переходят в режим онлайн. Мы предполагаем, что среда сборки запустит четыре службы узлов, одну службу 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
Запрос достигнет первого веб-контейнера.
Все готово, сочиняем!
Хорошо, теперь посетитеhttp://localhost:80
На данный момент мы завершили развертывание приложения, и количество обращений к pv каждый раз автоматически увеличивается на единицу, а после балансировки нагрузки nginx оно будет рандомно попадать в разные контейнеры. 🎉🎉🎉
Суммировать
В этой статье демонстрируются некоторые операции с докером, связанные с внешним интерфейсом, из которых видно, что он очень удобен для разработки, тестирования и развертывания программного обеспечения. Содержание в этой статье — только верхушка айсберга, более полное исследование можно увидетьДокер — от начала до практикиЭта книга.
Примеры можно использовать только для обучения, пожалуйста, не используйте их непосредственно в производственной среде. В то же время часть контента является личным пониманием, а не авторитетным.Чтобы изучить Docker глубже, вам следует прочитать подробную документацию.
Эта статья написана фронтенд-разработчиками DJI.HelKyleОригинал и общий доступ к Nuggets, пожалуйста, укажите, нужно ли вам перепечататьпроисхождение