Docker
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами. Изначально использовал возможности LXC, с 2015 года применял собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением Open Container Initiative начался переход от монолитной к модульной архитектуре.
Основные термины
Image (образ)
Образ в первом приближении можно рассматривать как набор файлов. В состав образа входит все необходимое для запуска и работы приложения на голой машине с докером: ОС, среда выполнения и приложение, готовое к развертыванию.
- Образ — это набор файлов, необходимых для работы приложения на голой машине с установленным Docker.
- Образ состоит из неизменяемых слоев, каждый из которых добавляет/удаляет/изменяет файлы из предыдущего слоя.
- Неизменяемость слоев позволяет их использовать совместно в разных образах.
Docker-контейнеры
Контейнер - процесс, инициализированный на базе образа. То есть контейнер существует только когда запущен. Это как экземпляр класса, а образ это типа класс. Суть преобразования образа в контейнер состоит в добавлении верхнего слоя, для которого разрешена запись. Результаты работы приложения (файлы) пишутся именно в этом слое.
- 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"]
- Use RUN instructions to build your image by adding layers on top of initial image.
- 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.
- 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
Дополнительно: