Docker Compose - группа контейнеров
# Docker
> Запуск своего софта с одними и теми же параметрами на разных средах\
> Удобство переноса приложения между различными ПК, средами, серверами
## Термины
| | |
|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **OC Linux (ПК, или сервер)** | user 0 (root), user 1000 |
| -> **Docker Demon (софт)** | Обрабатывает реестр образов, список запущенных контейнеров, список томов, сетей |
| -> **Образ данных (php, java)** | Docker Image - образ данных php, java, mysql
DockerHub - хранилище образов - https://hub.docker.com/
DockerFile - слои на готовый образ со своими настройками |
| -> **Контейнер с образом** | Работающие приложения на основе образа, изолированое от окружения
Каждый элемент приложения (образ) запускаеться в изолированной среде Linux
Linux Kernel > Debian (base) > Soft (php) > слой для записи |
### Основные элементы и настройки контейнера:
- Образ данных определенный в контейнере
- Заданного порта (лок.комп:внутри), первый про localhost:port
- Томов (пользовательские данные, необходимые для работы образа)
- Проброшенных аргументов с параметрами (из .ENV файла, через команду)
- Заданных прав root(0), www-data(1000) при работе внутри контейнера
- Заданной настройки поведения сети
- В любой поднятый контейнер можно провалиться и выполнить команду внутри него (т.к. это ОС запущенная в ОС)
### Варианты запуска контейнер(а)ов
- Вариант 1) Запуск одного произвольного контейнера, число не ограниченно (hellow world phpmyadmin)
> **$ docker run --name phpmyadmin -d -e PMA_HOST=dbhost -p 8080:80 phpmyadmin**
- Вариант 2) Запуск несколько (группы) контейнеров описанных в файле docker-compose.yml
> **$ docker-compose up -d**
## Команды
```bash
$ docker --version # узнать установленную версию Docker;
$ docker info # получить расширенную информацию об установленном Docker
$ docker images ls -a
$ docker rmi $(docker images -a -q)
$ docker ps # перечислить все запущенные контейнеры вместе с дополнительной информацией о них;
$ docker ps -a # перечислить все контейнеры, включая остановленные, вместе с дополнительной информацией о них;
$ docker stop $(docker ps -a -q) # остановить все процессы
$ docker rm $(docker ps -a -q) # удалить все процессы
$ docker inspect
$ docker logs
$ docker exec -itbash # войти в контейнер (exit - выйти)
$ docker exec -it/bin/sh # войти в контейнер v2
$ docker-compose exec -Tcomposer run-script build:app # пересобрать проект на докере
$ docker-compose exec -Tphp artisan ...
$ docker-compose build # собрать сервисы (поднять) в контейнере
$ docker-compose up --force-recreate
$ docker-compose up -d # собрать сервисы (поднять) в контейнере
$ docker-compose up -d --build #
$ docker-compose down # остановить контейнер (опустить)
$ docker network ls # сети
$ docker network inspect
# В Docker есть несколько способов хранения данных. Наиболее распространенные:
# Volume это папка присоединенная к контейнеру для хранения данных
# * Bind mount: подключаются к любой точке файловой системы сервера (файл или каталог с хоста просто монтируется в контейнер);
# * Volume mount: управляются Docker и хранятся как часть файловой системы сервера (храняться здесь: /var/lib/docker/volumes/);
# * tmpfs mount: хранятся в оперативной памяти сервера, поэтому никогда не пишутся на реальную файловую систему сервера.
$ docker volume ls # вольюмы (постоянные данные)
$ docker volume rm $(docker volume ls -q) # удалить все вольюмы
```
## Права
- Есть мой комп (0=root, 1000=мой юзер).
- Nginx работает внутри контейнера под root=0 его **не нужно** переключать на www-data (пользователь 1000).
- Php-Fpm работает внутри контейнера под root=0 его также **не нужно** переключать на www-data (пользователь 1000).
**Но нужно:**
- сменить права владельца и группу на папку /var/www/html на www-data
- composer install делать внутри контейнера + нужно переключиться на пользователя www-data внутри контейнера. На продакшине также должен быть пользователь www-data (id=1000)
## Все возможные состояния контейнера
- Created — контейнер создан, но не активен.
- Restarting — контейнер в процессе перезапуска.
- Running — контейнер работает.
- Paused — контейнер приостановлен.
- Exited — контейнер закончил свою работу.
- Dead — контейнер, который сервис попытался остановить, но не смог.
## Перезапуск контейнеров
- Off: контейнер не перезапускается, если он остановился или аварийно завершил работу;
- On-failure: перезапуск только в случае аварийной остановки, но не по команде пользователя;
- Unless-stopped: перезапуск будет работать до тех пор, пока пользователь его не остановит;
- Always: перезапуск в любом случае, независимо от ошибок или других проблем.
## DockerFile
- FROM — задаёт базовый (родительский) образ.
- LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
- ENV — устанавливает постоянные переменные среды.
- RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
- COPY — копирует в контейнер файлы и папки.
- ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
- CMD — описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
- WORKDIR — задаёт рабочую директорию для следующей инструкции.
- ARG — задаёт переменные для передачи Docker во время сборки образа.
- ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
- EXPOSE — указывает на необходимость открыть порт.
- VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.
## Shell скрипт с выполнением команд внутри контейнера
```bash
$ docker exec -w /var/www/html -itphp -v
$ docker exec -w /var/www/html -itcomposer install
$ docker exec -w /var/www/html -itcomposer dump-autoload
```
## Сети
- Сети позволяют тебе изолированным и определенным способом заставить общаться контейнеры между собой
- Если не хочешь чтобы например фронт знал о базе, а знал только бек - уровень изоляции повышается
/interactive/content_wiki/soft.Docker-id-371.md