Написано вместе с ReBrainMe
Docker – де-факто стандартный движок контейнеризации, который повсеместно используется для запуска приложения как в окружениях для разработки, так и в публичных\высоконагруженных средах. Подробнее о терминологии можно узнать здесь.
Задача данной статьи состоит в том, чтобы поставить и запустить Docker локально, начать знакомство с этой интереснейшей системой и усвоить основы.
Установка Docker ¶
У Docker есть официальные инструкции по установке. На практике, я пользовался установочным скриптом (для Linux):
|
|
Если утилита curl у Вас не установлена, скачайте скрипт и выполните его вручную:
|
|
Если Вы хотите установить определённую версию Docker, то можете воспользоваться установочными скриптами Rancher-a, которые можно подобрать и скачать здесь. Запускается так же, можете прямо в команде с curl адрес поменять, всё будет работать.
Настройка Docker ¶
Всё работает из коробки, единственное что, есть всего пара моментов, которые исходя из личного опыта можно было бы рекомендовать подправить сразу.
Настроить logging driver ¶
Дело в том, что по умолчанию используется драйвер json-file, который по умолчанию не имеет ограничения на размер [JSON](https://ru.wikipedia.org/wiki/JSON#:~:text=JSON%20(%D0%B0%D0%BD%D0%B3%D0%BB.,JSON%20%D0%B1%D1%8B%D0%BB%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%BD%20%D0%94%D1%83%D0%B3%D0%BB%D0%B0%D1%81%D0%BE%D0%BC%20%D0%9A%D1%80%D0%BE%D0%BA%D1%84%D0%BE%D1%80%D0%B4%D0%BE%D0%BC.) файла, где будут скапливаться логи с соответствующего контейнера. Подправить на Linux это можно отредактировав файл /etc/docker/daemon.json. Файла, по умолчанию, может и не быть – создайте. Содержимое к добавлению:
|
|
Таким образом мы настраиваем json-file, чтобы он не создавал более одного файла с логами на контейнер, причём файл не должен превышать 100 МБ
. Это всё можно переопределить на этапе запуска контейнера, но в будущем, эти умолчания освобождают от поисков ответа на вопрос: “Куда делить 6 ГБ за день?”
Запустить службу Docker ¶
Бывает, не запускается он сам после установки. Можно поправить на Linux с помощью:
|
|
Здесь, мы с помощью systemctl, запустили Docker Engine и поставили его в автозагрузку.
Добавить пользователя в группу docker ¶
Чтобы иметь возможность обращаться к Docker Engine от имени не привилегированного пользователя (без sudo), нужно добавить его в группу docker.
|
|
Для того, чтобы изменения вступили в силу нужно перезагрузиться или воспользоваться ACL.
|
|
Знакомство с DockerHub ¶
Контейнеры, создаются из образов. Образ – упорядоченный набор слоёв файловой системы, которые были получены на этапе сборки. Люди делятся образами выкладывая их на Docker Registry. Самый популярный – DockerHub. Множество программных продуктов выкладываются здесь и поддерживаются официально, а есть много инструментов, собранных простыми людьми или небольшим сообществом, которые не уступают по качеству и поддержке официальным. Важно, смотрите, что Вы качаете и выполняете – noname не понятно какой и без документации, или официальную сборку, которая регулярно обновляется и сопровождается ясной документацией. Бывали слухи, что в noname образах майнеры попадались… но это больше редкость, чем правило (исходя из личного опыта).
Для примера, вот несколько ссылок на официальные образы: HaProxy, Nginx, PostgreSQL, MySQL, Grafana, Prometheus.
Запустим первый контейнер ¶
|
|
Открыв http://localhost:8080 видим:
Что мы сделали? Разберём команду по порядку.
sudo – запуск последующей команды от имени другого пользователя, по умолчанию – суперпользователя root.
docker – запускаем исполняемый файл Docker-а, который командная оболочка найдёт в одном из путей, найденных в переменной PATH.
run – создать и запустить новый контейнер.
–rm – после завершения его выполнения – удалить, чтобы место не занимал.
-i – присоединить stdin/out/err из командной оболочки в контейнер; запуск в интерактивном режиме.
-t – создать tty для контейнера.
-p 8080:80 – перенаправить порт 8080 с хоста на 80 внутри контейнера.
nginx:stable-alpine – использовать для создания контейнера образ nginx с тегом stable-alpine. Другие теги можно найти на странице Nginx на DockerHub.
Монтирование ¶
Часто необходимо подключить какие-то данные в контейнер, или вынести их из него, чтобы не потерять при пересоздании. Подробнее можно почитать здесь.
|
|
Здесь мы создали файл /tmp/my_file.txt и примонтировали его по пути /usr/share/nginx/html/index.html. Согласно описанию контейнера, можно так же эмпирическим путём определить, что путь к файлам веб-сервера в стандартном конфигурационном файле именно /usr/share/nginx/html, а файл по умолчанию, который будет открываться как главная – index.html. Вот мы и монтируем с хоста в контейнер по найденному пути.
С монтированием нужно быть внимательным. Монтируя файл он уже должен существовать к моменту запуска на хосте, иначе создастся папка. Монтируя, путь на хосте должен быть абсолютным. Монтируя директорию, содержимое целевого пути внутри контейнера, если там что-то было, просто исчезнет и будет то, что находится в папке на хосте.
Запуск в фоновом режиме ¶
|
|
Здесь появилась пара новых ключей. -d – запуск в фоне. –name my1 – задать имя контейнеру “my1”, так как по умолчанию генерируется случайное, а мы хотим назначить своё. Проверим состояние контейнера.
|
|
Первая команда выводит информацию о всех запущенных контейнерах, вторая – отдаёт краткую сводку по потреблению ресурсов. Откроем Grafana.
Можем зайти, поизучать (логин admin, пароль admin), а потом остановить контейнер.
|
|
Как видим, контейнер остановлен, но не удалён. Можно вновь запустить, а можно удалить.
|
|
Заключение ¶
Мы поставили Docker, познакомились с DockerHub, запустили пару контейнеров и опробовали базовые команды для запуска приложений с помощью Docker Community Edition.