Введение
Docker — это платформа, позволяющая разрабатывать, тестировать и развертывать приложения в виде переносимых автономных контейнеров, которые работают практически в любом месте.
Команда docker run
создает контейнер из заданного образа и запускает контейнер с помощью заданной команды. Это одна из первых команд, с которой вы должны ознакомиться, приступая к работе с Docker.
В этой статье мы будем использовать официальный образ Nginx, чтобы показать различные способы запуска контейнера Docker.
Команда запуска докера
Команда docker run
имеет следующий синтаксис:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Имя образа, из которого должен быть создан контейнер, является единственным аргументом, требуемым для команды docker run
. Если образ отсутствует в локальной системе, он извлекается из реестра.
Если команда не указана, команда, указанная в операторах CMD
Dockerfiles или ENTRYPOINT
, выполняется во время работы контейнера.
Начиная с версии 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.
Запустите контейнер на переднем плане
По умолчанию, когда команда docker run
не указана, корневой процесс запускается на переднем плане. Это означает, что ввод, вывод и стандартная ошибка корневого процесса связаны с сеансом терминала.
docker container run nginx
Вывод процесса nginx будет отображаться на вашем терминале. Поскольку подключения к веб-серверу нет, терминал пуст.
Чтобы остановить контейнер, завершите работающий процесс Nginx, нажав CTRL+C
Запустите контейнер в автономном режиме
Чтобы контейнер продолжал работать после выхода из сеанса терминала, запустите его в автономном режиме. Это похоже на запуск процесса Linux в фоновом режиме.
Используйте параметр -d
для запуска удаленного контейнера:
docker container run -d nginx
Выходное сообщение должно выглядеть так:
121f93h9139d4b091nds4908nd47190284n71093d7n419dn7903124n7d19023a
Отключенный контейнер будет закрыт после завершения корневого процесса.
Вы можете получить список запущенных контейнеров с помощью команды docker container ls
.
Чтобы подключить терминал к основному процессу отсоединенного контейнера, используйте команду docker container attach
.
Удалить контейнер After Exit
По умолчанию, когда контейнер закрывается, его файловая система сохраняется в хост-системе.
Параметры --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 -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
546d4fe312fe nginx "nginx -g 'daemon of…" 23 seconds ago Up 23 seconds 80/tcp my_nginx
Значимые имена полезны для ссылки на контейнер в сети Docker или при выполнении команд интерфейса командной строки 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, 23 Nov 2019 20:13:11 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Nov 2019 11:56:01 GMT
Connection: keep-alive
ETag: "4dd1r677-264"
Accept-Ranges: bytes
Обмен данными (монтажные тома)
Когда контейнер останавливается, все данные, сгенерированные контейнером, удаляются. Тома Docker — это предпочтительный способ сохранения данных и совместного использования их в нескольких контейнерах.
Для создания томов и управления ими используйте параметр -p
следующим образом:
-v host_src:container_dest:options
- Параметр
host_src
может быть абсолютным путем к файлу или каталогу на хосте или именованному тому. - Параметр
container_dest
— это абсолютный путь к файлу или каталогу в контейнере. - Опции могут быть
rw
(чтение-запись) иro
(только чтение). Если опция не указана, по умолчанию используетсяrw
.
Чтобы объяснить, как это работает, давайте создадим каталог на хосте и вставим в него файл index.html
:
mkdir public_html
echo "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 о том, что стандартный ввод должен оставаться подключенным к терминалу и выделять псевдотерминал:
docker container run -it nginx /bin/bash
Оболочка Bash контейнера будет подключена к терминалу, и командная строка изменится:
root@1d192392e:/#
Теперь вы можете взаимодействовать с оболочкой контейнера и запускать внутри нее любую команду.
В этом примере мы использовали /bin/bash
в качестве аргумента команды docker run
которая выполнялась вместо указанной в Dockerfile.
Вывод
Docker — это стандарт упаковки и развертывания приложений, а также важный компонент CI/CD, автоматизации и DevOps.
Команда docker container run
используется для создания и запуска контейнеров Docker.