Сборка Docker: Руководство для начинающих по созданию образов Docker

Docker изменил способ создания, упаковки и развертывания приложений. Но эта концепция упаковки приложений в контейнеры не нова — она существовала задолго до Docker.

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

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

Возможно, создание образов Docker было для вас непростой задачей, но это произойдет не после того, как вы прочтете этот пост. Здесь вы узнаете, как создавать — и как не создавать – образы Docker. Вы сможете написать файл Dockerfile и публиковать изображения Docker, как профессионал.

Установить Docker

Во-первых, вам нужно будет установить Docker. Docker изначально работает в Linux. Это не значит, что вы не можете использовать Docker на Mac или Windows. На самом деле, есть Docker для Mac и Docker для Windows. В этом посте я не буду вдаваться в подробности о том, как установить Docker на ваш компьютер. Если вы работаете на компьютере с Linux, это руководство поможет вам запустить Docker.

Теперь, когда на вашем компьютере настроен Docker, вы на один шаг ближе к созданию образов с помощью Docker. Скорее всего, вы столкнетесь с двумя терминами — ”контейнеры” и “изображения”, — которые могут ввести в заблуждение.

Изображения и контейнеры Docker

Контейнеры Docker – это экземпляры образов Docker, независимо от того, запущены они или остановлены. На самом деле, основное различие между контейнерами Docker и изображениями заключается в том, что контейнеры имеют слой, доступный для записи.

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

Создание вашего первого образа Docker

Пришло время испачкать руки и посмотреть, как Docker build работает в реальном приложении. Мы создадим простой Node.js приложение с генератором экспресс-приложений. Экспресс-генератор – это инструмент CLI, используемый для экспресс-приложений scaffolding. После этого мы рассмотрим процесс использования Docker build для создания образа Docker из исходного кода.

Мы начинаем с установки экспресс-генератора следующим образом:

$ npm install express-generator -g
Далее мы создаем каркас нашего приложения, используя следующую команду:
$ express docker-app
Теперь мы устанавливаем зависимости пакетов:
$ npm install
Запустите приложение с помощью приведенной ниже команды:
$ npm start

Если вы укажете свой браузер на http://localhost:3000 , вы должны увидеть страницу приложения по умолчанию с текстом “Добро пожаловать в Express”.

Dockerfile

Имейте в виду, что приложение все еще работает на вашем компьютере, и у вас еще нет образа Docker. Конечно, нет никаких волшебных палочек, которыми вы могли бы взмахнуть над своим приложением и внезапно превратить его в контейнер Docker. Вы должны написать файл Dockerfile и создать из него образ.

Официальные документы Docker определяют Dockerfile как “текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки изображения”. Теперь, когда вы знаете, что такое Dockerfile, пришло время его написать.

В корневом каталоге вашего приложения создайте файл с именем “Dockerfile”.

$ touch Dockerfile

Dockerignore

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

В действительности исходный код обычно содержит другие файлы и каталоги, такие как .git, .idea, .vscode или travis.yml. Они необходимы для нашего рабочего процесса разработки, но не остановят работу нашего приложения. Лучше всего не использовать их в вашем изображении — для этого и нужен файл .dockerignore. Мы используем его, чтобы предотвратить попадание таких файлов и каталогов в нашу сборку.

Создайте файл с именем .dockerignore в корневой папке с этим содержимым:

.git
.gitignore
node_modules
npm-debug.log
Dockerfile*
docker-compose*
README.md
LICENSE
.vscode

Базовое изображение

Dockerfile обычно начинается с базового образа. Как определено в документации Docker, базовое изображение или родительское изображение – это то, на чем основано ваше изображение. Это ваша отправная точка. Это может быть ОС Ubuntu, Red hat, MySQL, Redis и т.д.

Базовые изображения не просто падают с неба. Они созданы — и вы тоже можете создать их с нуля. Существует также множество базовых изображений, которые вы можете использовать, поэтому в большинстве случаев вам не нужно их создавать.

Мы добавляем базовое изображение в Dockerfile с помощью команды FROM, за которой следует имя базового изображения:
Dockerfile обычно начинается с базового образа. Как определено в документации Docker, базовое изображение или родительское изображение – это то, на чем основано ваше изображение. Это ваша отправная точка. Это может быть ОС Ubuntu, Red hat, MySQL, Redis и т.д.

Базовые изображения не просто падают с неба. Они созданы — и вы тоже можете создать их с нуля. Существует также множество базовых изображений, которые вы можете использовать, поэтому в большинстве случаев вам не нужно их создавать.

Мы добавляем базовое изображение в Dockerfile с помощью команды FROM, за которой следует имя базового изображения:
Dockerfile обычно начинается с базового образа. Как определено в документации Docker, базовое изображение или родительское изображение – это то, на чем основано ваше изображение. Это ваша отправная точка. Это может быть ОС Ubuntu, Red hat, MySQL, Redis и т.д.

Базовые изображения не просто падают с неба. Они созданы — и вы тоже можете создать их с нуля. Существует также множество базовых изображений, которые вы можете использовать, поэтому в большинстве случаев вам не нужно их создавать.

Мы добавляем базовое изображение в Dockerfile с помощью команды FROM, за которой следует имя базового изображения:
# Filename: Dockerfile
FROM node:10-alpine

Копирование исходного кода

Давайте поручим Docker скопировать наш исходный код во время сборки Docker:

# Filename: Dockerfile
FROM node:10-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .

Сначала мы устанавливаем рабочий каталог с помощью WORKDIR. Затем мы копируем файлы с помощью команды КОПИРОВАТЬ. Первый аргумент – это путь к источнику, а второй – путь назначения в файловой системе образа. Мы копируем package.json и устанавливаем зависимости нашего проекта с помощью npm install. Это создаст каталог node_modules, который мы когда-то игнорировали в .dockerignore.

Возможно, вам интересно, почему мы скопировали package.json перед исходным кодом. Изображения Docker состоят из слоев. Они создаются на основе выходных данных, генерируемых каждой командой. Поскольку файл package.json не так часто меняется, как наш исходный код, мы не хотим продолжать перестраивать node_modules каждый раз, когда мы запускаем Docker build.

Копирование файлов, определяющих зависимости наших приложений, и их немедленная установка позволяют нам воспользоваться преимуществами кэша Docker. Главным преимуществом здесь является более быстрое время сборки. Есть действительно хороший пост в блоге, который подробно объясняет эту концепцию.

Хотите улучшить свой код? Попробуйте бесплатный профилировщик кода Stackify, Prefix, чтобы написать лучший код на вашей рабочей станции. Префикс работает с .NET, Java, PHP, Node.js , Ruby и Python.

Обнажая часть

Открытый порт 3000 сообщает Docker, какой порт прослушивает контейнер во время выполнения. Давайте изменим файл Docker и откроем порт 3000.

# Filename: Dockerfile
FROM node:10-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000

Docker CMD

Команда CMD сообщает Docker, как запустить приложение, которое мы упаковали в образ. CMD соответствует формату CMD [”command“, “argument1”, “argument2”].
# Filename: Dockerfile
FROM node:10-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [“npm”, “start”]

Создание изображений Docker

Записав Dockerfile, вы можете создать образ, используя следующую команду:

$ docker build .

Мы можем увидеть изображение, которое мы только что создали, используя команду docker images.

$ docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
7b341adb0bf1 2 minutes ago 83.2MB

Пометка изображения Docker

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

$ docker build -t yourusername/repository-name .

Давайте перейдем к пометке образа Docker, который мы только что создали.

$ docker build -t yourusername/example-node-app

Если вы выполните приведенную выше команду, ваше изображение уже должно быть помечено тегом. Повторный запуск docker images покажет ваше изображение с выбранным вами именем.

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
abiodunjames/example-node-app latest be083a8e3159 7 minutes ago 83.2MB

Запуск образа Docker

Вы запускаете образ Docker с помощью docker run API. Команда выглядит следующим образом:

$ docker run -p80:3000 yourusername/example-node-app

Команда довольно проста. Мы предоставили аргумент -p, чтобы указать, какой порт на хост-компьютере сопоставить с портом, который приложение прослушивает в контейнере. Теперь вы можете получить доступ к своему приложению из своего браузера на https://localhost .

Чтобы запустить контейнер в автономном режиме, вы можете указать аргумент -d:

$ docker run -d -p80:3000 yourusername/example-node-app

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

Отправка образа Docker в репозиторий Docker

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

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

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

$ docker login

Повторно пометьте изображение номером версии:

$ docker tag yourusername/example-node-app yourdockerhubusername/example-node-app:v1

Затем нажмите с помощью следующего:

$ docker push abiodunjames/example-node-app:v1

Если вы так же взволнованы, как и я, вы, вероятно, захотите сунуть свой нос в то, что происходит в этом контейнере, и даже сделать классные вещи с помощью Docker API.

Вы можете перечислить контейнеры Docker:

$ docker ps

И вы можете осмотреть контейнер:

$ docker inspect

Вы можете просматривать журналы Docker в контейнере Docker:

$ docker logs

И вы можете остановить запущенный контейнер:

$ docker stop

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

Вывод

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

Перейти к верхней панели