Docker – это платформа, которая позволяет вам разрабатывать, тестировать и развертывать приложения в виде переносимых самодостаточных контейнеров, которые работают практически везде.
Команда docker run создает контейнер из заданного изображения и запускает контейнер, используя данную команду. Это одна из первых команд, с которыми вам следует ознакомиться при начале работы с Docker.
В этой статье мы будем использовать официальный образ Nginx, чтобы показать различные способы запуска контейнера Docker.
Выполнение команды Docker
Команда docker run принимает следующую форму:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Имя образа, из которого должен быть создан контейнер, является единственным обязательным аргументом для команды docker run. Если образ отсутствует в локальной системе, он извлекается из реестра.
Если команда не указана, при запуске контейнера выполняется команда, указанная в файле Dockerfile инструкциях 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 run не предоставляет никаких опций, корневой процесс запускается на переднем плане. Это означает, что стандартный ввод, вывод и ошибка корневого процесса привязаны к сеансу терминала.
docker container run nginx
Вывод процесса nginx будет отображаться на вашем терминале. Поскольку нет никаких подключений к веб-серверу, терминал пуст.
Чтобы остановить контейнер, завершите запущенный процесс Nginx, нажав CTRL+C.
Запустите контейнер в отдельном режиме
Чтобы контейнер продолжал работать при выходе из сеанса терминала, запустите его в отдельном режиме. Это похоже на запуск процесса Linux в фоновом режиме.
Используйте опцию -d для запуска отдельного контейнера:
docker container run -d nginx
050e72d8567a3ec1e66370350b0069ab5219614f9701f63fcf02e8c8689f04fa
Отсоединенный контейнер остановится после завершения корневого процесса.
Вы можете просмотреть список запущенных контейнеров, используя команду docker container ls.
Чтобы подключить свой терминал к корневому процессу отсоединенного контейнера, используйте команду docker container attach.
Удалить контейнер после выхода
По умолчанию при выходе из контейнера его файловая система сохраняется в хост-системе.
Команда –rm options говорит команде docker запустить удаление контейнера при его автоматическом выходе:
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 или при выполнении команд командной строки 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, 27 Nov 2019 07:35:21 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 24 Nov 2019 15:45:22 GMT Connection: keep-alive ETag: "5dd3e500-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@1da70f1937f5:/#
Теперь вы можете взаимодействовать с оболочкой контейнера и выполнять любую команду внутри него.
В этом примере мы предоставили command ( /bin/bash) в качестве аргумента для команды docker run, которая была выполнена вместо той, которая указана в Dockerfile.
Вывод
Docker является стандартом для упаковки и развертывания приложений и важным компонентом CI/CD, автоматизации и DevOps.
Команда docker container run используется для создания и запуска контейнеров Docker.
Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий ниже.