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'шка.
- Посмотреть список всех образов, что есть на данным момент на вашей машине:
docker images
- Скачать какой-нибудь образ из космоса:
docker pull <имя образа>
- Еще можно качать конкретную версию:
docker pull <имя образа>:<версия, она же тег>
> - Удалить образ:
docker rmi <имя образа>
Контейнеры
Контейнеры, это такие очень изолированные штуки, которые получаются когда образ "разворачивается в память и запускается". Представьте себе образ виртуальной машины, из которого можно создать хоть тысячу запущенных инстансов.
- Запущенные контейнеры
docker ps
- Все контейнеры
docker ps -a
- Создать и запустить контейнер
docker run --name=<имя контейнера> <имя образа>
- Запустить уже созданный контейнер
docker start <имя контейнера>
- Остановить контейнер
docker stop <имя контейнера>
- Удалить контейнер
docker rm <имя контейнера>
Есть еще пара полезных ключей для запуска:
--detach, -d, --interactive, -i, --tty, -t и --publish, -p
Параметр --name можно и не задавать, Docker сам присвоит какое-нить смешное в духе thursty_bison. Имя можно использовать в дальнейшем как имя этого хоста внутри сети.
Сети
Все контейнеры живут в изолированных сетях. Это вам не виртуалка на бридже!
- Список сетей
docker network ls
- Создать сеть
docker network create <имя сети>
- Удалить сеть
docker network rm <имя сети>
- Указать сеть для контейнера на запуске
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
- Посмотреть список всех томов
docker volume ls
- Создать том
docker volume create <имя тома>
- Создать и запустить контейнер, автоматически создав и замонтировав том
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, очень удобно смотреть, чекак настроен контейнер, сеть или том.
docker inspect <имя контейнера>
docker network inspect <имя сети>
docker volume inspect <имя тома>
Если хочется разобраться глубже, идем читать туториал