Docker — установка, настройка и первые шаги в системе
9
11186
21 августа 2020 13:23
21/08/2020
Visitors have accessed this post 11186 times.
Автор — Юрий Власов
Docker – де-факто стандартный движок контейнеризации, который повсеместно используется для запуска приложения как в окружениях для разработки, так и в публичных\высоконагруженных средах. Подробнее о терминологии можно узнать здесь.
В этой статье я расскажу, как поставить и запустить Docker локально и начать знакомство с этой интереснейшей системой. Ну что же, перейдем сразу к практике.
Установка Docker
У Docker есть достаточно подробные официальные инструкции по установке. На практике, я пользовался установочным скриптом (для Linux):
curl -L get.docker.com | sudo sh -
Если утилита curl у вас не установлена, скачайте скрипт и выполните его вручную:
sh /path/to/downloaded/script.sh
Если вы хотите установить определенную версию Docker, то можете воспользоваться установочными скриптами Rancher-a, которые можно подобрать и скачать здесь. Запускается так же, можете прямо в команде с curl адрес поменять, все будет работать.
Настройка Docker
Все работает из коробки, но есть пара моментов, которые, исходя из личного опыта, можно было бы рекомендовать подправить сразу.
1. Настроить logging driver
Дело в том, что по умолчанию используется драйвер json-file, который по умолчанию не имеет ограничения на размер JSON файла, где будут скапливаться логи с соответствующего контейнера. Подправить на Linux это можно, отредактировав файл /etc/docker/daemon.json. Файла по умолчанию может и не быть – создайте. Содержимое к добавлению:
Таким образом мы настраиваем json-file, чтобы он не создавал более одного файла с логами на контейнер, причем файл не должен превышать 100 МБ. Это все можно переопределить на этапе запуска контейнера, но в будущем это освобождает от поисков ответа на вопрос: «Куда делись 6 ГБ за день?»
2. Запустить службу Docker
Бывает, не запускается он сам после установки. Можно поправить на Linux с помощью:
sudo systemctl enable --now docker.service
Здесь мы с помощью systemctl запустили Docker Engine и поставили его в автозагрузку.
3. Добавить пользователя в группу docker
Чтобы иметь возможность обращаться к Docker Engine от имени непривилегированного пользователя (без sudo), нужно добавить его в группу docker.
sudo usermod -aG docker "$USER"
Для того чтобы изменения вступили в силу, нужно перезагрузиться или воспользоваться ACL.
sudo setfacl -m "u:${USER}:rwx" /var/run/docker.sock
Знакомство с DockerHub
Контейнеры создаются из образов. Образ – упорядоченный набор слоев файловой системы, которые были получены на этапе сборки. Образами можно поделиться, выложив их на Docker Registry. Самый популярный – DockerHub. Множество программных продуктов выкладываются здесь и поддерживаются официально, а есть много инструментов, собранных отдельными людьми или небольшим сообществом, которые не уступают по качеству и поддержке официальным.
Важно! Смотрите, что вы качаете и выполняете – непонятно какой noname без документации или официальную сборку, которая регулярно обновляется и сопровождается ясной документацией. Ходят слухи, что в noname образах майнеры попадались… но это больше редкость, чем правило (исходя из личного опыта).
Для примера, вот несколько ссылок на официальные образы: HaProxy, Nginx, PostgreSQL, MySQL, Grafana, Prometheus.
Запустим первый контейнер
sudo docker run --rm -it -p 8080:80 nginx:stable-alpine
Открыв 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.
Монтирование
Часто необходимо подключить какие-то данные в контейнер или вынести их из него, чтобы не потерять при пересоздании. Подробнее можно почитать здесь.
echo "Hello world! Date: $(date)" > /tmp/my_file.txt
sudo docker run --rm -it -p 8080:80 -v /tmp/my_file.txt:/usr/share/nginx/html/index.html:ro nginx:stable-alpine
Здесь мы создали файл /tmp/my_file.txt и примонтировали его по пути /usr/share/nginx/html/index.html. Согласно описанию контейнера, можно также эмпирическим путем определить, что путь к файлам веб-сервера в стандартном конфигурационном файле именно /usr/share/nginx/html, а файл по умолчанию, который будет открываться как главная, – index.html. Вот мы и монтируем с хоста в контейнер по найденному пути.С монтированием нужно быть внимательным. Монтируя файл, убедитесь, что он уже существует к моменту запуска на хосте, иначе создастся папка. Путь на хосте при монтировании должен быть абсолютным. Когда вы монтируете директорию, содержимое целевого пути внутри контейнера, если там что-то было, просто исчезнет и будет то, что находится в папке на хосте.
Запуск в фоновом режиме
sudo docker run -d --name my1 -p 3000:3000 grafana/grafana
Здесь появилась пара новых ключей.
-d – запуск в фоне.
— -name my1 – задать имя контейнеру «my1», так как по умолчанию генерируется случайное, а мы хотим назначить свое.
Проверим состояние контейнера.
sudo docker ps
sudo docker stats
Первая команда выводит информацию о всех запущенных контейнерах, вторая – отдает краткую сводку по потреблению ресурсов. Откроем Grafana.
Можем зайти, поизучать (admin:admin), а потом остановить контейнер.
sudo docker stop my1
sudo docker ps -a
Как видим, контейнер остановлен, но не удален. Можно вновь запустить, а можно удалить.
sudo docker start my1
sudo docker rm -f my1
Заключение
Мы поставили Docker, познакомились с DockerHub, запустили пару контейнеров и опробовали базовые команды для запуска приложений с помощью Docker Community Edition.
От редакции
Если вам интересно посещать бесплатные онлайн-мероприятия по DevOps, Kubernetes, Docker, GitlabCI и др. и задавать вопросы в режиме реального времени, подключайтесь к каналу DevOps by REBRAIN.
*Анонсы мероприятий каждую неделю
Практикумы для специалистов по инфраструктуре и разработчиков — https://rebrainme.com.
Наш Youtube-канал — https://www.youtube.com/channel/UC6uIx64IFKMVmj12gKtSgBQ.
Агентство Fevlake, проектируем и поддерживаем IT-инфраструктуры с 2012 года — https://fevlake.com.