Skip to Content

Docker

Docker — это инструмент (программа) для упаковки, распространения и запуска приложений в изолированных контейнерах. Это как “виртуальная машина”, только легче, быстрее и проще.

Зачем нужен Docker? И какие проблемы он решает

  • 💻 Одинаковый запуск у всех — проект будет работать одинаково у всех разработчиков, независимо от настроек их компьютеров
  • 📦 Упаковка приложения — Docker позволяет собрать приложение вместе со всеми нужными зависимостями (библиотеки, настройки и т.д.)
  • 🚀 Быстрое развёртывание — можно быстро запускать приложение в любом месте: на сервере, в облаке или локально
  • 🔐 Изоляция окружения — каждое приложение работает в своём “контейнере” и не мешает другим (даже если у них разные версии Node.js, Python и т.д.)

⚙️ Docker Components

  • 🐳 Docker Engine — основа всей экосистемы, демон, который управляет контейнерами
  • 📄 Dockerfile — файл с инструкциями для создания шаблона
  • 🖼 Docker Image — шаблон для создания контейнеров
  • 📦 Docker Container — запущенный Docker Image

☁️ Сопутствующие сервисы

  • ☁️ DockerHub — публичный реестр образов

Установка Docker

Проще у удобнее всего установить себе Docker Desktop, он уже включает в себя все необходимое для работы с Docker. Помимо стандартных инструментов Docker Engine и CLI, он также включает в себя удобный графический интерфейс.

Устнавливается Docker одинаково простоа для Mac, Linux или Windows. Достаточно просто сказать и проследовать стандартной установке.

Проверить что докер установлен можно командой docker -v, в ответ увидим версию докер значит все работает как надо.

Запускается Docker Desktop как обычная программа. При установке Docker Desktop на своем компьютере у вас будет доступен удобный графический инструпмент, мы будем работать с Docker при момощи командной строки, но для наглядности будем заглядывать в графическйи интерфейс.

Тут можно посмотреть запущенные и остановленные контейнеры, образы, тома истории сборок и многое другое.

Запуск первого контейнера

Терминал
docker run ubuntu

Это скачает образ ubuntu и запустит его.

💡
Контейнер запустится — и сразу закроется, потому что внутри просто нечему работать, так устроена работа контейнеров. Чтобы этого избежать можно запустить контейнер в интерактивном режиме.

Для этого запустим наш контейнер со специальным ключем -it

Терминал
docker run -it ubuntu

Команды Docker

Терминал
docker ps # Просмотр запущенных контейнеров docker ps -a # Просмотр всех контейнеров docker images # Список локальных образов
💡
Контейнер можно запустить в фоновом режиме (detached mode), добавив флаг -d — так обычно и делают.
Терминал
docker run -d -it ubuntu

Выйти из интерактивного режима без остановки контейнера можно при помощи комбинацииCtrl+P и Ctrl+Q

Остановить контейнер можно при помощи следующей команды

Терминал
docker stop <container_id>

Снова запустить контейнер можно командой

Терминал
docker start <container_id>

Мы разобрались, как запускать и использовать контейнеры, созданные из готовых образов.

Запустим еще один контейнер nginx

docker run -d nginx

Запустим контейнера с указанием портов

docker run -d -p 8080:80 nginx

Создание и запуск контейнеров

Создадим папку nginx-front и перейдем в нее

Терминал
mkdir nginx-front && cd nginx-front

И создадим нашу стартовую HTML страничку index.html

index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello IT-INCUBATOR</title> <style> body { text-align: center; font-family: Arial, Helvetica, sans-serif ; } </style> </head> <body> <h1>Hello front docker nginx</h1> <img alt="" src="https://golangforall.com/assets/docker.svg"/> </body> </html>

Теперь созданим Dockerfile

Dockerfile
FROM nginx WORKDIR /usr/share/nginx/html COPY index.html .

Создание и запуск образа

Созданим наш образ

docker build -t docker-hello .

Запустим контейнер из нашего образа

docker run -d -p 3333:80 docker-hello

Откройте http://localhost:3333, чтобы проверить.

💡
Обратите внимание, что сейчас у нас одновременно запущено два сервера nginx и они никак не конфликтуют благодоря изоляции Docker

Поднятие образа базы данных PostgreSQL

docker run --name pg -e POSTGRES_PASSWORD=pass -p 5435:5432 -d postgres:14

Поздравляем! Мы только что создали запустили свой первый образ. А также научились запускать готовый образ с базой данных PostgreSQL

Попробуйем более сложный пример

Приложение на NodeJS, которое также будет привествовать нас

mkdir docker-nodejs && cd docker-nodejs

Структура проекта

project/ ├── package.json └── server.js

Создай файл package.json

package.json
{ "name": "express-example", "version": "1.0.0", "main": "server.js", "scripts": { "start": "node server.js" }, "dependencies": { "express": "^4.18.2" } }

Файл server.js

server.js
const express = require('express'); const app = express(); const port = 5555; app.get('/', (req, res) => { res.send('Привет от Express!'); }); app.listen(port, () => { console.log(`Сервер запущен: http://localhost:${port}`); });

Создадим Dockerfile

Dockerfile
FROM node:22 WORKDIR /app COPY server.js . RUN npm install CMD ["node", "server.js"]

Создадим образ из нашего Dockerfile

docker build . -t nodejs-hello:v1

Посмотрим на наш образ выполним команду

docker images

Запустим контейнер на базе нашего образа

docker run -d -p 4444:5555 nodejs-hello:v1

Сохранение образа в Docker Hub

Регистрация в DockerHub

docker login docker tag docker-hello <username>/docker-hello docker push <username>/docker-hello
Last updated on