# 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}]"}
    840 views