Рассмотрим основные команды для работы Docker, а также приведём несколько примеров.
Детальная официальная документация Docker: https://docs.docker.com/
В Windows для ввода команд используйте "Командную строку" (cmd.exe)
В лучших традициях Linux каждая команда Docker имеет встроенную документацию для этого добавьте --help
# Например, документация для команды images docker images --help
1. Общие команды
- docker version — показывает техническую информацию о Docker
- docker login — авторизует пользователя в реестре Docker
- docker system prune — выполняет очистку, удаляя из системы неиспользуемые контейнеры, ненужные сети и образы без имен и меток
2. Команды для управления образами
Образ (Docker Image) — неизменяемая, изолированная файловая система. Содержит всё необходимое для запуска приложения — все зависимости, конфигурации, сценарии, двоичные файлы и т. д. Образ также содержит конфигурацию контейнера: переменные среды, команды по умолчанию для запуска, и другие метаданные.
- build — собирает образ с нуля
- push — отправляет образ в реестр
- pull — загружает готовый образ с необходимыми для работы параметрами
- images — списком показывает все образы Docker на диске
- ls — показывает все существующие образы
- history — показывает каждый слой образа в ретроспективе, отображая некоторые полезные сведения
- inspect — рассказывает всё, что известно об образе, включая данные, касающиеся отдельных слоев
- rm — удаляет образ Docker из системы
# Синтаксис docker image %команда% # Вывести список всех образов docker images
3. Команды для управления контейнерами
Контейнер (Docker Container) — это исполняемый экземпляр запущенного образа. Можно создать, запустить, остановить, переместить или удалить контейнер с помощью DockerAPI или CLI. Контейнер можно запускать на локальных машинах, виртуальных машинах или развертывать в облаке. Контейнер может работать на любой ОС. Контейнер изолирован от других контейнеров и запускает собственное программное обеспечение, двоичные файлы и конфигурации.
- create — создает контейнер из выбранного образа
- start — активирует уже существующий контейнер
- run — создает новый контейнер и сразу включает его
- ls — отображает все существующие контейнеры
- inspect — подробнее рассказывает о выбранном контейнере
- logs — выводит в консоль логи (журнал событий)
- pause — приостанавливает все запущенные процессы внутри контейнера
- stop — пытается остановить выбранный контейнер, отправив ему сигнал SIGTERM, требующий завершить всю активность и сохранить пользовательские данные. Если ответ занимает слишком много времени, то следом посылает сигнал SIGKILL, чтобы «убить» процесс без сохранения данных
- kill — выполняет ту же задачу, что и предыдущая команда, но пропускает шаг с отправкой SIGTERM. Сразу выключает контейнер, игнорируя сохранение пользовательских данных
- rm — удаляет выбранный контейнер (он должен быть выключен, чтобы команда сработала)
# Синтаксис docker container %команда% # Выводит список запущенных контейнеров docker ps # Выводит список всех контейнеров docker ps -a # Выводит список id всех контейнеров docker ps -a -q # Запуск существующего контейнера docker start %container-id% # Выполнить команду внутри запущенного контейнера docker exec -it %container-id% /bin/bash # Остановка существующего контейнера docker stop %container-id% # Удаление существующего контейнера docker rm %container-id%
4. Команды для управления томами
Том (Docker Volumes) — способ хранения данных, представляющий собой примонтированный каталог хоста к файловой системе контейнера.
Контейнеры могут создавать, обновлять и удалять файлы, но эти изменения теряются при удалении контейнера, и все изменения изолируются в этом контейнере. С помощью томов это можно изменить. Тома предоставляют возможность подключать определенные пути файловой системы контейнера обратно к хост-компьютеру. Если каталог в контейнере смонтирован, то изменения в этом каталоге также видны на хост-компьютере. Если мы смонтируем один и тот же каталог при перезапуске контейнера, мы увидим одни и те же файлы.
# Создать том с именем user-data без контейнера docker volume create --name user-data # Вывести список томов docker volume ls # Вывести детальную информацию по имени тома docker inspect user-data # Запустить контейнер ubuntu и подключить созданный том -v docker run --rm -v user-data:/data -it ubuntu:22.04 /bin/bash # Записать случайное число в файл echo $RANDOM > /data/test # Прочитать файл cat /data/test # В нашем примере это число 12415 # Теперь нужно запустить любой другой контейнер и подключить тот же том user-data # Например запустим centos v.8 и попробуем прочитать содержимое того же файла из тома user-data docker run --rm -v slurm-storage:/data -it centos:8 /bin/bash -c "cat /data/test" # Получим тот же результат. Задача выполнена - данные были сохранены в томе. 12415
5. Команды для работы портами
Docker запускает сервис изолированно — все порты между хостом и контейнером закрыты. Для доступа к сервису нужно указать сопоставление портов или создать маппинг. Тогда все запросы, проходящие через указанный порт хоста, будут перенаправляться в контейнер. Сопоставление портов делает сервисы контейнера доступными извне.
-p <host_post>:<container_port>
Для примера поднимем сервер и сделаем его доступным в основной ОС через порт 8082.
# 0. Создать каталог и перейти в него
mkdir apache
cd apache
# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
WORKDIR /var/www/html
COPY . /var/www/html
# разрешить подключение к 80 порту контейнера
EXPOSE 80
# 2. Создать файл index.php с содержимым
printf("Текущее время: %s<br/>", date('H:i:s', time() ) );
# 3. Создать
docker build . --tag apache
# 4. Запустить контейнер с указанием порта хоста и контейнера
docker run --rm -p 8082:80 apache
# 5. Перейти в браузере по адресу http://localhost:8082
# Вывод будет примерно таким
> Текущее время: 09:02:04
# 6. Найти id контейнера и остановить
docker ps
docker stop %container-id%
6. Команды Docker-Compose
Docker-Compose — это инструмент в составе Docker, который позволяет запускать несколько контейнеров одновременно и маршрутизировать потоки данных между ними. Написан на Python.
При работе в Compose используется конфигурационный файл YAML. Создание и запуск всех служб производится выполнением одной команды.
Для примера поднимем сервер и сделаем редактирование файлов на лету, без ребилда. В конфигурационном файле для Compose укажем 2 сервиса: app и mysql. При этом для сервиса app укажем зависимость (depends_on) от сервиса mysql.
# 0. Создать каталог и перейти в него
mkdir apache2
cd apache2
# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-apache
# указываем рабочий каталог
WORKDIR /var/www/html
# запускаем обновление по и установку wget
RUN apt-get update
# запускаем установку расширений php для работы с бд
RUN docker-php-ext-install pdo pdo_mysql mysqli
EXPOSE 80
# 2. Создать файл index.php с содержимым
# Выводим текущее время,
# а также подключаемся в базе данных и выводим её версию
printf("Текущее время: %s\n", date('H:i:s', time() ) );
$mysqli = new mysqli("mysql", "app", "secret", "db");
if( mysqli_connect_errno() )
{
printf("Не удалось подключиться к mysql: %s<br/>", mysqli_connect_error());
exit();
}
printf("Версия mysql сервера: %d<br/>", $mysqli->server_version);
# 3. Создать файл docker-compose.yml с содержимым
# В примере запускается только два сервиса app и mysql,
# на практике файлы конфигурации, конечно, содержат множество сервисов
# Указываем, что монтируется текущий каталог ОС. Это позволит вносить изменения без перестроения/ребилда.
services:
app:
container_name: php-server
build:
context: .
ports:
- 8082:80
volumes:
- .:/var/www/html
depends_on:
- mysql
mysql:
image: mysql:8
container_name: mysql-server-8
command: --default-authentication-plugin=mysql_native_password
volumes:
- .:/application
restart: "always"
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: db
MYSQL_USER: app
MYSQL_PASSWORD: secret
ports:
- "33099:3306"
# 4. Парсинг конфига YML и создание сервисов
docker-compose build
# 5. Запуск сервисов
docker-compose up
# 6. Перейти в браузере по адресу http://localhost:8082
# При изменении файлов в примонтированном каталоге основной ОС ,
# изменения будут сразу применяться в контейнере
# Вывод будет примерно таким
> Текущее время: 09:33:41
> Версия mysql сервера: 80031
Пример получения образа и запуска контейнера:
# 1. Скачать с Dockerhub.com образ Ubuntu 22.04 docker pull ubuntu:22.04 # 2. Создать контейнер образа ubuntu:22.04, запустить его и выполнить команду echo # после выполнения команды контейнер завершает работу docker run ubuntu:22.04 echo 'hello from ubuntu v.22.04' # 3. Запуск контейнера с выполнением неограниченного количества команд # открыть консоль виртуальной ОС Ubuntu для выполнения команд docker run -it ubuntu:22.04 /bin/bash # 4. Запуск контейнера с монтированием локальной директории C:\Users\username\docker # в запущенной ubuntu будет доступна директория локальной ОС Windows docker run -it -v C:\Users\username\docker\app:/mounted ubuntu:22.04 /bin/bash # 5. Можно добавить флаг --rm # в таком случае контейнер будет удалён после завершения работы docker run -it --rm ubuntu:22.04 /bin/bash # 6. Если открыть новое окно cmd.exe, то команда ps отобразить список запущенных контейнеров docker ps # 7. Выход из контейнера exit
Пример сборки образа с помощью Dockerfile и запуска контейнера:
# 0. Перейти в каталог проекта
cd /Users/username/docker/app
# 1. Создать файл Dockerfile с содержимым
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
CMD php /board.php
# 2. Создать файл board.php с содержимым
$size = $argv[1] ?? 4;
$board = "";
for( $y = 0; $y < $size; $y++)
{
for( $x = 0; $x < $size; $x++ )
{
if( ( $x + $y ) % 2 == 0 )
{
$board .= " ";
} else {
$board .= "#";
}
}
$board .= "\n";
}
echo $board;
# 3. Создание образа с названием kolotun из конфигурационного файла Dockerfile,
# расположенного в текущей директории (.)
docker build . --tag kolotun
# 4. Запуск и удаление после выполнения
docker run --rm kolotun
# 5. Запуск для выполнения команды ls (просмотра списка файлов)
docker run --rm kolotun ls
# 6. Запуск с параметром для скрипта
docker run --rm kolotun php board.php 10
# 7. Альтернативный файл Dockerfile
FROM php:7.4-cli
COPY board.php /board.php
RUN chmod +x /board.php
ENTRYPOINT ["php", "/board.php"]
CMD ["4"]
# 8. Пересобираем образом с новым конфигом
docker build . --tag kolotun
# 9. Запуск с параметром для контейнера
docker run --rm kolotun 10
Комментарии
0Нашли ошибку или хотите дополнить материал?