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_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.
Если у вас есть вопросы, оставьте комментарий ниже.