Основные команды для Docker
Основные команды для Docker
Docker - Полный курс Docker Для Начинающих [3 ЧАСА]
Информация
docker info - Информация обо всём в установленном Docker
docker history - История образа
docker tag - Дать тег образу локально или в registry
docker login - Залогиниться в registry
docker search - Поиск образа в registry
docker pull - Загрузить образ из Registry себе на хост
docker push - Отправить локальный образ в registry
Управления контейнерами
docker ps -а - Посмотреть все контейнеры
docker start container-name - Запустить контейнер
docker run container-name - создает новый контейнер и сразу включает его. (подробнее отдельно)
docker kill/stop container-name - Убить (SIGKILL) /Остановить (SIGTERM) контейнер
docker logs --tail 100 container-name - Вывести логи контейнера, последние 100 строк
docker inspect container-name - Вся инфа о контейнере + IP
docker rm container-name - Удалить контейнер (поле каждой сборки Dockerfile)
docker rm -f $(docker ps -aq) - Удалить все запущенные и остановленные контейнеры
docker events container-name
docker port container-name - Показать публичный порт контейнера
docker top container-name - Отобразить процессы в контейнере
docker stats container-name - Статистика использования ресурсов в контейнере
docker diff container-name - Изменения в ФС контейнера
Управления образами
docker build -t my_app . - Билд контейнера в текущей папке, Скачивает все слои для запуска образа
docker images / docker image ls - Показать все образы в системе
docker image rm / docker rmi image - Удалить image
docker commit <containerName/ID> lepkov/debian11slim:version3- Создает образ из контейнера
docker insert URL - вставляет файл из URL в контейнер
docker save -o backup.tar - Сохранить образ в backup.tar в STDOUT с тегами, версиями, слоями
docker load - Загрузить образ в .tar в STDIN с тегами, версиями, слоями
docker import - Создать образ из .tar
docker image history --no-trunc - Посмотреть историю слоёв образа
docker system prune -f - Удалит все, кроме используемого (лучше не использовать на проде, ещё кстати из-за старого кеша может собираться cтарая версия контейнера)
Подробнее "docker run"
Синтаксис следующий: docker run [опции] название образа [команды][аргументы].
docker run -d -p 80:80 -p 22:22 debian:11.1-slim sleep infinity (--rm удалит после закрытия контейнера, --restart unless-stopped добавит автозапуск контейнера) - Запуск контейнера интерактивно или как демона/detached (-d), Порты: слева хостовая система, справа в контейнере, пробрасывается сразу 2 порта 80 и 22, используется легкий образ Debian 11 и команда бесконечный сон
docker update --restart unless-stopped redis - добавит к контейнеру правило перезапускаться при закрытии, за исключением команды стоп, автозапуск по-сути
docker exec -it container-name /bin/bash (ash для alpine) - Интерактивно подключиться к контейнеру для управления, exit чтобы выйти
docker attach container-name - Подключиться к контейнеру чтоб мониторить ошибки логи в реалтайме
Управления разделами (Volumes)
docker cp file <containerID>:/ - Скопировать в корень контейнера file
docker cp <containerID>:/file . - Скопировать file из корня контейнера в текущую директорию командной строки
docker volume create todo-db - Создать volume для постоянного хранения файлов
docker run -dp 3000:3000 --name=dev -v todo-db:/etc/todos container-name - Добавить named volumу todo-db к контейнеру (они ok когда мы не заморачиваемся где конкретно хранить данные)
docker run -dp 3000:3000 --name=dev --mount source=todo-db,target=/etc/todos container-name - тоже самое что команда сверху
docker volume ls - Отобразить список всех volume’ов
docker volume inspect - Инспекция volume’ов
docker volume rm - Удалить volume
Управления сетью (Network)
docker network create todo-app - Создать сеть
docker network rm - Удалить сеть
docker network ls - Отразить все сеть
docker network inspect - Вся информация о сети
docker network connect - Соединиться с сетью
docker network disconnect - Отсоединиться от сети
Пример 1: Hello world
Настало время запустить ваш первый контейнер:
Вывод консоли:
docker run
— команда, запускающая контейнер.ubuntu
— образ, который вы запускаете, например, образ
ОС Ubuntu. Когда вы определяете его, Docker начинает поиск на
Docker-хосте. Если образ не существует локально, тогда он будет вытянут
из общественного реестра — Docker Hub./bin/echo 'Hello world'
— команда, которая будет
запущена внутри нового контейнера. Данный контейнер просто выведет
«Hello world» и остановит выполнение.Давайте попробуем создать интерактивную оболочку внутри Docker-контейнера:
-t
— флаг, добавляющий псевдотерминал внутри нового контейнера.-i
— флаг, который позволяет установить интерактивное соединение, взяв стандартный ввод (STDIN) контейнера.-rm
— флаг, автоматически удаляющий контейнер после
завершения процесса. По умолчанию контейнеры не удаляются. Этот
контейнер существует, пока установлена текущая сессия оболочки,
и уничтожается, когда мы покидаем сессию (например, SSH-сессию
с удаленным сервером).Если вы хотите оставить контейнер работающим после завершения сессии, превратите его в демон-процесс:
--name daemon
— устанавливает имя демона для нового
контейнера. Если вы не определите имя, то Docker сгенерирует и присвоит
его автоматически.-d
— флаг запускает контейнер в фоновом режиме (демонизирует его).Давайте взглянем, какие контейнеры у нас есть на текущий момент:
Вывод консоли:docker ps
— команда для вывода списка контейнеров.-a
— флаг, который показывает все контейнеры (без этого флага ps
выведет только работающие контейнеры).Команда ps
показала, что у нас всего два контейнера:
gifted_nobel
(имя для этого контейнера сгенерировано
автоматически, оно будет другим на вашем компьютере) — это первый
контейнер, который мы создали, выводит один раз «Hello world».daemon
— это третий контейнер, который мы создали, работает как фоновый процесс.Замечание: здесь нет второго контейнера (с интерактивной оболочкой), потому что мы установили флаг --rm
. Как следствие, этот контейнер автоматически удалился сразу после выполнения.
Давайте проверим логи и посмотрим, что фоновый контейнер делает прямо сейчас:
Вывод консоли:
docker logs
— объединяет логи контейнера.-f
— флаг для слежения за выводом логов (работает так же, как tail -f
).Теперь остановим фоновый контейнер:
Удостоверимся, что контейнер остановился:Вывод консоли:Контейнер остановился. Мы можем запустить его заново:Удостоверимся, что он работает:Вывод консоли:
Теперь остановим его опять и удалим все контейнеры вручную:
Чтобы удалить все контейнеры, мы можем использовать следующую команду:docker rm
— команда для удаления контейнера.-f
— флаг для rm
, который останавливает контейнер, если он работает (принудительное удаление).-q
— флаг для ps
, который выводит только ID контейнеров.Пример 2: Nginx
Настало время создать и запустить более полезный контейнер типа Nginx.
Сменим директорию на examples/nginx
:
Вывод консоли:
-p
— преобразование портов HOST PORT:CONTAINER PORT
.-v
— монтирование тома HOST DIRECTORY:CONTAINER DIRECTORY
.Важно: команда run
принимает только абсолютные пути. В нашем примере мы использовали $(pwd)
, чтобы установить абсолютный путь текущей директории.
Теперь вы можете открыть localhost в вашем браузере.
Или можно изменить /example/nginx/index.html
(который смонтирован как том в /usr/share/nginx/html
внутри контейнера) и обновить страницу.
Получим информацию о контейнере test-nginx
:
Пример 3: написание Dockerfile
Чтобы создать Docker-образ, вам необходимо создать Dockerfile. Это просто текстовый файл с инструкциями и аргументами. Вот описание инструкций, которые мы будем использовать в нашем следующем примере:
FROM
— устанавливает базовый образ.RUN
— выполняет команду в контейнере.ENV
— устанавливает переменную окружения.WORKDIR
— устанавливает рабочую директорию.VOLUME
— создает точку монтирования для тома.CMD
— устанавливает исполняемый файл для контейнера.Вы можете просмотреть справку по Dockerfile, чтобы узнать больше подробностей.
Теперь создадим образ, который будет получать содержимое сайта с помощью curl
и записывать его в текстовый файл. Нам надо передать URL сайта через переменную окружения SITE_URL
. Результирующий файл будет помещен в директорию, смонтированную в качестве тома:
Перейдем в examples/curl
и выполним следующую команду для создания образа:
Вывод консоли:
docker bulid
— создает новый локальный образ.-t
— устанавливает именную метку для образа.Теперь у нас есть новый образ, и мы можем посмотреть список существующих:
Вывод консоли:Мы можем создать и запустить контейнер из образа. Попробуем сделать это со стандартными параметрами:Чтобы увидеть результаты, сохраненные в файле, выполним команду:Попробуем с facebook.com:И снова посмотрим результаты:Пример 4: связь контейнеров Python + Redis
Docker compose — единственный правильный способ соединять контейнеры друг с другом. В этом примере мы соединим контейнеры Python и Redis:
Перейдем вexamples/compose
и выполним следующую команду:Вывод консоли:
Данный пример увеличит счетчик просмотров в Redis. Откройте localhost в браузере и проверьте.
Теперь вы можете поиграться с различными образами из Docker Hub или,
если хотите, создать свои собственные образы, соблюдая лучшие
практики, описанные ниже. Единственное, что можно добавить
насчет использования docker-compose: всегда давайте точные имена вашим
томам в docker-compose.yml
(если в образе есть тома). Это простое правило спасет вас от проблем при проверке ваших томов.
В этому случае redis_data
будет именем внутри docker-compose.yml
, для настоящего имени тома будет добавлен префикс с именем проекта.
Чтобы просмотреть список томов:
Вывод консоли:
Без точного имени тома там будет находиться UUID. Вот пример с локального компьютера:
Концепция Docker
У Docker есть некоторые ограничения и требования, которые зависят от архитектуры системы (приложений, которые вы упаковываете в контейнеры). Можно игнорировать эти требования или найти какие-нибудь пути обхода, но в этом случае вы не получите все преимущества использования Docker. Настоятельно рекомендуется следовать следующим советам:
- 1 приложение = 1 контейнер.
- Запускайте процесс на переднем плане (не используйте systemd, upstart или другие похожие инструменты).
- Для хранения данных вне контейнера используйте тома.
- Не иcпользуйте SSH (если вам надо залезть внутрь контейнера, используйте
docker exec
). - Избегайте ручных настроек или действий внутри контейнера.
- Включайте только необходимый контекст — используйте
.dockerignore
файл (как.gitignore
в git). - Избегайте установки ненужных пакетов — это займет лишнее дисковое пространство.
- Используйте кэш. Добавьте контекст, который часто меняется, например, исходный код вашего проекта, в конец Dockerfile — кэш Docker будет использоваться более эффективно.
- Будьте осторожны с томами. Вы должны помнить, какие данные находятся в томах. Поскольку тома постоянны и не исчезают вместе с контейнерами, следующий контейнер будет использовать данные, которые были созданы предыдущим контейнером.
- Используйте переменные окружения:
RUN, EXPOSE, VOLUME
. Это сделает ваш Dockerfile более гибким.