Перейти к содержанию

Docker

Видео, просмотренные про Docker:

Прочитать статьи про 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

Debian | Docker Docs

Если ранее был установлен докер:

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

Ubuntu | Docker Docs

Управление 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. Используется для сохранения данных БД, кэша и т.д.
    1. Переменные окружения (-e): Способ конфигурации приложения в контейнере без изменения образа (пароли, ключи, настройки).
    2. Пример: -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

![Docker#](Docker#)
7ce5c6

Базовая структура Dockerfile

# Базовый образ, который будем использовать
FROM python:alpine

# Рабочая директория
WORKDIR /app        

# Копирование наших файлов
COPY . .            

# Здесь прописывем команды, которые будем выполнятьcя при сборке образа
RUN command        

# Прописывем какой порт будет использоваться контейнером
EXPOSE 3000        

# Команды, которые выполняются при каждом запуске контейнера
CMD ["python", "index.py"]