Docker. Напоминалка

Сейчас в моде все пихать в контейнеры. Это типа как виртуальные машины только нет. По лесу ходят легенды, что если засунуть все приложения в контейнеры наступит безопасность, всеобщее счастье и вообще коммунизм. Поэтому я тут попробовал завернуть всякое разное в Docker. А чтобы не забыть пишу эту напоминалку.

Падажжи ебана мем про Docker

Установка Docker

В вашем любимом дистрибутиве "установить docker". Для моей любимой Fedora:

sudo dnf install docker

Запускаем демона, ну и автостарт ему включаем:

sudo systemctl start docker

sudo systemctl enable docker

Проверяем, что все работает

sudo docker run hello-world

Должны всякие буквы вылезти. Вылезут ок, не вылезут, решайте сами вот мануал

А теперь, чтобы sudo лишний раз не теребить добавим себя любимого в группу.

sudo groupadd docker

sudo usermod -aG docker $USER

Выходим, заходим, заодно можно демона перезапустить? Проверяем.

docker run hello-world

Не сработало? Делай как нуб, перезагружай машину!

Образы

В Docker есть несколько простых сущностей: image, container, volume, network. Остальное пока не важно.

Image, он же образ, это прямо вот образ в котором "запечен" какой-то линукс и поверх все, что вы или кто-то другой напихал. Типа как iso'шка.

  1. Посмотреть список всех образов, что есть на данным момент на вашей машине:
    docker images
  2. Скачать какой-нибудь образ из космоса:
    docker pull <имя образа>
  3. Еще можно качать конкретную версию:
    docker pull <имя образа>:<версия, она же тег>>
  4. Удалить образ:
    docker rmi <имя образа>

Контейнеры

Контейнеры, это такие очень изолированные штуки, которые получаются когда образ "разворачивается в память и запускается". Представьте себе образ виртуальной машины, из которого можно создать хоть тысячу запущенных инстансов.

  1. Запущенные контейнеры
    docker ps
  2. Все контейнеры
    docker ps -a
  3. Создать и запустить контейнер
    docker run --name=<имя контейнера> <имя образа>
  4. Запустить уже созданный контейнер
    docker start <имя контейнера>
  5. Остановить контейнер
    docker stop <имя контейнера>
  6. Удалить контейнер
    docker rm <имя контейнера>

Есть еще пара полезных ключей для запуска:
--detach, -d, --interactive, -i, --tty, -t и --publish, -p

Параметр --name можно и не задавать, Docker сам присвоит какое-нить смешное в духе thursty_bison. Имя можно использовать в дальнейшем как имя этого хоста внутри сети.

Сети

Все контейнеры живут в изолированных сетях. Это вам не виртуалка на бридже!

  1. Список сетей
    docker network ls
  2. Создать сеть
    docker network create <имя сети>
  3. Удалить сеть
    docker network rm <имя сети>
  4. Указать сеть для контейнера на запуске
    docker run --network=<имя сети> <имя образа>

Сети очень удобно использовать, чтобы контейнеры как-то могли общаться друг с другом. Например, если у вас есть реверс-прокси и 2 вордпреса. Добавляете их всех в одну сеть. А дальше, имя контейнера можно использовать как имя хоста например в конфиге реверс-прокси. В старых мануалах для этого использовался ключ --link, теперь он устарел и ваще не модный.

Volume ну или "Том?"

Контейнеры это считай immutable сущности, почти read-only. И если контейнер остановить, инфа пропала. И если нужно что-то сохранить, удобно использовать volumes. Это такая штука, чтобы замонтировать что-то с файловой системы хоста, где запущен Docker, на файловую систему контейнера. Например, создать и запустить контейнер nginx с конфигом который лежит где-то на хосте:

docker run -v /somepath/nginx.conf:/etc/nginx/nginx.conf -p 80:80 nginx

Тут есть момент с SELinux. Если контейнер не может запуситься, а пути вы указали верно, попробуйте использовать суффикс :z, это настроит метки SELinux для этого пути как надо:

docker run -v /somepath/nginx.conf:/etc/nginx/nginx.conf:z -p 80:80 nginx

  1. Посмотреть список всех томов
    docker volume ls
  2. Создать том
    docker volume create <имя тома>
  3. Создать и запустить контейнер, автоматически создав и замонтировав том
    docker run -v <имя тома>:/var/www <имя образа>

Тома для хоста, считай папки, лежат обычно тут /var/lib/docker/volumes

Логи

Часто бывает, что контейнер запускается и сразу же останавливается потому что ошибка. Посмотреть логи можно с помощью:

docker logs <имя контейнера>

Создание своих образов

И последнее, можно мутить свои образы. Для этого создаем какую-нибудь папку, а в ней файл Dockerfile. Там есть несколько директив.

FROM - с какого образа начнем "наслаивать" свой.
RUN - запустить команду, например yum update
COPY <что> <куда> - скопировать файл. Первый параметр путь к файлу относительно текущей папки на хосте. Второй, путь внутри образа. Важно не накосячить. Я например по невнимательности создавая новый образ написал:

COPY nginx.conf /etc/nginx/nginx.conf;

И долго не мог понять, почему в запущенном контейнере был дефолтный /etc/nginx/nginx.conf, а не тот, что должен был быть скопирован. А потому, что точка с запятой тут нахуй не нужна и Docker все правильно сделал, скопировал мой nginx.conf в /etc/nginx/nginx.conf; а nginx читал /etc/nginx/nginx.conf Отакот.

И последнее, есть команда inspect, очень удобно смотреть, чекак настроен контейнер, сеть или том.

  1. docker inspect <имя контейнера>
  2. docker network inspect <имя сети>
  3. docker volume inspect <имя тома>

Если хочется разобраться глубже, идем читать туториал