# Docker
<img src="https://i.imgur.com/OJrN2pq.jpg" style="background:none; border:none; box-shadow:none;">
---
<p style='text-align: justify;'>
Docker - программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации.
</p>
---
### Виртуализация vs докер
<img src="https://i.imgur.com/5SYpeqa.jpg" style="background:none; border:none; box-shadow:none;">
---
### Виртуализация vs докер
<img src="https://i.imgur.com/LYKgPJ7.png" style="background:none; border:none; box-shadow:none;">
---
<img src="https://i.imgur.com/iNIIcju.png" style="background:none; border:none; box-shadow:none;">
---
### Docker CLI
- Консольная утилита для работы с докер-демоном
- Может работать не только локально, но и по сети
---
### Docker Daemon
- Серверная часть
- Работает на хост-машине
- Скачивает образы и запускает из них контейнеры
- Создает сеть между контейнерами
- Собирает логи контейнеров
- Создает новый образ
---
### Docker Registry
- хранит докер образы
- может быть публичным (DockerHub) и приватным
---
### Image and container
<img src="https://i.imgur.com/yLkRjgM.png" style="height:500px; background:none; border:none; box-shadow:none;">
---
## Создание докер контейнера
<img src="https://i.imgur.com/gVX8mfs.png" style="background:none; border:none; box-shadow:none;">
---
### Docker Image
- Упаковка нашего контейнера
- Из них запускаются контейнеры
- Хранятся в докер-реестрах (registry)
- Имеют hash, имя и tag
- Имеют «слоёную» структуру
- Создаются (build’ятся) по инструкции (Dockerfile)
---
Dockerfile
```dockerfile
FROM python:3.7-alpine
WORKDIR /app
COPY requirements.txt /app
RUN pip3 install -r requirements.txt --no-cache-dir
COPY . /app
ENTRYPOINT ["python3"]
CMD ["app.py"]
```
---
#### Dockerfile commands
Выбор базового образа (FROM):
```Dockerfile
FROM <image>[:<tag>] [AS <name>]
```
```Dockerfile
FROM python:3.7
```
---
Запуск команд (RUN):
```
RUN has 2 forms:
RUN <command> (shell form, the command is run in a shell,
which by default is /bin/sh -c on Linux)
RUN ["executable", "param1", "param2"] (exec form)
```
```Dockerfile
RUN pip install -r requirements.txt
```
---
Запуск программы в контейнере
```dockerfile
ENTRYPOINT ["python3"]
CMD ["app.py"]
```
```
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
```
```
The CMD instruction has three forms:
CMD ["executable","param1","param2"] (exec form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
```
```dockerfile
CMD ["python3", "app.py"]
CMD python3 app.py
```
<p style='text-align: justify; font-size:25px'>
https://docs.docker.com/engine/reference/builder/#understand-how-cmd-and-entrypoint-interact</p>
---
Добавление файлов в образ
```dockerfile
COPY /source/file/path /destination/path
ADD /source/file/path /destination/path
ADD source.file.tar.gz /temp
ADD http://source.file/url /destination/path
```
https://phoenixnap.com/kb/docker-add-vs-copy
---
#### USER
```dockerfile
USER <user>[:<group>]
USER <UID>[:<GID>]
```
```dockerfile
USER root
ARG DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get -yq dist-upgrade \
&& apt-get install -yq --no-install-recommends \
wget \
bzip2 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
ENV NB_USER=jovyan \
NB_UID=1000
RUN useradd -m -s /bin/bash -N -u $NB_UID $NB_USER
USER $NB_USER
```
---
Порты в контейнере
```dockerfile
EXPOSE <port> [<port>/<protocol>...]
```
```dockerfile
EXPOSE 80
```
<p style='text-align: justify; font-size:25px'>
The EXPOSE instruction <b>does not actually publish the port</b>. It functions as a type of documentation between the person who builds the image and the person who runs the container, about which ports are intended to be published.
</p>
---
### ENV and ARG
```dockerfile
ARG <name>[=<default value>]
ENV <key>=<value> ...
```
```dockerfile
ARG MINICONDA_VERSION=py38_4.9.2
ENV NVIDIA_VISIBLE_DEVICES=all
```
```
docker build --build-arg <key>=<value> .
docker run --env <key>=<value>
```
---
<img src="https://d33wubrfki0l68.cloudfront.net/8d799fc311d166c3a7d9f1a7970e1dd1d43bf141/0a855/images/docker-env-vars/docker_environment_build_args.png" style="background:none; border:none; box-shadow:none;">
https://vsupalov.com/docker-arg-vs-env/
---
### Полезные ссылки
- https://docs.docker.com/engine/reference/builder/
- https://goinbigdata.com/docker-run-vs-cmd-vs-entrypoint/
- https://phoenixnap.com/kb/docker-add-vs-copy
---
### Уменьшение размера образа
- dockerignore
- минимальные образы линукса (alpine)
- удаление кэша apt-get
```Dockerfile
RUN apt-get update && apt-get install -y cmake wget \
&& rm -rf /var/lib/apt/lists/*
```
---
### Полезные советы
- часто изменяемые слои ставить в конец докер файла
- фиксировать версии зависимостей, не использовать тег latest
- не запускать процесс от root пользователя
---
### Docker container
- Запускается из образа
- Изолирован
- Должен содержать в себе всё для работы приложения
- 1 процесс – 1 контейнер
---
### Container layers
<img src="https://i.imgur.com/4raQaLy.jpg" style="background:none; border:none; box-shadow:none;">
---
### Основные команды докера
```
docker pull <<name>> - скачать образ из регистри на машину
docker build <</path/to/dir>> - собрать образ
docker run <<name>> - запустить контейнер
docker ps - список работающих контейнеров
docker start/stop/restart <<name>> - работа с контейнером
docker rm <<name>> - удалить контейнер
docker logs <<name>> - логи контейнера
```
---
### Docker volumes
<p style='text-align: justify; font-size:25px'>
- <b>Volumes</b> are stored in a part of the host filesystem which is managed by Docker (/var/lib/docker/volumes/ on Linux). Non-Docker processes should not modify this part of the filesystem.</p>
<p style='text-align: justify; font-size:25px'>
- <b>Bind mounts</b> may be stored anywhere on the host system. Non-Docker processes on the Docker host or a Docker container can modify them at any time.</p>
<p style='text-align: justify; font-size:25px'>
- <b>tmpfs mounts</b> are stored in the host system’s memory only, and are never written to the host system’s filesystem.
</p>
<img src="https://docs.docker.com/storage/images/types-of-mounts-volume.png" style="background:none; border:none; box-shadow:none;">
---
### Docker network
<img src="https://i.imgur.com/q5wKccT.png" style="background:none; border:none; box-shadow:none;">
---
### Docker-compose
- Позволяет запустить и настроить многоконтейнерное приложение
- Все описываем в docker-compose.yml
- Создает свою сеть проекту
- Дает возможность обращаться контейнерам друг к другу по именам
---
### Docker-compose
```yaml
version: '3'
services:
web:
build: app
ports:
- '5000:5000'
```
---
### Основные команды docker-compose
```
docker-compose build – собрать проект
docker-compose up –d – запустить проект
docker-compose down – остановить проект
docker-compose logs -f [service name]` – посмотреть логи сервиса
docker-compose ps – вывести список контейнеров
docker-compose exec [service name] [command] – выполнить команду
docker-compose images – список образов
```
---
### Kubernetes
<img src="https://hackr.io/blog/media/kubernetes-architecure.png" style="background:none; border:none; box-shadow:none;">
---
<p style='text-align: justify; font-size:35px'>
Kubernetes adds distributed computing features on top of containers:</p>
<p style='text-align: justify; font-size:30px'>
- <b>Pods</b>: pods are logical groups of containers that share resources like memory, CPU, storage, and network.</p>
<p style='text-align: justify; font-size:30px'>
- <b>Auto-scaling</b>: Kubernetes can automatically adapt to changing workloads by starting and stopping pods as needed.</p>
<p style='text-align: justify; font-size:30px'>
- <b>Self-healing</b>: containers are monitored and restarted on failure.</p>
<p style='text-align: justify; font-size:30px'>
- <b>Load-balancing</b>: requests are distributed over the healthy available pods.</p>
<p style='text-align: justify; font-size:30px'>
- <b>Rollouts</b>: Kubernetes supports automated rollouts and rollbacks. Making otherwise complex procedures like Canary and Blue-Green releases trivial.</p>
{"metaMigratedAt":"2023-06-15T21:03:29.433Z","metaMigratedFrom":"YAML","title":"Docker","breaks":true,"description":"Docker","slideOptions":"{\"transition\":\"none\",\"progress\":false,\"slideNumber\":true,\"theme\":\"white\"}","contributors":"[{\"id\":\"afb6236d-117e-49ec-841e-c28a3996a432\",\"add\":12177,\"del\":3711}]"}