Docker

Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами. Изначально использовал возможности LXC, с 2015 года применял собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением Open Container Initiative начался переход от монолитной к модульной архитектуре.

Основные термины

Image (образ)

Образ в первом приближении можно рассматривать как набор файлов. В состав образа входит все необходимое для запуска и работы приложения на голой машине с докером: ОС, среда выполнения и приложение, готовое к развертыванию.

  • Образ — это набор файлов, необходимых для работы приложения на голой машине с установленным Docker.
  • Образ состоит из неизменяемых слоев, каждый из которых добавляет/удаляет/изменяет файлы из предыдущего слоя.
  • Неизменяемость слоев позволяет их использовать совместно в разных образах.

Docker-контейнеры

Контейнер - процесс, инициализированный на базе образа. То есть контейнер существует только когда запущен. Это как экземпляр класса, а образ это типа класс. Суть преобразования образа в контейнер состоит в добавлении верхнего слоя, для которого разрешена запись. Результаты работы приложения (файлы) пишутся именно в этом слое.

img

  • Host (хост) – среда, в которой запускается докер т.е ваша локальная машина.
  • Volume – дисковое пространство между хостом и контейнером. Это папка на вашей локальной машине примонтированная внутрь контейнера. Меняете тут меняется там, и наоборот.
  • Dockerfile – файл с набором инструкций для создания образа будущего контейнера
  • Service (сервис) – по сути это запущенный образ (один или несколько контейнеров), дополнительно сконфигурированный такими опциями как открытие портов, маппинг папок (volume) и прочее. Обычно это делается при помощи docker-compose.yml файла.
  • Docker-compose – тулза, облегчающая сборку и запуск системы состоящей из нескольких контейнеров, связанных между собой.
  • Build (билд, билдить) – процесс создания образа из набора инструкций в докерфайле, или нескольких докерфайлов, если билд делается с помощью композера

Популярные команды:

  • RUN
  • CMD
  • ENTRYPOINT
  • ADD
  • COPY
  • FROM
  • ENV
  • WORKDIR
  • ARG
  • LABEL
  • EXPOSE

RUN vs CMD vs ENTRYPOINT

Эти инструкции выполняются при сборке docker-образа из Dockerfile. RUN позволяет выполнять команды внутри вашего docker-образа — такие команды выполняются только один раз во время сборки и создают новый слой в итоговом docker-образе.

Если вам необходимо установить пакет или создать каталог внутри вашего docker-образа, то инструкция RUN подойдет вам как нельзя лучше. Например:

RUN mkdir -p /var/www/test

Инструкция CMD позволяет определить команду по умолчанию, которая будет выполняться при запуске вашего docker-контейнера (запущенный docker-образ называется контейнером). Эта инструкция не выполняется во время сборки!

Например, в Dockerfile для веб-приложения вполне логично добавить инструкцию CMD, которая запустит веб-сервер при старте контейнера, например:

CMD ["php", "-S", "0.0.0.0:9095", "-t", "public", "public/index.php"]
  1. Use RUN instructions to build your image by adding layers on top of initial image.
  2. Prefer ENTRYPOINT to CMD when building executable Docker image, and you need a command always to be executed. Additionally, use CMD if you need to provide extra default arguments that could be overwritten from command line when docker container runs.
  3. Choose CMD if you need to provide a default command and/or arguments that can be overwritten from command line when docker container runs.

Docker-compose

Пакетный менеджер Docker Compose, позволяющий описывать и запускать многоконтейнерные приложения. Конфигурационные файлы Compose описываются на языке YAML

Дополнительно: