Что это такое?
Docker - это платформа для разработчиков и системных администраторов, предназначенная для разработки, развертывания и запуска приложений в контейнерах изолированных друг от друга. Использование контейнеров для развертывания приложений в Linux называется контейнеризацией. Идея контейнеризации и изоляции приложений зародилась практически сразу после появления первых компьютеров, но только в последние годы их использование широко распространилось и упростилось, благодаря высоким темпам разработки программного обеспечения во всем мире.
Для работы с Docker необходимо понимать отличия между терминами образ и контейнер:
- образ представляет собой исполняемый пакет, включающий все необходимое для запуска приложения - программный код, среду выполнения, библиотеки, переменные среды и файлы конфигурации;
- контейнер запускается из образа и является его экземпляром, т.е. из одного образа может быть запущено несколько контейнеров.
Образ является шаблоном доступным только для чтения. Образ Docker может быть дистрибутивом Linux или полностью сконфигурированным корпоративным программным обеспечением, готовым к запуску. Все зависит от специального файла - Dockerfile.
Dockerfile - это текстовый файл с инструкциями, написанными в формате, понятном демону Docker. Чтобы создать собственный образ, необходимо создать свой Dockerfile. После того, как Dockerfile подготовлен, можно выполнить сборку для создания соответствующего образа.
Примечание: демон является одним из компонентов Docker, который выполняет тяжелые задачи по созданию, запуску и распределению изображений после получения команд из Докер-клиента.
В общем случае запуск приложения в Docker выглядит так:
- Выбирается приложение, которое требуется запустить в контейнере.
- В конфигурационном файле Dockerfile описывается это приложение и среда выполнения согласно синтаксису.
- Формируется образ приложения, представляющий собой единый файл. Он включает в себя и исполняемые файлы приложения, и все его библиотеки (за исключением общесистемных), т.е. в дальнейшем приложение остается неизменным в контейнере.
- Запускается Docker с указанным образом прикладного приложения, которое используется для прикладных задачи.
Установка
Прежде всего следует обновить локальную базу пакетов:
sudo yum check-update
Для установки самой последней и стабильной версии Docker необходимо обратиться к официальному репозиторию Docker. Следующая команда добавит репозиторий, загрузит последнюю версию ПО и установит его:
curl -fsSL https://get.docker.com/ | sh
Примечание: если вы собираетесь использовать Docker не от имени пользователя root, то необходимо добавить пользователя в созданную после установки группу docker:
sudo usermod -aG docker <имя пользователя>
Например:
sudo usermod -aG docker cloud
Запустите демон Docker после окончания установки:
sudo systemctl start docker
Убедитесь в том, что демон стартовал без ошибок и предупреждений:
sudo systemctl status docker
В результате должно появиться подобное сообщение:
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2018-04-26 14:06:06 MSK; 1min 56s ago
Docs: https://docs.docker.com
Main PID: 1601 (dockerd)
Tasks: 16
Memory: 40.0M
CGroup: /system.slice/docker.service
├─1601 /usr/bin/dockerd
└─1605 docker-containerd --config /var/run/docker/containerd/conta...
...
Работа с образами в Docker
Команда docker имеет следующий синтаксис, где после названия команды могут быть перечислены различные опции, команды и аргументы:
docker <option> <command> <arguments>
Чтобы вывести на экран все доступные команды и краткую информацию о них, просто используйте команду docker:
docker
По умолчанию образы извлекаются из реестра Docker Hub, дочернего проекта Docker. Любой пользователь может создавать и размещать свои образы на Docker Hub, поэтому большинство приложений, СУБД и дистрибутивов Linux имеют свои образы на Docker Hub.
Чтобы проверить, можете ли вы получать и загружать образы из Docker Hub, выполните следующую команду:
docker run hello-world
В результате должно отобразиться подобное сообщение:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
9bb5a5d4561a: Pull complete
Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
Чтобы выполнить поиск нужного образа, используйте следующий формат команды:
docker search <имя>
Например, для поиска образа nginx используйте следующую команду:
docker search nginx
В результате появится список доступных образов:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 8341 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1328 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 [OK]
jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 364 [OK]
kong Open-source Microservice & API Management la… 184 [OK]
webdevops/php-nginx Nginx with PHP-FPM 102 [OK]
Загрузить нужный образ можно с помощью команды следующего формата:
docker pull <имя>
Например:
docker pull nginx
Вы увидите процесс загрузки:
Using default tag: latest
latest: Pulling from library/nginx
f2aa67a397c4: Downloading [===============> ] 7.13MB/22.5MB
3c091c23e29d: Downloading [================> ] 7.091MB/22.11MB
4a99993b8636: Download complete
После того как образ был загружен на ваш сервер, запустить его можно с помощью опции run:
docker run <имя>
Посмотреть все загруженные образы можно с помощью опции images:
docker images
Отобразится список:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest ae513a47849c 8 days ago 109MB
hello-world latest e38bc07ac18e 3 weeks ago 1.85kB
Работа с контейнерами в Docker
Чтобы создать контейнер с именем example на основе образа image, используйте следующую команду:
docker run --name <example> -d <image>
Примечание: комбинация ключей -i и -t дает интерактивный доступ к оболочке shell в контейнере.
Пример создания контейнера example на основе образа nginx:
docker run --name example -d nginx
Посмотреть запущенные контейнеры можно с помощью опции ps:
docker ps
Примечание: ключ -l позволяет просмотреть все существующие контейнеры.
Отобразится список:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b8f970efcc91 nginx "nginx -g 'daemon of…" 15 seconds ago Up 13 seconds 80/tcp example
Чтобы запустить созданный контейнер в фоновом режиме, используйте следующую команду:
docker container start <имя_или_id>
Например:
docker container start example
Чтобы зайти внутрь контейнера, который работает в фоновом режиме, выполните следующую команду:
sudo docker exec -i -t <имя_или_id> /bin/bash
Пример:
sudo docker exec -i -t b8f970efcc91 /bin/bash
root@b8f970efcc91:/data#
Для выхода из контейнера используйте стандартную команду exit.
Чтобы остановить созданный контейнер, используйте следующую команду:
docker container stop <имя_или_id>
Например:
docker container stop example
Чтобы удалить контейнер используйте опцию rm:
docker rm -f <имя_или_id>
Например:
docker rm -f example
Примечание: ключ -f позволяет удалять запущенные контейнеры без их предварительной остановки.
Для более подробного примера запустим приложение nginx на конкретном порту, например 80, и убедимся, что все работает. Не забудьте настроить firewall и открыть данный порт на сервере:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables-save
Запускаем контейнер с именем example:
docker run --name example -d -p 80:80 nginx
В адресной строке браузера переходим по адресу вашего сервера с указанием порта, на изображении показан ожидаемый результат: