Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. DevOps

Докер с нуля: работа с контейнерами, часть 1

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Docker from the Ground Up: Working with Containers.
Docker From the Ground Up: Working With Containers, Part 2

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Это часть первой серии из двух частей о работе с контейнерами Docker. В этой части мы сосредоточимся на разных способах и вариантах запуска образа и способах взаимодействия хоста с контейнером Docker.

Во второй части мы рассмотрим листинг, запуск, остановку и перезапуск контейнеров, а также выполнение команд по запуску контейнеров. Образы докера - это единицы развертывания. Когда вы запускаете образ, вы создаете экземпляр контейнера Docker, который запускает отдельный процесс в своей изолированной среде для файловой системы, сети и дерева процессов.

Контейнеры-докеры очень гибкие и позволяют использовать множество приложений, которые слишком тяжелы, сложны и/или дороги с другими технологиями, такими как виртуальные машины и серверы.

Прежде чем начать, убедитесь, что Docker в вашей среде установлен правильно. В зависимости от того, как он установлен, и вашего пользователя, вам может потребоваться запустить его под sudo. Я пропущу sudo.

Запуск обораза

Вы запускаете контейнер Docker, запустив образ. Существует несколько способов запуска контейнера, которые влияют на то, как легко будет управлять всеми контейнерами. Когда контейнер запускается, он обычно выполняет команду, определенную в Dockerfile. Вот Dockerfile для контейнера hello-world:

Команда просто запускает двоичный файл «hello», который был скопирован в корень контейнера при создании образа.

Foreground vs. Detached

Контейнер может работать на переднем плане, где он блокируется, пока процесс не завершится, и контейнер перестанет работать. В режиме переднего плана контейнер выводит свой вывод на консоль и может читать стандартный ввод. В отключенном режиме (когда вы указываете флаг -d), управление возвращается немедленно, а контейнер

Запуск контейнера «Без названия»

Самый простой способ запуска контейнера: docker run <image id or name>.

Когда вы запускаете контейнер с помощью этой команды, Docker назначает ему имя, состоящее из двух случайных слов. Например: docker run hello-world.

Если у вас уже есть образ hello-world, то Docker запустит его. Если такого образа нет, он вытащит его из официального Docker-хранилища DockerHub, а затем запустит его. Результат должен выглядеть так:

Программа приветствия выйдет после отображения сообщения, которое завершает процесс, выполняющийся внутри контейнера, и завершает работу самого контейнера. Контейнер все еще торчит, если вы хотите подключиться к нему, изучить журналы или что-то еще. Чтобы просмотреть контейнер, вы можете запустить следующую команду:

Ниже я расскажу, как получить все контейнеры и все соответствующие параметры. Теперь давайте сосредоточимся на разделе «Names». Docker автоматически генерирует имя «clever_liskov», и мне придется использовать его или идентификатор контейнера для обращения к этому контейнеру для любых целей, таких как перезагрузка, удаление или выполнение команды.

Запуск именованного контейнера

Использование идентификаторов контейнеров или автогенерированных имен иногда неудобно. Если вы часто взаимодействуете с контейнером, который вы часто повторно создаете, тогда он получит другой идентификатор и автогенерированное имя. Кроме того, имя будет случайным.

Docker позволяет вам называть свои контейнеры, когда вы запускаете их, предоставляя аргумент командной строки «--name <имя контейнера>». В простых случаях, когда у вас есть только один контейнер на образ, вы можете назвать контейнер по имени вашего образа: docker run --name hello-world hello-world.

Теперь, если мы посмотрим на процесс (я удалил clever_liskov ранее), мы увидим, что контейнер называется hello-world:

Существует несколько преимуществ для именованного контейнера:

  • У вас есть стабильное имя для ваших контейнеров, которые вы используете как в интерактивном режиме, так и в сценариях.
  • Вы можете выбрать значащее имя.
  • Вы можете выбрать краткое имя для удобства при работе в интерактивном режиме.
  • Это предотвращает случайное наличие нескольких контейнеров одного и того же образа (при условии, что вы всегда указываете одно и то же имя).

Давайте посмотрим на последний вариант. Если я попытаюсь снова запустить ту же команду запуска с тем же именем «hello-world», я получаю сообщение об ошибке:

Запуск автоматического удаления образа

По умолчанию контейнеры придерживаются. Иногда они вам не нужны. Вместо того, чтобы вручную удалять выведенные контейнеры, вы можете это автоматизировать. Аргумент командной строки --rm сделает что нужно: docker run --rm hello-world.

Запуск другой команды

По умолчанию Docker запускает команду, указанную в Dockerfile , который используется для сборки образа (или непосредственно в точке входа, если команда не найдена). Вы всегда можете переопределить ее, предоставив свою собственную команду в конце команды run. Давайте запустим ls -la на образе busybox (образ hello-world не имеет исполняемого файла ls):

Взаимодействие с хостом

Контейнеры-докеры запускают изолированные процессы в своем маленьком мире. Но часто необходимо и полезно предоставлять доступ к хосту.

Передача переменных среды в контейнер

Контейнеры автоматически не наследуют среду хост-процесса, который их запускал. Вам необходимо явно указать переменные среды в контейнер при запуске с помощью флага командной строки -e. Вы можете передать несколько переменных среды. Вот пример:

Первая строка запускает контейнер busybox, передавая ему переменную ENV_FROM_HOST, а затем внутри контейнера, команда env, показывает, что ENV_FROM_HOST установлена правильно.

Вы также можете использовать переменные среды хоста. Это устанавливает пару переменных среды хоста и использует их в команде запуска:

Внутри контейнера они теперь видны:

Монтаж каталогов хоста

Одним из наиболее полезных взаимодействий является установка хост-каталогов. Это позволяет несколько интересных вариантов использования:

  • Совместное хранилище между контейнерами, работающими на одном и том же хосте.
  • Просмотр и редактирование файлов с использованием среды хоста и инструментов и использование самих файлов в контейнере.
  • Постоянство на уровне хоста за пределами срока службы контейнера.

Здесь я создаю файл на хосте: $ echo "Yeah, it works!" > ~/data/1.txt

Затем я запускаю образ busybox, устанавливая каталог ~/data в /data в контейнере и отображая содержимое файла на экране:

Я использовал здесь команду cat /data/1.txt.

Предоставление портов хосту

Если вы выставляете порт в Dockerfile с помощью EXPOSE, он будет доступен только для других контейнеров докера. Чтобы сделать его доступным на хосте, вам нужно использовать аргумент командной строки -p. Синтаксис следующий: -p <host port>: <открытый порт контейнера>.

Здесь выполняется образ nginx, который предоставляет порт 80 и использует аргумент командной строки -p, чтобы сделать его видимым на хосте на порте 9000:

Обратите внимание: в отличие от предыдущих команд, выполнявших некоторые задачи и завершенных, контейнер nginx будет продолжать работать и слушать входящие запросы. Давайте проверим, действительно ли nginx работает и отвечает на запросы на порт 9000. Я предпочитаю отличный HTTP-клиент httpie вместо curl для проверки веб-серверов и служб из командной строки:

Вывод

Существует множество способов запуска образа Docker для создания контейнера, и есть много различных вариантов. Каждая комбинация используется для конкретного случая. Это очень полезно при работе с контейнерами Docker, полностью понять детали и использовать лучший метод для запуска ваших контейнеров.

Кроме того, добавление хостов и портов позволяет обеспечить тесную интеграцию с хостом и множество сценариев использования. Во второй части мы погрузимся в управление кучей контейнеров и уже по-максимуму будем использовать возможности Docker.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.