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 # Список локальных образов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
<!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
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 , чтобы проверить.
Поднятие образа базы данных 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
{
"name": "express-example",
"version": "1.0.0",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.18.2"
}
}Файл 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
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