Эта статья расширяет предыдущую статью Docker и показывает, как взаимодействовать с контейнерами Docker, выполняя команды внутри контейнеров, устанавливая программное обеспечение внутри контейнеров, проверяя состояние контейнера, получая доступ к контейнерам с помощью Bash, сохраняя изменения в образах и удаляя неиспользуемые контейнеры и образа.
В этом уроке вы узнаете:
- Как выполнять команды внутри контейнеров
- Как установить программное обеспечение внутри контейнеров
- Как проверить состояние контейнера
- Как обращаться к контейнерам с помощью Bash
- Как сохранить изменения в образах
- Как удалить неиспользуемые контейнеры и образа
Как взаимодействовать с контейнерами Docker
В первой статье этой серии вы узнали концепции Docker и некоторые основные команды и увидели, как вы можете легко запускать программное обеспечение по-отдельности, не касаясь конфигурации операционной системы вашего хоста.
Давайте теперь пойдем глубже, а именно заходим в запущенный контейнер и выполняем некоторые команды.
Выполнение команд внутри запущенного контейнера
В предыдущей статье вы запустили контейнер Apache.
В базовом образе не установлен PHP, поэтому он способен обслуживать только статические HTML-страницы.
Давайте получим контейнер с установленными на нем Apache и PHP.
Если вам интересно, есть образы, готовые для использования с установленными Apache и PHP, и их можно найти в Docker Hub.
Мы делаем это только для того, чтобы продемонстрировать, как образ может быть настроено под ваши нужды.
Итак, давайте стартанем экземпляр Debian, используя аналогичную командную строку предыдущей статьи, но с двумя отличиями: давайте укажем ему имя (- name debian_container), чтобы мы могли ссылаться на него позже, и назначить терминал для его запуска (-it).
$ docker run -it --name debian_container -d -p 8000:80 -v "$PWD":/var/www/html debian
Мы можем взаимодействовать с работающим контейнером Docker.
Ранее вам сообщалось, что контейнеры имеют одно и то же ядро, что и операционная система хоста.
Давай проверим.
$ docker exec debian_container uname -a
Команда docker exec выше выполняет заданную команду внутри контейнера и показывает ее вывод.
Все команды docker имеют связанную справку, поэтому мы видим, что опции docker exec принимают:
$ docker exec --help
Теперь вы можете поиграть с другими командами:
$ docker exec debian_container ls -l $ docker exec debian_container pwd $ docker exec debian_container whoami $ docker exec debian_container cat /etc/issue
В этой последней команде мы узнали, что в контейнере работает Debian 9, несмотря на операционную систему вашей машины.
Как уже упоминалось ранее, операционная система хоста и контейнер используют только ядро.
Если вы попытались, но не смогли выполнить команду внутри контейнера, возможно, ее там нет.
Образ (как и все другие) построен из минимальной установки Debian, поэтому необходимо установить любой дополнительный инструмент.
Он выполняет две задачи: меньший размер диска и улучшенная безопасность, поскольку меньшее количество программного обеспечения означает меньшее количество ошибок, которые могут быть использованы.
Теперь давайте войдем в контейнер.
$ docker exec -it debian bash
root@b5c694a02248:/usr/local/apache2#
Обратите внимание, что приглашение изменилось, и теперь вы являетесь пользователем root внутри контейнера (b5c694a02248 – имя хоста внутри контейнера) внутри оболочки bash.
Установка программного обеспечения в контейнера
Теперь у нас есть оболочка внутри контейнера с пользовательским root.
Поскольку это сокращенная версия Debian, нет даже команд top и ps. Давайте их установим.
# apt update # apt install procps
Вы можете увидеть, что работает top и ps -ef.
root@f5b423465e03:/# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 19:46 pts/0 00:00:00 bash root 42 0 0 19:49 pts/1 00:00:00 bash root 310 42 0 19:53 pts/1 00:00:00 ps -ef root@f5b423465e03:/#
Да, это скромно.
Контейнеры Docker обычно имеют абсолютное минимальное количество выполняемых процессов.
Чтобы оставить оболочку и вернуться в операционную систему хоста, просто выйдите из bash (введите exit или ctrl + d).
Обратите внимание, что многие файлы были загружены apt update и apt install.
Все они существуют на диске запущенного контейнера.
Они все еще существуют, если контейнер остановлен и снова запущен (docker stop debian_container, docker start debian_container).
Но они не существуют в образе.
Это означает, что если вы удалите этот контейнер (docker rm debian_container) и запустить новый контейнер, вам придется снова установить пакетную обработку.
Кроме того, если вы запустите образ Debian на другом хосте, вам также придется снова установить procps.
Мы увидим позже, как сохранить образ с изменениями диска, поэтому в следующий раз, когда вы запустите контейнер, все программное обеспечение будет уже установлено.
Теперь давайте добавим Apache и PHP.
Приведенная ниже команда займет много времени, и она будет загружать и устанавливать все пакеты зависимостей, включая Apache и PHP, – это займет несколько минут.
В итоге запустите Apache и обратитесь к localhost в порт 8000 в своем веб-браузере (http://localhost:8000).
Вы увидите страницу Apache по умолчанию для Debian.
# apt install libapache2-mod-php # service apache2 start
Теперь давайте подтвердим, что PHP существует.
Вы можете либо перейти в /var/ww/html внутри контейнера, либо выйти из оболочки контейнера и ввести из текущего каталога в вашей операционной системе хоста (помните, что мы сопоставили текущий каталог в /var/www/html внутри контейнера?)
$ echo '' >phpinfo.php
и пожалуйста – http://localhost:8000/phpinfo.php
Сохранить образ
Как упоминалось ранее, изменения, внесенные в контейнер, сохраняются до тех пор, пока контейнер сохраняется, и ожидается, что контейнеры будут эфемерными – они будут уничтожены.
Должны быть внесены изменения в образ.
В следующей статье будет показано, как создать индивидуальный образ в элегантном (и настоятельно рекомендованном) порядке, используя Dockerfile. Пока вы узнаете взлом, который может быть полезен в конкретных ситуациях, когда невозможно или желательно писать файл Docker. Расширение изображений с помощью файла Docker, если это необходимо, потому что он может быть легко отредактирован, когда он переносит состояние контейнера на новое изображение, не оставляет следов внесенных изменений, если не выполняется сложный анализ уровня файловой системы.
Команда docker commit имеет два параметра: имя контейнера и новое имя образа, и она создаст новый образ в локальном кэше на основе контейнера.
В приведенной ниже команде debian_container – это имя контейнера, а debian-apache-php – новое имя образа.
$ docker commit debian_container debian-apache-php sha256:3f01c0c71539c4dc6dfd7483ff68c41143b7e9aeb52de4a9892c8cc136eda236
Отображение образов в кеше хоста.
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE debian-apache-php latest 3f01c0c71539 10 minutes ago 235MB debian latest be2868bebaba 11 days ago 101MB
Обратите внимание, что на вашем хосте есть новый образ.
Одна интересная характеристика управления образами и контейнерами заключается в том, что Docker будет хранить разницу состояния диска между текущим образом и образом, на котором он основан, поэтому лишнее место на диске не используется.
Для этого Docker использует многоуровневую файловую систему, использующую подход «copy-on-write»: при создании нового контейнера он наследует один и тот же диск образа и, как изменения в файлах, записывается на новый уровень.
Проверка контейнеров
Docker поддерживает большую информацию о своих объектах.
Для просмотра их используется команда docker inspect.
$ docker inspect debian_container
Команда будет извлекать объект JSON с десятками строк с подробным описанием состояния контейнера: идентификатор контейнера, дата создания, состояние, образ, путь к журналу, порты, тома, сети и т. д.
Обрезка контейнеров и образов
После работы с контейнерами и образами диск хоста в конечном итоге пополнится оставленными объектами, которые необходимо очистить, чтобы вы могли освободить место на диске.
В черновом контейнере команды docker удаляют все остановленные контейнеры.
Будьте осторожны: после удаления контейнера любое связанное состояние будет потеряно.
Сделайте резервную копию или скопируйте изменения заранее.
Удаление черновика файла докеры удалит все неиспользуемые образа.
Мы еще не создали образ но эта команда будет полезна в следующей статье.
Заключение
В этой статье вы узнали, как взаимодействовать с контейнерами и как фиксировать изменения образов, хотя этот подход не рекомендуется.
В следующей статье вы создадите свои собственные образы с помощью Dockerfile, рекомендуемого способа настройки образов Docker.