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?