Docker
Видео, просмотренные про Docker:¶
- Docker для Начинающих за 49 Мин | Docker с Нуля | 2025 Переиздание - YouTube
- Docker для Начинающих – Полный Курс - YouTube
Прочитать статьи про Docker:¶
Изучить по Docker¶
По Docker:
1) Более детально изучить Dockerfile
2) Что такое ENV переменные в Dockerfile
3) Разобраться как пушить образ в Docker Hub
4) Как работать с dockerignore
5) Изучать Docker Compose
Теория по Docker¶
Docker - сервис для запуска приложений в контейнерах.
Контейнер (Container) - это самый маленький элемент в мире Docker. Обычно одно приложение - это один контейнер. Контейнер — изолированная среда, содержащая приложение со всеми его зависимостями (библиотеки, конфигурации, код). Контейнер работает поверх ядра хостовой ОС.
Образ (Image) - основа для создания контейнера. ^043816
Dockerfile - это текстовый файл, в котором описан рецепт создания образа Docker. Он содержит последовательность команд, которые Docker использует для создания образа. ^7ce5c6
Репозитории - набор различных версий какого либо образа.
DockerHub - хранилище образов Docker. ^e1a820
Преимущества Docker:¶
- Приложения запускаются в изолированной среде.
- Можно запускать приложение на разных серверах.
- Все зависимости приложений устанавливаются внутри контейнера.
- Легко масштабировать путём увеличения количества контейнеров.
- Очень удобно использовать в процессе разработки приложений.
Компоненты Docker:¶
- Client (Клиент) - взаимодействие со службой.
- Daemon (Служба).
- Host (Хост) - ПК, где запущен Docker.
- Контейнер.
- Образ(На одном образе можно создать несколько контейнеров).
- Репозиторий.
- Реестр.
Как работают контейнеры:¶
- Создаются на ПК с ОС Linux.
- Для работы Docker нужен Docker Engine.
- При создании контейнера на диске создаётся место исключительно под данный контейнер.
Установка Docker¶
Установка Docker в Alt Linux¶
- Установить docker можно следующей командой:
sudo apt-get install docker-engine
- Для запуска docker от пользователя (не root) следует выполнить несколько шагов:
usermod ИМЯ_ПОЛЬЗОВАТЕЛЯ -aG docker
- Затем необходимо запустить соответствующую службу:
systemctl enable --now docker
Установка Docker в Debian & Ubuntu¶
Если ранее был установлен докер:
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)
Загрузить публичный ключ Docker
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
Добавить официальный репозиторий Docker в систему:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
Обновить списки пакетов:
sudo apt update
Установить последнюю версию
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Проверим запущена ли служба
sudo systemctl status docker
Запуск службы
sudo systemctl start docker
Docker Desktop¶
Поддержка виртуализации KVM¶
Docker Desktop запускает виртуальную машину, для которой требуется поддержка KVM.
modprobe kvm
В зависимости от процессора основного компьютера необходимо загрузить соответствующий модуль:
modprobe kvm_intel # Intel processors
modprobe kvm_amd # AMD processors
Если указанные выше команды не сработали, вы можете просмотреть результаты диагностики, выполнив команду:
kvm-ok
Чтобы проверить, включены ли модули KVM, выполните команду:
lsmod | grep kvm
kvm_amd 167936 0
ccp 126976 1 kvm_amd
kvm 1089536 1 kvm_amd
irqbypass 16384 1 kvm
Чтобы проверить права доступа к /dev/kvm, выполните команду :
ls -al /dev/kvm
Чтобы получить доступ к устройству kvm, добавьте своего пользователя в группу kvm:
sudo usermod -aG kvm $USER
Установка Docker Desktop в Debian & Ubuntu¶
Управление Docker от имени пользователя без прав root¶
Создайте docker группу:
sudo groupadd docker
Добавьте своего пользователя в группу docker:
sudo usermod -aG docker $USER
Чтобы активировать изменения в группах, вы также можете выполнить следующую команду:
newgrp docker
Установка Docker Compose¶
Установка с помощью плагина¶
Для Ubuntu и Debian выполните команду:
sudo apt-get update
sudo apt-get install docker-compose-plugin
Для дистрибутивов на основе RPM выполните команду:
sudo yum update
sudo yum install docker-compose-plugin
Убедитесь, что Docker Compose установлен правильно, проверив его версию
docker compose version
Основные команды для работы с Docker через Консоль¶
- Просмотр подсказки при работе с командами Docker
docker [command] --help
Работа с контейнерами¶
Список запущенных и остановленных контейнеров:¶
docker ps -a
Список запущенных контейнеров:¶
docker ps
Создание контейнера(скачивается образ и запускается контейнер):¶
docker run imageName:version(если нужно)
Создание контейнера cо своим именем:¶
# -d --- в фоновом режиме
docker run -d --name myName imageName
Удаление контейнера:¶
docker rm ContainerID или ContainerName
# Удаление даже тех контейнеров которые в фоне
docker rm -f ContainerID или ContainerName
Удаление всех остановленных контейнеров:¶
docker container prune
Запуск в интерактивном режиме:¶
docker run -it imageName
# Запуск в интерактивном режиме с поключением терминала
docker run -it imageName bash
Выход из контейнера:¶
exit
Вход в работающий контейнер¶
docker exec -it <container_name_or_id> bash
#### Остановить контейнер:
docker stop ContainerID или ContainerName
Просто запуск уже созданного ранее контейнера¶
docker start ContainerID или ContainerName
Просмотр логов контейнера¶
docker logs ContainerID или ContainerName
Запуск в фоновом режиме:¶
docker run -d imageName --name <myName>
Узнаём ip-address контейнера:¶
docker container inspect ContainerID
Запуск нового процесса в контейнере:¶
docker exec -it ContainerID ProcesName
Example: docker exec -it ContainerID bash
Maping портов(публикация/проброс портов):¶
Публикация портов (-p): Контейнеры изолированы от хоста. Чтобы получить доступ к сервису внутри контейнера (например, веб-серверу на порту 80), нужно сопоставить порт контейнера с портом хоста.
# Формат: -p <хост_порт>:<контейнер_порт>
# где 8080 - внешний порт(на локлальном ПК); 80 - порт контейнера; nginx - название образа
docker run -p 8080:80 nginx
Maping томов(публикация/проброс томов):¶
Тома (Volumes): Файловая система контейнера "эфемерна" — при удалении контейнера все данные теряются. Тома — механизм для сохранения данных.
- Bind Mount: Привязка конкретной директории на хосте в директорию контейнера. Часто используется для разработки (ваш код "подключается" в контейнер).
- Named Volume: Именованный том, которым управляет Docker. Используется для сохранения данных БД, кэша и т.д.
-
- Переменные окружения (
-e): Способ конфигурации приложения в контейнере без изменения образа (пароли, ключи, настройки). - Пример:
-e MYSQL_ROOT_PASSWORD=mysecretpassword
- Переменные окружения (
# Пример Windows
docker run -v ${PWD}:/Путь к папке в контейнере IMAGEname
# где ${PWD} - путь к локальной папке;
Example: docker run -v C:\Users\user\docker\nginx:/usr/share/nginx/html
# Пример Linux
# -v my-data:/data = подключить том my-data в папку /data внутри контейнера
docker run -it --name box1 -v my-data:/data alpine sh
Можно писать и так
docker run -d --name mirror-nginx \
-p 8888:80 \
-v ~/mirror-folder:/usr/share/nginx/html \
nginx:alpine
Работа с сетью между контейнерами¶
Управление сетями¶
# Посмотреть список сетей
docker network ls
# Создать новую сеть
docker network create my-network
# Создать сеть с определенным драйвером
docker network create --driver bridge my-bridge-network
docker network create --driver overlay my-overlay-network
# Удалить сеть
docker network rm my-network
# Удалить все неиспользуемые сети
docker network prune
# Просмотреть детальную информацию о сети
docker network inspect my-network
Подключение контейнеров к сетям¶
# Запустить контейнер в определенной сети
docker run --network my-network --name my-container nginx
# Подключить работающий контейнер к сети
docker network connect my-network my-container
# Отключить контейнер от сети
docker network disconnect my-network my-container
# Запустить контейнер с несколькими сетевыми интерфейсами
docker run --network network1 --network network2 --name multi-net-container nginx
# Пинг между контейнерами в одной сети
docker exec -it container1 ping container2
Специальные сетевые режимы¶
# Host mode (использует сеть хоста)
docker run --network host nginx
# None mode (без сети)
docker run --network none alpine
# Bridge mode (по умолчанию)
docker run --network bridge nginx
# Контейнер mode (использует сеть другого контейнера)
docker run --network container:existing-container nginx
Настройки сети при создании¶
# Указать IP адрес контейнера
docker run --network my-network --ip 172.20.0.10 nginx
# Создать сеть с определенной подсетью
docker network create --subnet=172.20.0.0/16 my-custom-network
# Добавить alias (псевдоним) для контейнера
docker run --network my-network --network-alias api nginx
Полезные команды для диагностики¶
# Посмотреть сетевые интерфейсы внутри контейнера
docker exec my-container ip addr show
docker exec my-container ifconfig
# Проверить связность
docker exec my-container ping 8.8.8.8
docker exec my-container curl http://another-container:3000
# Посмотреть таблицу маршрутизации
docker exec my-container netstat -rn
docker exec my-container route -n
Работа с образами:¶
[[#Работа с контейнерами |Перейти к работе с контейнерами]]
Список локальных[[#^043816 | образов]]:¶
docker images
Скачивание образа из[[#^e1a820 | DockerHub]]:¶
docker pull imageName
Создание собственного образа на основе [[#^7ce5c6| Dockerfile]]:¶
docker build [Путь до Dockerfile]
С тегом
docker build -t my-username/my-image .
Удаление образа c ПК:¶
docker rmi [ID_образа или имя]
# Принудительное удаление образов (которые используются в контейнерах)
docker rmi -f [ID_образа или имя]
Dockerfile¶
Базовая структура Dockerfile¶
# Базовый образ, который будем использовать
FROM python:alpine
# Рабочая директория
WORKDIR /app
# Копирование наших файлов
COPY . .
# Здесь прописывем команды, которые будем выполнятьcя при сборке образа
RUN command
# Прописывем какой порт будет использоваться контейнером
EXPOSE 3000
# Команды, которые выполняются при каждом запуске контейнера
CMD ["python", "index.py"]