Files
docker/docs/2. Docker Engine — установка и основные команды.md
T
2026-05-04 11:57:56 +03:00

11 KiB

Установка Docker Engine на Debian/Ubuntu

Tиповой путь через официальный репозиторий Docker. Лучше проверить актуальную версию в официальном гайде

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${VERSION_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Проверяем:

sudo docker run --rm hello-world

Опционально можно запускать без sudo,:

sudo usermod -aG docker $USER
# выйти из сессии и зайти снова
docker run --rm hello-world

Проверка версии:

docker version
docker info

Базовый жизненный цикл контейнера

Скачать образ и запустить интерактивную оболочку, образ автоматически скачивается с Docker Registry:

docker run -it --rm debian:bookworm-slim bash

Установка образа:

Мы указали bash в команде, по этому зашли в интерактивный терминал:

В контейнере, так же как и в линуксе, можно управлять файлами, директориями, сервисами, но ограничено. Выйти из bash - exit, контейнер остановится и --rm удалит его.

Коротко про флаги:

Флаг Смысл
-it интерактив + псевдо-TTY
--rm удалить контейнер после остановки
-d запустить контейнер в фон
--name имя контейнера
-p 8080:80 проброс порта хост:контейнер
-v /путь/на/хосте:/путь/в/контейнере том (данные на хосте)

Запуск веб-сервера в фоне:

docker run -d --name demo-nginx -p 8080:80 nginx:alpine

Проверим работу на порту 8080:

Список контейнеров и логи:

docker ps - посмотреть список АКТИВНЫХ контейнеров docker ps -a - посмотреть список ВСЕХ контейнеров docker logs demo-nginx - вывод логов контейнера docker logs -f demo-nginx - смотреть логи контейнера в реальном времени

Остановка и удаление:

docker stop demo-nginx - остановка контейнера docker rm demo-nginx - удалить контейнер

Вход в уже запущенный контейнер: docker exec

docker run -d --name my-nginx -p 8080:80 nginx:alpine
docker exec -it my-nginx sh

Внутри можно смотреть файлы конфигурации, например cat /etc/nginx/nginx.conf, ставить утилиты в отладочных образах и т.д.

Так же интересный факт: мы уже устанавливали образ nginx:alpine, по этому нам его повторно скачивать не нужно, он хранится в docker cache. Единственный минус - занимает место на диске.

Копирование файлов в контейнер и из контейнера: docker cp

На хосте создадим простейший html файл: echo '<h1>Hallo from DOCKER</h1>' > /tmp/index.html

Затем копирует его прямо в наш docker контейнер: docker cp /tmp/index.html my-nginx:/usr/share/nginx/html/index.html

Обновим страницу в браузере - должен отобразиться новый html.

Скопировать из контейнера на хост:

docker cp my-nginx:/etc/nginx/nginx.conf /tmp/nginx.conf.from-container

Важно: docker cp удобен для отладки и разовых правок. Для поставки контента, файлов в образ используйте функцию COPY в Dockerfile или тома в Compose (смотреть дальше по гайду).

Тома (volumes): данные переживают пересоздание контейнера

Именованный том:

docker volume create webdata
docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine
docker exec nginx-vol sh -c 'echo vol > /usr/share/nginx/html/index.html'

Про каждую команду: docker volume create webdata - создаем именованный том webdata на нашем хосте.

docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine - создем контейнер nginx-vol на порту 8081 и монитируем ему том webdata в каталог контейнера /usr/share/nginx/html. В этом каталоге nginx подхватывает index.html файл.

docker exec nginx-vol sh -c 'echo vol > /usr/share/nginx/html/index.html' - выполняем команду ВНУТРИ контейнера nginx-vol через "sh -c" и передать ему команду echo.

Коротко, что мы сделали: Мы создали том webdata - это физическое место на нашем хосте. Мы к контейнеру примонтировали этот том -v webdata:/usr/share/nginx/html. То есть у контейнера теперь есть доступ к этому физическому месту(тому). Затем мы создали файл index.html в каталоге /usr/share/nginx/html, это означает, что мы фактически создали файл у себя на хосте. Файлы в томах никуда не пропадают при удалении контейнеров.

Проверим на деле:

docker stop nginx-vol
docker rm nginx-vol 
docker run -d --name nginx-vol -p 8081:80 -v webdata:/usr/share/nginx/html nginx:alpine

Новый контейнер взял файл с тома. Если мы зайдем в контейнер и удалим файл index.html, то он удалится и в томе(на хосте).

Bind-mount, привязка папки с хоста:

mkdir -p ~/docker-html && echo '<h1>Bind mount edited</h1>' > ~/docker-html/index.html
docker run -d --name nginx-bind -p 8082:80 -v ~/docker-html:/usr/share/nginx/html:ro nginx:alpine

Про каждую команду:

mkdir -p ~/docker-html && echo '<h1>Bind mount</h1>' > ~/docker-html/index.html - в домашней директории юзера создаем папку docker-html, в которой создаем index.html файл.

docker run -d --name nginx-bind -p 8082:80 -v ~/docker-html:/usr/share/nginx/html:ro nginx:alpine - поднимает контейнер nginx-bind на порту 8082, к которому мы примонтировали нашу ЛОКАЛЬНУЮ папку ~/docker-html. Это не именованный том из зоны docker, а непосредственно наша папка.

:ro - только чтение из контейнера, не дает перезаписывать наши файлы в папке ~/docker-html.

Теперь поменяем в нашей локальной папке файл и посмотрим что будет:

Всё работает.

Сеть: как контейнеры видят друг друга

По умолчанию контейнеры в bridge могут общаться по IP. Удобнее создать пользовательскую сеть и обращаться по имени контейнера:

docker network create app-net
docker run -d --name backend --network app-net nginx:alpine
docker run -it --rm --network app-net alpine wget -qO- http://backend

Мы создали виртуальную докер сеть app-net, создали первый контейнер с nginx с сетью app-net, затем второй контейнер с такой же сетью. Со второго контейнера мы обратились к первому по его названию.

Очистка среды

docker stop my-nginx nginx-vol nginx-bind backend
docker rm my-nginx nginx-vol nginx-bind backend
docker volume rm webdata 
docker network rm app-net 

Что дальше

  • Часть 3 — сборка своего образа, Dockerfile, многоэтапные сборки, COPY vs монтирование.
  • Часть 4 — полный пример Docker Compose из репозитория docker/examples/multi-service.