
Docker — это платформа, которая позволяет разрабатывать, тестировать и развертывать приложения в виде портативных, самодостаточных контейнеров, которые работают практически где угодно.
Команда docker run создаёт контейнер из заданного образа и запускает его с помощью заданной команды. Это одна из первых команд, с которыми следует ознакомиться при начале работы с Docker.
В этой статье мы будем использовать официальный образ Nginx, чтобы продемонстрировать различные способы запуска контейнера Docker.
команды запуска Docker
Команда docker run имеет следующий вид:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Имя образа, из которого должен быть создан контейнер, — единственный обязательный аргумент команды docker run . Если образ отсутствует в локальной системе, он извлекается из реестра.
Если команда не указана, то при запуске контейнера выполняется команда, указанная в инструкциях CMD или ENTRYPOINT Dockerfile.
Начиная с версии 1.13, интерфейс командной строки Docker был реструктурирован. Все команды сгруппированы по объектам, с которыми они взаимодействуют.
Поскольку команда run взаимодействует с контейнерами, она является подкомандой docker container . Синтаксис новой команды следующий:
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
Старый синтаксис, предшествовавший версии 1.13, по-прежнему поддерживается. По сути, команда docker run является псевдонимом команды docker container run . Пользователям рекомендуется использовать новый синтаксис команды.
Список всех вариантов docker container run можно найти на странице документации Docker .
Запустить контейнер на переднем плане
По умолчанию, если команда docker run не указана, корневой процесс запускается в приоритетном режиме. Это означает, что стандартный ввод, вывод и ошибки корневого процесса подключаются к терминальному сеансу.
docker container run nginx
Вывод процесса nginx будет отображаться на вашем терминале. Поскольку подключений к веб-серверу нет, терминал пуст.
Чтобы остановить контейнер, завершите запущенный процесс Nginx, нажав CTRL+C .
Запустить контейнер в отсоединенном режиме
Чтобы контейнер продолжал работать после выхода из сеанса терминала, запустите его в отсоединённом режиме. Это похоже на запуск процесса Linux в фоновом режиме .
Используйте опцию -d для запуска отсоединенного контейнера:
docker container run -d nginx
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa
Отсоединенный контейнер остановится после завершения корневого процесса.
Вы можете получить список запущенных контейнеров с помощью команды docker container ls .
Чтобы присоединить терминал к корневому процессу отсоединенного контейнера, используйте команду docker container attach .
Удалите контейнер после выхода
По умолчанию при завершении работы контейнера его файловая система сохраняется в хост-системе.
Параметры --rm сообщают команде docker run о необходимости автоматического удаления контейнера при его выходе:
docker container run --rm nginx
Образ Nginx может быть не лучшим примером очистки файловой системы контейнера после его завершения. Этот вариант обычно используется для активных контейнеров, выполняющих краткосрочные задачи, такие как тестирование или резервное копирование баз данных.
Задайте имя контейнера
В Docker каждый контейнер идентифицируется по своему UUID и имени. По умолчанию, если не указано иное, имя контейнера автоматически генерируется демоном Docker.
Используйте опцию --name , чтобы назначить контейнеру произвольное имя:
docker container run -d --name my_nginx nginx
Имя контейнера должно быть уникальным. При попытке запустить другой контейнер с таким же именем возникнет ошибка, подобная этой:
docker: Error response from daemon: Conflict. The container name "/my_nginx" is already in use by container "9...c". You have to remove (or rename) that container to be able to reuse that name.
Выполните команду docker container ls -a чтобы вывести список всех контейнеров и увидеть их имена:
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9d695c1f5ef4 nginx "nginx -g 'daemon of…" 36 seconds ago Up 35 seconds 80/tcp my_nginx
Осмысленные имена полезны для ссылки на контейнер в сети Docker или при запуске команд CLI Docker.
Публикация контейнерных портов
По умолчанию, если ни один порт не опубликован, процесс, запущенный в контейнере, доступен только изнутри контейнера.
Публикация портов означает сопоставление портов контейнера с портами хост-машины, чтобы порты были доступны службам за пределами Docker.
Чтобы опубликовать порт, используйте параметры -p следующим образом:
-p host_ip:host_port:container_port/protocol
- Если
host_ipне указан, по умолчанию используется0.0.0.0. - Если
protocolне указан, по умолчанию используется TCP. - Чтобы опубликовать несколько портов, используйте несколько опций
-p.
Чтобы сопоставить TCP-порт 80 (nginx) в контейнере с портом 8080 на локальном интерфейсе хоста, выполните:
docker container run --name web_server -d -p 8080:80 nginx
Вы можете проверить, что порт опубликован, открыв http://localhost:8080 в браузере или выполнив следующую команду curl на хосте Docker:
curl -I http://localhost:8080
Вывод будет выглядеть примерно так:
HTTP/1.1 200 OK Server: nginx/1.17.6 Date: Tue, 26 Nov 2019 22:55:59 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 19 Nov 2019 12:50:08 GMT Connection: keep-alive ETag: "5dd3e500-264" Accept-Ranges: bytes
Обмен данными (монтирование томов)
При остановке контейнера все данные, сгенерированные им, удаляются. Docker Volumes — предпочтительный способ сохранения данных и их совместного использования несколькими контейнерами.
Для создания и управления томами используйте параметры -p следующим образом:
-v host_src:container_dest:options
-
host_srcможет быть абсолютным путем к файлу или каталогу на хосте или именованному тому. -
container_dest— это абсолютный путь к файлу или каталогу в контейнере. - Возможные варианты:
rw(чтение и запись) иro(только чтение). Если параметр не указан, по умолчанию используетсяrw.
Чтобы объяснить, как это работает, давайте создадим каталог на хосте и поместим в него файл index.html :
mkdir public_htmlecho "Testing Docker Volumes" > public_html/index.html
Затем смонтируйте каталог public_html в /usr/share/nginx/html в контейнере:
docker run --name web_server -d -p 8080:80 -v $(pwd)/public_html:/usr/share/nginx/html nginx
Вместо указания абсолютного пути к каталогу public_html мы используем команду $(pwd) , которая выводит текущий рабочий каталог .
Теперь, если вы введете http://localhost:8080 в браузере, вы увидите содержимое файла index.html . Вы также можете использовать curl :
curl http://localhost:8080
Testing Docker Volumes
Запустите контейнер в интерактивном режиме
При работе с интерактивными процессами, такими как bash , используйте параметры -i и -t для запуска контейнера.
Опция -it указывает Docker оставить стандартный ввод подключенным к терминалу и выделить псевдо-tty:
docker container run -it nginx /bin/bash
Оболочка Bash контейнера будет подключена к терминалу, и командная строка изменится:
root@1da70f1937f5:/#
Теперь вы можете взаимодействовать с оболочкой контейнера и выполнять любую команду внутри нее.
В этом примере мы предоставили команду ( /bin/bash ) в качестве аргумента команды docker run , которая была выполнена вместо указанной в Dockerfile.
Заключение
Docker — это стандарт для упаковки и развертывания приложений, а также важнейший компонент CI/CD, автоматизации и DevOps.
Команда docker container run используется для создания и запуска контейнеров Docker.
Если у вас есть вопросы, пожалуйста, оставьте комментарий ниже.
Связанные руководства
- Как установить и использовать Docker Compose в Debian 10 Linux
- Как составить список контейнеров в Docker
- Как подключиться к Docker-контейнеру
- Как установить и использовать Docker в Debian 10 Linux
- Как установить и использовать Docker на Raspberry Pi
- Как создавать образы Docker с помощью Dockerfile
- Как установить Docker Compose в Ubuntu 20.04