Docker. Играем с контейнерами внутри и снаружи.

В предыдущей статье Docker. Создаем контейнеры. Основные команды. мы рассмотрели базовые команды для работы с докером и докер контейнерами. В этой предлагаю поиграться с docker containers: научится общаться с внешним миром – связывать информацию внутри и снаружи.

Выполнение команды в докер-контейнере

Запускать и останавливать контейнере довольно хорошо, но порой – скучно. Бывают случаи, когда нам очень хочется сделать что-то еще. Например, выполнить какую-то команду в запущенном контейнере. Давайте глянем как это делается

docker exec {container_name} cat /etc/hosts

Здесь мы говорим докеру выполнить (exec) команду (cat /etc/hosts) в контейнере (container_name). Запустите контейнер, например, nginx. Узнайте его имя или id. Для этого вспомните предыдущую статью, которая подскажет вам выполнить команду docker ps. И посмотрите что получилось в результате. Можете попробовать немного другие команды. Ни в чем себя не ограничивайте

Например, я в своих проектах очень часто выполняю следующую команду

docker exec -it {php_container} bash

Эта команда позволяет выполнять несколько команд в контейнере. Здесь есть дополнительные параметры: -i или же –interactive и -t (-it) позволяет нам держать окно ввода постоянно открытым, запуская псевдотерминал и выполнять несколько команд.

Docker Tags. Версия образа.

Мы запускали контейнеры и не беспокоились о версии нашего компонента. Разрабатывая приложение мы должны с легкостью оперировать версиями, так как они имеют свои особенности. Для того, чтобы указать версию и сделаны теги. Нужно всего лишь после имени образа указать через двоеточие версию. Например

docker run {image}:{tag}

Когда вы не указываете этот тег, как например мы делали в предыдущих примерах – докер берет последнюю, или же она называется lastest и она равнозначна команде

docker run {image}:lastest

Давайте, как всегда, немедленно рассмотрим примеры.

docker run redis:4.0
docker run redis:latest
docker run hello-world:linux

На докер хабе на странице образов можно увидеть вкладку Tags, в которой будет список доступных тегов.

Docker containers – Ports. Пробрасываем порты

Бывают случаи, когда нам надо что бы порт в docker container отличался от внешнего. Для этого мы можем прокинуть порты с контейнера наружу. Связать порты нам поможет следующий параметр

docker run -p {external_port}:{container_port} {image}

Здесь external_port – это порт, который будет доступен снаружи, а container_port – тот что в контейнере.

Давайте попробуем глянуть пример

docker run -p 3306:3306 mysql
docker run -p 8306:3306 mysql

Мы запустили два контейнера mysql, первый из них доступен по порту 3306, а второй – 8306. Можно запустить много таких контейнеров им привязать сколь угодное количество портов. Но мы не сможем привязать контейнер к такому же порту более одного раза. Попробуйте второй раз выполнить последнюю команду и сами убедитесь.

Docker Volumes. Хранение данных.

Давайте глянем как наши данные хранятся в докер контейнерах. возьмём все ту же команду запуска контейнера с mysql. Данные БД хранятся в /var/lib/mysql в самом докер контейнере. Докер контейнеры имеют изолированную файловую систему и все файлы хранятся в пределах контейнера. Вот такая ситуация: у нас хранится много данных в БД, которые мы собирали очень упорно на протяжении многих лет. Что произойдет когда мы удалим контейнер? Контейнер вместе со своими данными канет в небытие как только мы его удалим. Это очень печально. Все наши данные пропадут.

Если мы хотим хранить данные, нам просто нужно замапить папку снаружи контейнера к папке внутри него. Что-то вроде того как мы делали с портами. Глянем на команду с помощью которой это можно сделать.

docker run -v /opt/datadir:/var/lib/mysql mysql

Здесь слева от двоеточия стоит /opt/datadir – директория на нашем хосте, а /var/lib/mysql – та что находится внутри контейнера. Теперь все данные останутся на нашей машине и никуда не пропадут.

Просматриваем логи контейнера.

Представим что мы запустили контейнер в фоновом режиме. Что бы разобраться с той или иной проблемой – в первую очередь вы полезете в логи. Но как нам их просмотреть?

docker logs {container}

Где container – это, как. вы поняли, имя контейнера или его id.

Docker containers. Environment переменные.

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

Для примера, мы используем переменную APP_ENV для того что бы определить прод ли это, стейдж или локальная версия. Поможет нам в этом следующий параметр.

docker run -e APP_ENV=production {image}

Теперь внутри контейнера нам будет доступен этот параметр.

Docker. Inspect container.

Мы добавили переменную, но как нам теперь узнать какие переменные у нас установлены в запущеном контейнере? Для этого существует замечательная команда

docker inspect {container}

Вы увидите в объекте config объект Env со списком переменных и еще куча другой информации. Попробуйте запустить контейнер с переменой а потом найти и убедиться что она установлена. Получилось? Пойдем дальше. Если нет – то давайте разберемся вместе в комментариях.

Домашнее задание.

Давайте убедимся что у нас вышло разобраться во всем что произошло в этой статье. Запустите mysql контейнер с именем wowow_mysql который снаружи слушает порт 2334 и с переменной CONTAINER_VAR которая имеет значение explosion. Возможно, вам прийдется зайти на докерхаб и почитать документацию. Кто знает. Если возникнут сложности – обсудим их в комментариях к этой статье. Если нет – перейдем к следующей статье, ведь это еще далеко не конец.

Теперь поговорим про docker compose?

Leave a Reply