DEV Community

Aisalkyn Aidarova
Aisalkyn Aidarova

Posted on

🐳 DOCKER COMPLETE LAB — Beginner DevOps

Цель: понять весь основной workflow Docker:

Application
    ↓
Dockerfile
    ↓
docker build
    ↓
Docker Image
    ↓
docker run
    ↓
Container
    ↓
Ports
    ↓
Volumes
    ↓
Networks
    ↓
Registry
    ↓
Kubernetes
Enter fullscreen mode Exit fullscreen mode

PART 1 — Проверяем Docker

docker --version
Enter fullscreen mode Exit fullscreen mode

Проверяем, работает ли Docker:

docker info
Enter fullscreen mode Exit fullscreen mode

Главная команда помощи:

docker --help
Enter fullscreen mode Exit fullscreen mode

Объяснение:

Docker Engine — запускает контейнеры
Docker CLI — команды docker, которые мы вводим
Docker Image — шаблон
Docker Container — запущенный экземпляр image
Enter fullscreen mode Exit fullscreen mode

PART 2 — Первый контейнер

Запустите:

docker run hello-world
Enter fullscreen mode Exit fullscreen mode

Что произошло:

docker run hello-world
        ↓
Docker ищет image локально
        ↓
Image нет
        ↓
Docker скачивает его из registry
        ↓
Создает container
        ↓
Запускает container
Enter fullscreen mode Exit fullscreen mode

Посмотрите контейнеры:

docker ps
Enter fullscreen mode Exit fullscreen mode

Покажите также остановленные:

docker ps -a
Enter fullscreen mode Exit fullscreen mode

PART 3 — Запускаем Nginx

docker run nginx
Enter fullscreen mode Exit fullscreen mode

Откройте второй Terminal:

docker ps
Enter fullscreen mode Exit fullscreen mode

Остановите:

docker stop CONTAINER_ID
Enter fullscreen mode Exit fullscreen mode

Теперь запустим в background:

docker run -d nginx
Enter fullscreen mode Exit fullscreen mode

-d означает detached mode — контейнер работает в фоне.


PART 4 — Даем контейнеру имя

docker run -d --name web-server nginx
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker ps
Enter fullscreen mode Exit fullscreen mode

Теперь вместо ID можно использовать имя:

docker stop web-server
Enter fullscreen mode Exit fullscreen mode

Запустить снова:

docker start web-server
Enter fullscreen mode Exit fullscreen mode

Перезапустить:

docker restart web-server
Enter fullscreen mode Exit fullscreen mode

Удалить:

docker rm -f web-server
Enter fullscreen mode Exit fullscreen mode

PART 5 — Docker Images

Посмотрите images:

docker images
Enter fullscreen mode Exit fullscreen mode

Скачайте image вручную:

docker pull nginx
Enter fullscreen mode Exit fullscreen mode

Скачайте конкретную версию:

docker pull nginx:alpine
Enter fullscreen mode Exit fullscreen mode

Посмотрите:

docker images
Enter fullscreen mode Exit fullscreen mode

Объясните студентам:

nginx          = repository
alpine         = tag
nginx:alpine   = image + tag
Enter fullscreen mode Exit fullscreen mode

latest — это просто tag. Он не означает автоматически «самая новая версия навсегда».


PART 6 — PORTS ⭐

Запустите:

docker run -d \
--name my-nginx \
-p 8080:80 \
nginx
Enter fullscreen mode Exit fullscreen mode

Проверьте:

docker ps
Enter fullscreen mode Exit fullscreen mode

Откройте:

http://localhost:8080
Enter fullscreen mode Exit fullscreen mode

Объяснение:

Browser
   ↓
localhost:8080
   ↓
HOST PORT 8080
   ↓
CONTAINER PORT 80
   ↓
NGINX
Enter fullscreen mode Exit fullscreen mode

Запомнить:

-p HOST_PORT:CONTAINER_PORT
Enter fullscreen mode Exit fullscreen mode

PART 7 — Заходим внутрь Container

Посмотрите контейнер:

docker ps
Enter fullscreen mode Exit fullscreen mode

Зайдите внутрь:

docker exec -it my-nginx sh
Enter fullscreen mode Exit fullscreen mode

Теперь вы внутри контейнера.

Попробуйте:

pwd
Enter fullscreen mode Exit fullscreen mode
ls
Enter fullscreen mode Exit fullscreen mode
hostname
Enter fullscreen mode Exit fullscreen mode
cat /etc/os-release
Enter fullscreen mode Exit fullscreen mode

Посмотрите HTML:

ls /usr/share/nginx/html
Enter fullscreen mode Exit fullscreen mode
cat /usr/share/nginx/html/index.html
Enter fullscreen mode Exit fullscreen mode

Выход:

exit
Enter fullscreen mode Exit fullscreen mode

PART 8 — Создаем собственное приложение

Создаем project:

mkdir docker-lab
cd docker-lab
Enter fullscreen mode Exit fullscreen mode

Создаем:

touch index.html
Enter fullscreen mode Exit fullscreen mode

Добавьте:

<!DOCTYPE html>
<html>
<head>
    <title>JumpToTech Docker Lab</title>
</head>
<body>
    <h1>Hello from Docker!</h1>
    <h2>JumpToTech DevOps</h2>
    <p>My first Docker application</p>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

PART 9 — Dockerfile ⭐⭐⭐

Создайте:

touch Dockerfile
Enter fullscreen mode Exit fullscreen mode

Добавьте:

FROM nginx:alpine

COPY index.html /usr/share/nginx/html/index.html

EXPOSE 80
Enter fullscreen mode Exit fullscreen mode

Объяснение:

FROM
Enter fullscreen mode Exit fullscreen mode

Какой base image используем.

COPY
Enter fullscreen mode Exit fullscreen mode

Копируем наши файлы внутрь image.

EXPOSE
Enter fullscreen mode Exit fullscreen mode

Документирует порт, на котором приложение ожидает трафик. Сам по себе EXPOSE порт на host не публикует.


PART 10 — BUILD IMAGE

Построим:

docker build -t jumptotech-web:v1 .
Enter fullscreen mode Exit fullscreen mode

Очень важно объяснить .:

.
=
current directory
=
Docker build context
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker images
Enter fullscreen mode Exit fullscreen mode

Должны увидеть:

jumptotech-web    v1
Enter fullscreen mode Exit fullscreen mode

PART 11 — Image → Container

docker run -d \
--name jumptotech-container \
-p 8080:80 \
jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker ps
Enter fullscreen mode Exit fullscreen mode

Открываем:

http://localhost:8080
Enter fullscreen mode Exit fullscreen mode

🎉 Вы создали собственный Docker Image.


PART 12 — Docker Logs

docker logs jumptotech-container
Enter fullscreen mode Exit fullscreen mode

Следить за логами:

docker logs -f jumptotech-container
Enter fullscreen mode Exit fullscreen mode

Остановить просмотр:

Ctrl + C
Enter fullscreen mode Exit fullscreen mode

Объясните:

Когда приложение не работает, одна из первых вещей DevOps engineer — посмотреть logs.


PART 13 — Inspect

docker inspect jumptotech-container
Enter fullscreen mode Exit fullscreen mode

Здесь можно увидеть:

IP
Ports
Network
Mounts
Environment
Image
Configuration
Enter fullscreen mode Exit fullscreen mode

Можно посмотреть IP:

docker inspect \
-f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
jumptotech-container
Enter fullscreen mode Exit fullscreen mode

PART 14 — Docker Processes

docker top jumptotech-container
Enter fullscreen mode Exit fullscreen mode

Посмотрите использование ресурсов:

docker stats
Enter fullscreen mode Exit fullscreen mode

Здесь увидите:

CPU
Memory
Network
Processes
Enter fullscreen mode Exit fullscreen mode

Остановить:

Ctrl + C
Enter fullscreen mode Exit fullscreen mode

PART 15 — Environment Variables

Запустите:

docker run --rm \
-e COMPANY=JumpToTech \
-e ENVIRONMENT=dev \
alpine env
Enter fullscreen mode Exit fullscreen mode

Увидите:

COMPANY=JumpToTech
ENVIRONMENT=dev
Enter fullscreen mode Exit fullscreen mode

В production environment variables часто используются для конфигурации:

DB_HOST
DB_PORT
APP_ENV
API_URL
Enter fullscreen mode Exit fullscreen mode

Пароли и токены не следует hardcode-ить в Dockerfile или image.


PART 16 — Volumes ⭐⭐⭐

Контейнеры должны считаться временными.

Container deleted
        ↓
container writable data can disappear
Enter fullscreen mode Exit fullscreen mode

Поэтому persistent data хранят отдельно.

Создаем volume:

docker volume create jumptotech-data
Enter fullscreen mode Exit fullscreen mode

Посмотрите:

docker volume ls
Enter fullscreen mode Exit fullscreen mode

Запустите:

docker run -d \
--name volume-demo \
-v jumptotech-data:/data \
alpine \
sh -c "echo 'Hello JumpToTech' > /data/student.txt && sleep 3600"
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker exec volume-demo cat /data/student.txt
Enter fullscreen mode Exit fullscreen mode

Удаляем container:

docker rm -f volume-demo
Enter fullscreen mode Exit fullscreen mode

Создаем новый:

docker run --rm \
-v jumptotech-data:/data \
alpine \
cat /data/student.txt
Enter fullscreen mode Exit fullscreen mode

Файл остался.

Это и есть идея:

Container
    X deleted

Volume
    ✓ survives
Enter fullscreen mode Exit fullscreen mode

PART 17 — Bind Mount

Создайте:

mkdir website
Enter fullscreen mode Exit fullscreen mode

Создайте:

echo "<h1>Hello from Bind Mount</h1>" > website/index.html
Enter fullscreen mode Exit fullscreen mode

Запустите:

docker run -d \
--name bind-demo \
-p 8081:80 \
-v "$(pwd)/website:/usr/share/nginx/html:ro" \
nginx
Enter fullscreen mode Exit fullscreen mode

Откройте:

http://localhost:8081
Enter fullscreen mode Exit fullscreen mode

Измените файл на компьютере:

echo "<h1>Docker is awesome!</h1>" > website/index.html
Enter fullscreen mode Exit fullscreen mode

Refresh browser.

Изменение появится сразу.


PART 18 — Docker Network ⭐⭐⭐

Создаем network:

docker network create jumptotech-network
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker network ls
Enter fullscreen mode Exit fullscreen mode

Запускаем первый container:

docker run -d \
--name web1 \
--network jumptotech-network \
nginx
Enter fullscreen mode Exit fullscreen mode

Второй:

docker run -it \
--rm \
--network jumptotech-network \
alpine sh
Enter fullscreen mode Exit fullscreen mode

Внутри:

ping web1
Enter fullscreen mode Exit fullscreen mode

Docker DNS на user-defined network позволяет обращаться к контейнеру по имени:

web1
Enter fullscreen mode Exit fullscreen mode

Вместо запоминания IP.

Выход:

exit
Enter fullscreen mode Exit fullscreen mode

PART 19 — Container-to-Container Communication

Представьте:

Frontend Container
        ↓
Backend Container
        ↓
Database Container
Enter fullscreen mode Exit fullscreen mode

В Docker Network они могут обращаться друг к другу по DNS-именам:

frontend → backend
backend → database
Enter fullscreen mode Exit fullscreen mode

Именно поэтому networking очень важен для microservices.


PART 20 — Dockerfile: основные инструкции

Студент должен знать:

FROM nginx:alpine
Enter fullscreen mode Exit fullscreen mode

Base image.

WORKDIR /app
Enter fullscreen mode Exit fullscreen mode

Рабочая директория.

COPY . .
Enter fullscreen mode Exit fullscreen mode

Копирование файлов.

RUN npm install
Enter fullscreen mode Exit fullscreen mode

Команда выполняется во время build.

ENV NODE_ENV=production
Enter fullscreen mode Exit fullscreen mode

Environment variable.

EXPOSE 3000
Enter fullscreen mode Exit fullscreen mode

Документирует container port.

CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

Default command при запуске container.

Также полезно знать:

ENTRYPOINT ["python", "app.py"]
Enter fullscreen mode Exit fullscreen mode

PART 21 — RUN vs CMD ⭐

Очень важно.

RUN
Enter fullscreen mode Exit fullscreen mode

выполняется при:

docker build
Enter fullscreen mode Exit fullscreen mode

Например:

RUN npm install
Enter fullscreen mode Exit fullscreen mode

А:

CMD
Enter fullscreen mode Exit fullscreen mode

выполняется при:

docker run
Enter fullscreen mode Exit fullscreen mode

Например:

CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

Запомнить:

RUN = BUILD TIME
CMD = RUN TIME
Enter fullscreen mode Exit fullscreen mode

PART 22 — Docker Layers

Dockerfile:

FROM node:alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]
Enter fullscreen mode Exit fullscreen mode

Каждая инструкция может создавать или использовать layer/cache.

Поэтому порядок Dockerfile имеет значение.

Например, зависимости лучше копировать отдельно, чтобы Docker мог повторно использовать cache, когда package.json не изменился.


PART 23 — .dockerignore

Создайте:

touch .dockerignore
Enter fullscreen mode Exit fullscreen mode

Пример:

.git
node_modules
.env
*.log
README.md
Enter fullscreen mode Exit fullscreen mode

Зачем?

Чтобы ненужные или чувствительные файлы не попадали в build context/image.


PART 24 — Tags

Сейчас:

docker images
Enter fullscreen mode Exit fullscreen mode

Создадим новый tag:

docker tag jumptotech-web:v1 jumptotech-web:v2
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker images
Enter fullscreen mode Exit fullscreen mode

Важно:

v1
v2
1.0.0
2026-09-10
git-sha
Enter fullscreen mode Exit fullscreen mode

— примеры image tags.

В production лучше использовать конкретные immutable/versioned tags вместо того, чтобы полагаться только на latest.


PART 25 — Docker Registry

Архитектура:

Developer
   ↓
docker build
   ↓
Image
   ↓
docker push
   ↓
Registry
   ↓
docker pull
   ↓
Server / Kubernetes
Enter fullscreen mode Exit fullscreen mode

Registry может быть:

Docker Hub
Amazon ECR
GitHub Container Registry
Google Artifact Registry
Azure Container Registry
Enter fullscreen mode Exit fullscreen mode

PART 26 — Push Image

Пример Docker Hub:

docker login
Enter fullscreen mode Exit fullscreen mode

Tag:

docker tag jumptotech-web:v1 USERNAME/jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

Push:

docker push USERNAME/jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

Теперь другой сервер может:

docker pull USERNAME/jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

PART 27 — AWS ECR ⭐

В реальном AWS workflow:

GitHub
  ↓
CI/CD
  ↓
docker build
  ↓
ECR
  ↓
EKS
Enter fullscreen mode Exit fullscreen mode

Login:

aws ecr get-login-password --region us-east-1 | \
docker login \
--username AWS \
--password-stdin ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com
Enter fullscreen mode Exit fullscreen mode

Tag:

docker tag jumptotech-web:v1 \
ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

Push:

docker push \
ACCOUNT_ID.dkr.ecr.us-east-1.amazonaws.com/jumptotech-web:v1
Enter fullscreen mode Exit fullscreen mode

PART 28 — Docker Compose ⭐

Представьте, приложение состоит из:

Frontend
Backend
Database
Redis
Enter fullscreen mode Exit fullscreen mode

Неудобно запускать всё отдельными docker run.

Поэтому для локального multi-container приложения используется Compose.

Создайте:

compose.yaml
Enter fullscreen mode Exit fullscreen mode

Простой пример:

services:

  web:
    image: nginx:alpine
    ports:
      - "8080:80"

  redis:
    image: redis:alpine
Enter fullscreen mode Exit fullscreen mode

Запускаем:

docker compose up -d
Enter fullscreen mode Exit fullscreen mode

Проверяем:

docker compose ps
Enter fullscreen mode Exit fullscreen mode

Logs:

docker compose logs
Enter fullscreen mode Exit fullscreen mode

Остановить и удалить созданные Compose containers/network:

docker compose down
Enter fullscreen mode Exit fullscreen mode

PART 29 — Cleanup

Посмотрите всё:

docker ps -a
Enter fullscreen mode Exit fullscreen mode

Images:

docker images
Enter fullscreen mode Exit fullscreen mode

Volumes:

docker volume ls
Enter fullscreen mode Exit fullscreen mode

Networks:

docker network ls
Enter fullscreen mode Exit fullscreen mode

Удалить container:

docker rm -f CONTAINER_NAME
Enter fullscreen mode Exit fullscreen mode

Удалить image:

docker rmi IMAGE_NAME
Enter fullscreen mode Exit fullscreen mode

Удалить volume:

docker volume rm VOLUME_NAME
Enter fullscreen mode Exit fullscreen mode

Удалить network:

docker network rm NETWORK_NAME
Enter fullscreen mode Exit fullscreen mode

Очистка неиспользуемых объектов:

docker system prune
Enter fullscreen mode Exit fullscreen mode

Будьте осторожны с более агрессивными prune-командами на рабочих машинах.


PART 30 — Troubleshooting ⭐⭐⭐

Это особенно важно для DevOps engineer.

Container не работает

docker ps -a
Enter fullscreen mode Exit fullscreen mode

Посмотреть logs

docker logs CONTAINER
Enter fullscreen mode Exit fullscreen mode

Посмотреть configuration

docker inspect CONTAINER
Enter fullscreen mode Exit fullscreen mode

Зайти внутрь

docker exec -it CONTAINER sh
Enter fullscreen mode Exit fullscreen mode

или, если установлен Bash:

docker exec -it CONTAINER bash
Enter fullscreen mode Exit fullscreen mode

Проверить процессы

docker top CONTAINER
Enter fullscreen mode Exit fullscreen mode

Проверить resources

docker stats
Enter fullscreen mode Exit fullscreen mode

Проверить ports

docker port CONTAINER
Enter fullscreen mode Exit fullscreen mode

Проверить networks

docker network ls
Enter fullscreen mode Exit fullscreen mode
docker network inspect NETWORK
Enter fullscreen mode Exit fullscreen mode

PART 31 — Что студент обязан знать после Docker

Я бы проверила каждого студента по этим вопросам:

Topic Student должен объяснить
Docker зачем он нужен
Container что это
Image что это
Dockerfile зачем нужен
Registry где хранят images
docker build создаёт image
docker run создаёт/запускает container
docker ps показывает containers
docker images показывает images
docker exec выполнить команду внутри container
docker logs logs
-p port mapping
-v volume/bind mount
-e environment variable
Network communication
Volume persistent data
Tag версия image
Docker Compose multi-container local apps
ECR AWS container registry
Layers/cache оптимизация build
.dockerignore исключение файлов

Финальное задание студентам 🔥

Не давайте им команды. Дайте только задачу:

Вы работаете DevOps Engineer в JumpToTech. Developer передал вам простой website.

Вам необходимо:

  1. Создать HTML application.
  2. Написать Dockerfile.
  3. Использовать Nginx.
  4. Построить image jumptotech-web:v1.
  5. Запустить container.
  6. Назвать container jumptotech-prod.
  7. Открыть приложение через port 8080.
  8. Проверить container.
  9. Посмотреть logs.
  10. Зайти внутрь container.
  11. Найти index.html внутри container.
  12. Создать volume.
  13. Создать custom Docker network.
  14. Объяснить разницу Image vs Container.
  15. Объяснить 8080:80.
  16. Создать tag v2.
  17. Push image в registry.
  18. Остановить container.
  19. Удалить container.
  20. Снова получить image из registry и запустить приложение.

Главная схема урока

                    DOCKER

Developer Code
      ↓
 Dockerfile
      ↓
docker build
      ↓
   IMAGE
      ↓
   TAG
      ↓
 Registry
Docker Hub / ECR
      ↓
docker pull
      ↓
docker run
      ↓
 CONTAINER
   ↙   ↓   ↘
PORT VOLUME NETWORK
      ↓
 APPLICATION
      ↓
 Kubernetes / EKS
Enter fullscreen mode Exit fullscreen mode

Если студент самостоятельно выполнит финальное задание и сможет объяснить Dockerfile → Image → Registry → Container → Port → Volume → Network, у него уже будет хорошая практическая база Docker перед переходом к Kubernetes.

Top comments (0)