Читайте эту статью на ReBrainMe!!! Здесь пишу только я, а там толпа обалденных спецов! Рекомендую.

Docker – де-факто стандартный движок контейнеризации, который повсеместно используется для запуска приложения как в окружениях для разработки, так и в публичных\высоконагруженных средах. Подробнее о терминологии можно узнать здесь.

Задача данной статьи состоит в том, чтобы поставить и запустить Docker локально, начать знакомство с этой интереснейшей системой и усвоить основы.

Установка Docker

У Docker есть официальные инструкции по установке. На практике, я пользовался установочным скриптом (для Linux):

curl -LO 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. Файла, по умолчанию, может и не быть – создайте. Содержимое к добавлению:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "1"
  }
}

Таким образом мы настраиваем 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.