Docker — это платформа, которая позволяет разрабатывать, тестировать и развертывать приложения в виде переносимых самодостаточных контейнеров, которые работают практически где угодно.
Команда docker run
создает контейнер из заданного образа и запускает контейнер с помощью заданной команды. Это одна из первых команд, с которой вам следует ознакомиться, когда вы начнете работать с Docker.
В этой статье мы будем использовать официальный образ Nginx, чтобы показать различные способы запуска контейнера Docker.
Содержание
Команда запуска Docker
Команда docker run
имеет следующий вид:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Имя образа, из которого должен быть создан контейнер, является единственным обязательным аргументом для команды docker run
. Если образ отсутствует в локальной системе, он извлекается из реестра.
Если команда не указана, команда, указанная в инструкциях CMD
или 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
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 -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 на интерфейсе localhost хоста, вы должны запустить:
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_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, что стандартный ввод должен быть подключен к терминалу, и назначен псевдо-tty:
docker container run -it nginx /bin/bash
Оболочка Bash контейнера будет прикреплена к терминалу, и командная строка изменится:
root@1da70f1937f5:/#
Теперь вы можете взаимодействовать с оболочкой контейнера и запускать внутри нее любую команду.
В этом примере мы предоставили команду ( /bin/bash
) в качестве аргумента для команды docker run
которая была выполнена вместо той, которая указана в файле Dockerfile.
Выводы
Docker — это стандарт упаковки и развертывания приложений, а также важный компонент CI / CD, автоматизации и DevOps.
Команда docker container run
используется для создания и запуска контейнеров Docker.
Если у вас есть вопросы, оставьте комментарий ниже.