---
# System prepended metadata

title: Docker
tags: [docker]

---

---
title: Docker
tags: docker
description: Docker
slideOptions:
  transition: none
  progress: false
  slideNumber: true
  theme: white
---

# 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>
