Сервер: Основные команды Docker
Рассмотрим основные команды для работы 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