Только самые важные команды и как их легко запомнить. В этой статье мы рассморим только использоваение готовых образов. Как создать свои образы я рассказываю в другой статье.
Если вы совсем не знакомы с docker, почитайте эту мою статью.
Запуск
Обратите внимание, что ключи где больше одной буквы, и это слова (name, network, expose) указываются через 2 тире (без пробелов). Но не стоит путать с объединением однобуквенных ключей (просто для удобства), например -i и -t часто объединяют как -it (это не слово “it”). Также у каждого короткого ключа есть длинный аналог (в виде слова), но я редко использую полные слова если есть однобуквенный вариант (просто так быстрее)
docker run ключи образ
Ключ | Что делает | Как запомнить |
---|---|---|
-it | интерактивно | Interactive Terminal (терминал) |
– – rm | удалить при выходе | Remove (удалить) |
– – name имя_контейнера | задать имя | Name (имя) |
-p снаружи:внутри | пробросить порты | Port (порт) |
-v снаружи:внутри | примонтировать папку | Volume (“объем”, т.е. папка на диске) |
-d | запустить в фоне (открепить от терминала) | Detache (открепить) |
-e переменная-значение | задать значение системной переменной | Environment (окружение) |
–network имя | для соединения контейнеров в разные сети | Network |
-w каталог | выбор рабочего каталога внутри контейнера | Workdir |
– – expose порт | открыть порт(ы) внутри контейнера | Expose (экспозиция, выставлять на обозрение) |
Тут важно запомнить что:
- 1) без -it будет невозможно взаимодействовать с контейнером через терминал
- 2) без -p служба в контейнере не будет доступна вне контейнера (http, database и так далее)
- 3) без -v в контейнер невозможно будет передать ваши файлы
- 4) без -e приложение внутри контейнера будет иметь настройки по-умолчанию
- 5) без -d контейнер займет терминал и будет писать в него логи, и вы больше ничего не сможете ввести. А стандартный запуск в фоне через & не будет работать как нужно. Это особенно неудобно если работать с docker на сервере через ssh
- 6) без – – rm придется удалять после работы ненужный контейнер (хотя, образы при – – rm останутся и их все равно нужно будет удалять через docker image rm)
Вообще у команды run очень много ключей, восновном для настройки выделяемых ресурсов. Но в простейшем случае их можно не указывать и система сама выберет нужные значения. Важно ограничивать ресуры для продуктовой среде, но там чаще используется docker-compose или если это kubernetes то команда kubectl run (немного отличается формат и там мы дело имеем с группами контейнеров – подами, условно говоря “суперконтейнер” для запуска в нем контейнеров, но об этом в следующий раз).
Список
Ключ -a (all) – показать все
Контейнеров
docker ps -a
У контейнеров есть имя (- – name при запуске) и ID (генерируется автоматически). Везде где требуется указать контейнер, можно указыват или имя или ID.
Как запомнить ps: как команду ps linux (Procrocess), но в качестве “процессо” получим список контейнеров.
Образов
docker image ls -a
У образа кроме ID есть TAG – это версия (latest-последняя). Repository – имя образа.
Удаление
Запущенные сначала остановить или указать ключ принудительного удаления -f
Контейнеров
docker rm контейнер -f
Образов
По имени:
docker image rm имя
Всех не используемых в контейнерах:
docker image prune -a
Ключ -a лучше использовать. Дело в том, что prune удаляет только так называемые dangling образы (образы с пустыми TAG или REPOSITORY, можно увидеть если вывести их с помощью docker image ls). Но такими они не становятся после удаления. А docker image prune -a удаляет все образы, не используемые в контейнерах (но не удаляет в остановленных!)
Логи
docker logs ключи контейнер
Ключ | Что делает | Как запомнить |
---|---|---|
-f | продолжать выводить лог после выведения всего лога | Follow (следовать за) |
– – tail (или -n) число_строк | вывести последние число_строк | Tail (хвост), -n сложнее запомнить (не так очевидно) |
– – since “время” – – until “время” | показывать начиная с (since) или до (until) времени. Время может быть в формате ISO по UTC (“YYYY-MM-DDTHH:MM:SSZ”) или в относительном формате “10m” (10 минут). Время всегда в виде строки. | Since (“Since I’ve been looving You” Led Zeppelin) Until (“Until it sleeps” Metallica) |
-l “уровень” | “debug”, “info”, “warn”, “error”, “fatal” | Level |
Подключение к работающему контейнеру
docker attach контейнер
Если контейнер внутри выводит логи в stdout (например nginx), то увидим логи и ничего не сможем вводить. Для подключения к командной оболочке (bash, sh) нужно выполнить не attach, а exec.
Еслы вы обратили внимание, attach я не включил в cheat sheet. Это потому что docker attach всегда можно заменить docker exec и docker logs. И она менее удобная чем exec и logs. Лично я ей не пользуюсь.
docker exec -it контейнер bash
docker exec logs контейнер
Выполнение команды внутри контейнера
docker exec контейнер команда
Команда – имеется в виду любая команда командной оболочки (cat, ls, cp) или программа, которая установлена в контейнере (curl, nmap).
Если нужна сама командная оболочка (bash, sh, zsh) указывают ее (в отличии от attach можно будет вводить команды, но не забудте указать ключ -it)
docker exec -it контейнер bash
Иногда необходимо ввести полный путь /bin/bash
Оболочка sh немного быстрее, но в ней нет истории.
Сохранение изменений в контейнере (локально)
docker commit контейнер образ:тэг
Перед сохранением контейнер необходимо остановить
docker stop контейнер
Образ сохраняется не в файл, а в кэш имиджей на вашем диске. Чтобы сохранить в файл:
docker save -o файл.tar образ:тэг
А загрузить (тоже в кэш, напрямую в контейнер не полусчится)
docker load --input файл.tar
И теперь он появится в кэше
docker image ls
И только теперь можно создавать контейнер из этого образа
docker run .... образ
Остановка/запуск/пауза/снятие с паузы остановленного контейнера
Иногда контейнер может внезапно остановится. Увидеть его можно через docker ps -a
В зависимости от состояния (STATUS)
STATUS | Возможное действие | Замечания |
---|---|---|
Created | start, remove | remove -f можно с любым |
Running | stop, restart, pause, kill, exec | stop-спокойно, kill-жестко |
Paused | unpause, stop, kill | |
Exited | start, restart, remove | чаще всего внезапно выпадает |
Restarting | ничего |
docker start контейнер
docker stop контейнер
docker pause контейнер
docker unpause контейнер
docker restart контейнер
Встроенная справка
Вообще, справка по docker очень удобная: выполняем docker без параметров – получаете список команд, выполняем:
docker команда --help
и получаем формат команды и ее параметры.
Обратите внимание, что если ключ – слово (а не буква), то ставится два тире.
Также обратите внимание, что на верхнем уровне команды “docker команда” (один уровень команды – docker и сразу действие) он работает с контейнерами, а с имиджами работает через “docker image команда” (второй уровень команды). Это связано с тем, что восновном работают с контейнерами, а образы только удаляют. И то только тогда, когда необходимо почистить систему.
Список полезных образов
Образ | Назначение | Переменные окружения | Точки монтирования | Порт |
---|---|---|---|---|
nginx | web-cервер, reverse-proxy, balancer | NGINX_HOST: Задает имя хоста. NGINX_PORT: Задает порт, на котором будет работать сервер. | /etc/nginx/conf.d: Для пользовательских конфигурационных файлов. /usr/share/nginx/html: Для статических файлов веб-сайта. | 80 |
httpd | apache web-server | HTTPD_PREFIX: Указывает путь установки Apache. HTTPD_LOG_DIR: Задает каталог для лог-файлов. | /usr/local/apache2/conf: Для конфигурационных файлов. /usr/local/apache2/htdocs: Для размещения веб-контента. | 80 |
node | Компиляция и выполнение кода node.js (код лежит у вас, а выполнится в контейнере). Удобно если есть чужой код, а node не установлен | NODE_ENV: Определяет окружение выполнения (например, ‘development’ или ‘production’). NPM_CONFIG_LOGLEVEL: Уровень логирования npm. | /usr/src/app: Рекомендуемая директория для размещения исходного кода приложения. | |
gcc | компиляция и отладка С++ кода, компилятор GNU | CFLAGS: Флаги для компиляции C-кода. CXXFLAGS: Флаги для компиляции C++-кода. | /usr/src/myapp: Директория для исходного кода, которую можно монтировать для компиляции. | |
golang | компиляция на Golang | GOPATH: Определяет рабочее пространство Go. GOROOT: Указывает на установку Go. | /go/src/app: Рекомендуемая директория для исходного кода Go-приложения. | |
kalilinux/kali-rolling | pentesting утилиты | KALI_USER: Имя пользователя по умолчанию. KALI_PASSWORD: Пароль пользователя по умолчанию. | /root/shared: Директория для обмена файлами между хостом и контейнером | |
metasploitframework/metasploit-framework | очень мощная пентеcтерская утилита. На мой взгляд входит в 10-ку самых важных утилит | MSF_DATABASE: Тип используемой базы данных (например, ‘postgres’). MSF_USERNAME и MSF_PASSWORD: Учетные данные для доступа к базе данных. | /metasploit-framework: Директория с конфигурационными файлами и модулями. | |
ctfd/ctfd | тренировочная платформа для пентестеров, не пробовал, но очень хвалят. Попробую, обязательно расскажу | CTFD_SECRET_KEY: Секретный ключ для сессий. DATABASE_URL: URL для подключения к базе данных. | /var/ctfd: Директория | |
raesene/bwapp | buggy web application для тренировки пентестеров | это реализация части проекта http://www.itsecgames.com/ | 80 | |
bkimminich/juice-shop | еще один тренировочный сайт со множественными уязвимостями | это часть проекта https://github.com/OWASP/vulnerable-container-hub.git | 3000 | |
tensorflow/tensorflow | Python AI/ML/DL (Google) | tensorflow/tensorflow:latest-gpu и ключ --runtime=nvidia запустит режим GPU | ||
pytorch/pytorch | Python AI/ML/DL (Facebook) | PYTORCH_VERSION: Указывает версию PyTorch. CUDA_VERSION: Версия CUDA, если используется GPU. | /workspace: Директория для проектов и данных. |
Это только малая часть интересных образов. Про работу с каждым из них я напишу отдельно.
В первой колонке находится название образа, прямо его ипользуйте в run, а ссылка ведет на страницу образа на Docker Hub, где можно почитать подробности и посмотреть версии.
Версия указывается через двоеточие после имени образа, например node:22, node:18-alpine3.20, node:latest. Если нужна самая последняя версия, указывают latest (самая последняя), или можно вообще ничего не указывать.
Как пользоваться разными видами образов
Компиляторы
Для компиляторов командная строка выглядит приблизительно так:
docker --rm -v папка_локальная:раб_папка_контейнера -w раб_папка_контейнера образ команда_компилятора аргументы_компилятора
В локальной папке должны лежать исходные файлы. В результате получим в той же папке скомпилированный файл. -w указывает рабочий каталог внути контейнера (к нему же нужно примонтировать локальный каталог ключом -v)
Утилиты и наборы утилит
Утилиты просто запускаются в интерактивном режиме, если необходимо монтируются каталоги и пробрасываются порты, указываются переменные окружения
docker -it -е переменная=значение -v откуда:куда образ
Иногда утилите может потребоваться принимать входящие подключения, тогда необходимо пробросить порты, также может понадобится открыть порты внутри контейнера ключом –expose
Python
Можно запустить как утилиты, а можно запустить командную оболочку
docker -it образ bash
Данный cheatsheet призван не дать вам исчерпывающую справку по docker (она есть встроенная в docker и очень удобная), а сделать команды запоминаующимися и логичными, так чтобы вы их вводили не заглядывая в help.