Параметры команды Docker Run

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом лабораторном занятии мы сосредоточимся исключительно на команде docker run и ее различных параметрах. Команда docker run является фундаментальной для операций с Docker, позволяя нам создавать и запускать контейнеры с определенными настройками.

Познав параметры этой команды, вы получите больше контроля над своими контейнеризованными приложениями, улучшив свою способность эффективно развертывать и управлять контейнерами Docker.

Мы рассмотрим широкий спектр параметров, включая параметры для именования, режима запуска в фоновом режиме (detached mode), маппинга портов, монтирования томов, задания переменных окружения, ограничения ресурсов и многое другое.

Некоторые из этих параметров могут быть вам уже знакомы, а другие могут оказаться новыми.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-389228{{"Параметры команды Docker Run"}} docker/ls -.-> lab-389228{{"Параметры команды Docker Run"}} docker/exec -.-> lab-389228{{"Параметры команды Docker Run"}} docker/inspect -.-> lab-389228{{"Параметры команды Docker Run"}} docker/port -.-> lab-389228{{"Параметры команды Docker Run"}} docker/volume -.-> lab-389228{{"Параметры команды Docker Run"}} docker/network -.-> lab-389228{{"Параметры команды Docker Run"}} end

Базовый запуск Docker и именование контейнеров

Начнем с основ команды docker run и узнаем, как именовать наши контейнеры.

Сначала запустим базовый контейнер Nginx:

docker run nginx

Эта команда запускает контейнер Nginx в переднем плане. В терминале вы увидите поток логов. Это происходит потому, что контейнер запущен в переднем плане, и он показывает логи напрямую.

Чтобы остановить этот контейнер, нажмите Ctrl+C. Может показаться, что остановка занимает несколько секунд - это нормально, так как Docker дает контейнеру время для корректного завершения работы.

Теперь запустим его в фоновом режиме (detached mode) и дадим ему имя:

docker run -d --name my-nginx nginx

Разберем эту команду по частям:

  • docker run: Это базовая команда для запуска контейнера.
  • -d: Этот параметр запускает контейнер в фоновом режиме (detached mode), то есть он работает в фоне. В терминале вы не увидите никакого вывода.
  • --name my-nginx: Этот параметр присваивает контейнеру имя "my-nginx". Если вы не укажете имя, Docker назначит случайное имя.
  • nginx: Это имя образа, который мы используем для создания контейнера.

После выполнения этой команды вы увидите длинную строку символов. Это идентификатор контейнера (container ID). Docker запустил контейнер в фоне.

Если вы столкнетесь с ошибкой, говорящей, что имя уже используется, это означает, что у вас уже есть контейнер с таким именем. Вы можете либо выбрать другое имя, либо удалить существующий контейнер (мы узнаем, как сделать это в последующих лабораторных занятиях).

Маппинг портов

Параметр -p в команде docker run позволяет нам отобразить порты из контейнера на хост. Это очень важно для доступа к службам, запущенным внутри контейнера, с вашего хост-компьютера.

Запустите контейнер Nginx с маппингом портов:

docker run -d --name nginx-mapped -p 8080:80 nginx

Разберем новые части этой команды:

  • -p 8080:80: Это отображает порт 8080 на вашем хосте на порт 80 в контейнере. Формат всегда host_port:container_port.

По умолчанию Nginx работает на порту 80 внутри контейнера. Отобразив его на порт 8080 на нашем хосте, мы можем получить доступ к нему, перейдя по адресу localhost:8080 в веб-браузере.

Теперь проверим, что страница приветствия Nginx доступна. Мы будем использовать команду curl, которая позволяет делать HTTP-запросы из командной строки:

curl http://localhost:8080

Вы должны увидеть HTML-содержимое страницы приветствия Nginx. Если curl не установлен, вы можете установить его с помощью следующей команды:

sudo apt-get update && sudo apt-get install -y curl

Если вы по-прежнему не можете получить доступ к странице, проверьте следующее:

  1. Убедитесь, что контейнер запущен: docker ps | grep nginx-mapped
  2. Проверьте, действительно ли порт отображен: docker port nginx-mapped
  3. Если вы используете облачный сервер, убедитесь, что брандмауэр разрешает трафик на порту 8080.

Монтирование томов

Параметр -v в команде docker run позволяет нам монтировать тома, делясь данными между хостом и контейнером. Это чрезвычайно полезно для сохранения данных или для предоставления файлов конфигурации контейнеру.

Начнем с создания простой структуры каталогов на нашем хосте:

mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html

Эти команды выполняют следующие действия:

  1. Создают новый каталог nginx-data внутри папки project в вашем домашнем каталоге.
  2. Создают простой HTML-файл с именем index.html внутри этого нового каталога.

Теперь запустим контейнер Nginx и смонтируем этот каталог:

docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx

Разберем эту команду по частям:

  • docker run: Это команда для запуска нового контейнера.
  • -d: Это запускает контейнер в фоновом режиме (detached mode).
  • --name nginx-volume: Это присваивает нашему контейнеру имя "nginx-volume".
  • -p 8081:80: Это отображает порт 8081 на хосте на порт 80 в контейнере.
  • -v ~/project/nginx-data:/usr/share/nginx/html: Это монтирует каталог nginx-data с нашего хоста в каталог /usr/share/nginx/html в контейнере. Именно здесь Nginx ищет контент для обслуживания.
  • nginx: Это имя образа, который мы используем для создания контейнера.

Теперь проверим, что наша кастомная страница обслуживается:

curl http://localhost:8081

Вы должны увидеть содержимое вашего кастомного HTML-файла: "Hello from mounted volume!"

Если вы не видите свое кастомное содержимое, проверьте следующее:

  1. Убедитесь, что файл ~/project/nginx-data/index.html существует на вашей хост-системе.
  2. Проверьте, что контейнер запущен: docker ps | grep nginx-volume
  3. Проверьте логи Nginx на наличие ошибок: docker logs nginx-volume

Этот метод монтирования каталога хоста в контейнер называется бинд-монтированием (bind mount). Это простой способ делиться файлами между хостом и контейнером. Вот несколько важных моментов, которые стоит запомнить:

  1. Путь к каталогу на хосте должен быть абсолютным.
  2. Если каталог на хосте не существует, Docker создаст его автоматически.
  3. Любые изменения, сделанные в файлах этого каталога (как на хосте, так и в контейнере), будут сразу видны как для хоста, так и для контейнера.
  4. Будьте осторожны с правами доступа: по умолчанию контейнер запускается от имени root, что может привести к созданию файлов, которые ваш хост-юзер не сможет изменить.

Используя этот метод, мы избавляемся от ошибки "not a directory", так как мы монтируем каталог, а не отдельный файл. Этот подход дает вам больше гибкости для добавления, удаления или изменения файлов без необходимости пересоздавать контейнер.

Переменные окружения

Параметр -e в команде docker run позволяет нам задавать переменные окружения в контейнере. Это полезно для настройки приложения, запущенного в контейнере, без изменения его кода.

Запустите контейнер с переменными окружения:

docker run -d --name nginx-env -e NGINX_HOST=mywebsite.com -e NGINX_PORT=80 nginx

Разберем новые части команды:

  • -e NGINX_HOST=mywebsite.com: Это устанавливает переменную окружения с именем NGINX_HOST и значением mywebsite.com.
  • -e NGINX_PORT=80: Это устанавливает еще одну переменную окружения NGINX_PORT со значением 80.

Переменные окружения представляют собой пару "ключ-значение", к которой могут обращаться процессы, запущенные внутри контейнера. Многие образы Docker разработаны с учетом использования определенных переменных окружения для настройки.

Вы можете проверить переменные окружения:

docker exec nginx-env env | grep NGINX_

Эта команда выполняет следующие действия:

  • docker exec nginx-env: Это сообщает Docker выполнить команду в запущенном контейнере nginx-env.
  • env: Эта команда выводит все переменные окружения.
  • | grep NGINX_: Это фильтрует вывод, чтобы показать только строки, содержащие "NGINX_".

Вы должны увидеть свои две переменные окружения в списке.

Если вы не видите переменные окружения, проверьте:

  1. Запущен ли контейнер? Проверьте с помощью docker ps | grep nginx-env
  2. Правильно ли вы написали имена переменных окружения в команде docker run?

Ограничения ресурсов

Docker позволяет устанавливать ограничения на использование ресурсов контейнерами с помощью различных параметров в команде docker run. Это очень важно для управления производительностью и стабильностью вашей хост-системы, особенно при запуске нескольких контейнеров.

Запустите контейнер с ограничениями по памяти и CPU:

docker run -d --name nginx-limited --memory 256m --cpus 0.5 nginx

Разберем новые части команды:

  • --memory 256m: Это ограничивает контейнер в использовании памяти до 256 мегабайт. Символ 'm' обозначает мегабайты. Также можно использовать 'g' для гигабайт.
  • --cpus 0.5: Это ограничивает контейнер в использовании не более половины ядра CPU.

Эти ограничения не позволяют контейнеру использовать больше ресурсов, чем указано, что помогает избежать ситуации, когда один контейнер монополизирует ресурсы хоста.

Вы можете проверить, были ли эти ограничения применены правильно:

docker inspect -f '{{.HostConfig.Memory}}' nginx-limited
docker inspect -f '{{.HostConfig.NanoCpus}}' nginx-limited

Первая команда должна вывести 268435456 (256 МБ в байтах), а вторая - 500000000 (0.5 CPU в нанодиапазоне).

Если вы видите другие значения, перепроверьте команду docker run, чтобы убедиться, что вы правильно указали ограничения.

Примечание: Установка слишком низких ограничений на ресурсы может привести к низкой производительности контейнера или даже к его сбою. Если у вас возникают проблемы с контейнером, попробуйте увеличить эти ограничения.

Настройки сети

Параметр --network в команде docker run позволяет подключить контейнер к сети. Это полезно для взаимодействия между контейнерами и для изоляции групп контейнеров.

Сначала создайте пользовательскую мостовую сеть (bridge network):

docker network create my-custom-network

Эта команда создает новую мостовую сеть с именем my-custom-network. Мостовые сети - это самый распространенный тип сети в Docker.

Теперь запустите контейнер, подключенный к этой сети:

docker run -d --name nginx-networked --network my-custom-network nginx

Опция --network my-custom-network подключает контейнер к сети, которую мы только что создали.

Контейнеры в одной и той же сети могут взаимодействовать друг с другом, используя имена контейнеров в качестве имен хостов (hostnames). Это упрощает связывание служб между собой.

Если вы получаете ошибку, говорящую о том, что сеть не существует, убедитесь, что вы правильно создали сеть с помощью команды docker network create.

Политики перезапуска

Параметр --restart в команде docker run позволяет вам указать политику перезапуска контейнера. Это полезно для того, чтобы убедиться, что ваши контейнеры остаются запущенными, даже если они аварийно завершаются или если демон Docker перезапускается.

Запустите контейнер с политикой перезапуска:

docker run -d --name nginx-restart --restart unless-stopped nginx

Опция --restart unless-stopped устанавливает политику перезапуска как "unless-stopped" (если не остановлен), что означает, что контейнер будет автоматически перезапускаться, если только он явно не был остановлен пользователем.

Другие политики перезапуска включают:

  • no: Значение по умолчанию. Не перезапускать контейнер автоматически.
  • on-failure: Перезапускать только в случае, если контейнер завершает работу с ненулевым статусом выхода.
  • always: Всегда перезапускать контейнер, независимо от статуса выхода.

Вы можете проверить политику перезапуска:

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx-restart

Должно быть выведено unless-stopped.

Если вы не видите ожидаемый вывод, перепроверьте команду docker run, чтобы убедиться, что вы правильно указали политику перезапуска.

Рабочая директория и команда

На этом шаге мы рассмотрим, как установить рабочую директорию внутри контейнера и запускать пользовательские команды при старте контейнера.

Параметр -w в команде docker run устанавливает рабочую директорию внутри контейнера, и вы можете указать команду для выполнения после имени образа.

Объединим эти концепции:

docker run -d --name nginx-custom -w /app nginx sh -c "touch newfile.txt && nginx -g 'daemon off;'"

Разберем эту команду:

  • -d: Запустить контейнер в отсоединенном режиме (в фоновом режиме).
  • --name nginx-custom: Назвать контейнер "nginx-custom".
  • -w /app: Установить рабочую директорию внутри контейнера на /app.
  • nginx: Имя образа, который нужно использовать.
  • sh -c "...": Выполнить команду в оболочке.
    • touch newfile.txt: Создать пустой файл с именем newfile.txt.
    • &&: Выполнить следующую команду, если предыдущая завершилась успешно.
    • nginx -g 'daemon off;': Запустить Nginx в переднем плане, чтобы контейнер оставался запущенным.

Теперь проверим, что контейнер запущен и файл был создан:

docker ps | grep nginx-custom
docker exec nginx-custom ls -l /app/newfile.txt

Первая команда должна показать, что контейнер запущен, а вторая должна вывести подробности о файле newfile.txt в директории /app контейнера.

Резюме

В этом практическом занятии (lab) мы глубоко изучили команду docker run, рассмотрев ее различные параметры и опции. Мы охватили следующие аспекты:

  1. Базовый запуск и именование контейнеров
  2. Отображение портов для доступа к службам контейнера с хоста
  3. Монтирование томов (volumes) для обмена данными между хостом и контейнером
  4. Установка переменных окружения для настройки контейнера
  5. Применение ограничений на ресурсы для ограничения использования ресурсов контейнером
  6. Настройки сети для взаимодействия между контейнерами
  7. Политики перезапуска для обеспечения надежности контейнеров
  8. Указание рабочей директории и команды для запуска контейнера

Эти параметры команды docker run предоставляют мощные инструменты для настройки и управления вашими Docker-контейнерами. Освоив эти опции, вы сможете создавать более сложные и адаптированные к вашим потребностям развертывания контейнеров. Вы можете контролировать, как контейнеры взаимодействуют с хост-системой, какие ресурсы они могут использовать и как они ведут себя в различных сценариях.