1. Введение в Докер
Docker — это открытая платформа для создания, публикации и запуска приложений. Docker использует контейнеры в качестве базовой единицы разделения ресурсов и планирования. Контейнер инкапсулирует все среды, необходимые для запуска всего проекта. С помощью Docker вы можете отделить приложение от инфраструктуры и управлять инфраструктурой как приложением, чтобы быстро завершить проект. , развертывание и доставка.
Docker использует для разработки язык Go.Основываясь на контрольной группе ядра Linux, пространстве имен и AUFS-подобном Union FS и других технологиях, он инкапсулирует и изолирует процессы, что представляет собой технологию виртуализации на уровне операционной системы. Первоначальная реализация была основана на LXC, а начиная с версии 0.7 LXC был удален, вместо него использовался libcontainer собственной разработки.Начиная с версии 1.11, он был доработан для использования runC и containerd.
- runc: это инструмент командной строки Linux дляСпецификация времени выполнения контейнера OCIСоздание и запуск контейнеров.
- containerd: это демон, который управляет жизненным циклом контейнера, предоставляя минимальный набор функций для выполнения контейнеров и управления образами на узле.
На следующем рисунке показана разница между Docker и традиционными методами виртуализации: традиционная технология виртуальных машин заключается в том, чтобы виртуализировать набор оборудования, запустить на нем полную операционную систему, а затем запустить в системе необходимые процессы приложений; в то время как контейнеры Docker Приложение процесс внутри контейнера запускается непосредственно на ядре хоста.Контейнер не имеет собственного ядра и не выполняет аппаратную виртуализацию, поэтому он легче традиционных виртуальных машин.
2. Архитектура Docker и основные концепции
Docker использует архитектуру клиент-сервер, в которой клиент Docker отправляет команды демону Docker, который отвечает за создание, запуск и распространение контейнеров Docker. Клиент Docker и демон используют REST API для связи через сокеты UNIX или сетевые интерфейсы. Основные понятия заключаются в следующем:
2.1 Зеркало
Образ Docker (Image) — это специальная файловая система, содержащая ресурсы и среды, необходимые программе для запуска. Образ не содержит никаких динамических данных и его содержимое не будет изменено после построения.
Поскольку образ содержит полную операционную системуroot
Файловая система часто имеет огромные размеры, поэтому при разработке Docker он в полной мере использует технологию Union FS (union file system) и проектирует ее как иерархическую архитектуру хранения, поэтому образ фактически представляет собой комбинацию многоуровневых файловые системы состав. При построении изображения оно будет строиться слой за слоем, а предыдущий слой является основой следующего слоя, после построения каждого слоя он уже не будет изменяться, и любые изменения на последнем слое будут происходить только с его собственный слой. Например, операция удаления файла на предыдущем уровне фактически не удаляет файл на предыдущем уровне, а только помечает файл как удаленный на текущем уровне. При запуске финального контейнера, хотя этот файл и не будет виден, на самом деле файл всегда будет следовать за образом. Поэтому при построении образа требуется особая осторожность, и каждый слой должен содержать только то, что нужно добавить к этому слою, а все лишнее следует убрать до окончания построения слоя.
Функция многоуровневого хранения упрощает повторное использование и настройку изображений. Вы даже можете использовать ранее созданный образ в качестве базового слоя, а затем добавлять новые слои, чтобы настроить то, что вам нужно для создания нового образа.
2.2 Контейнеры
Отношения между изображением (Image) и контейнером (Container) аналогичны объектно-ориентированному программированию.类
а также实例
Точно так же образы являются статическими определениями, а контейнеры — это объекты при запуске образов.Контейнеры можно создавать, запускать, останавливать, удалять, приостанавливать и т. д.
Суть контейнера — это процесс, но в отличие от процесса, выполняемого непосредственно на хосте, процесс-контейнер работает в своем собственном, независимом пространстве имен. Таким образом, контейнер может иметь свой собственныйroot
файловая система, собственная сетевая конфигурация, собственное пространство процессов и даже собственное пространство идентификаторов пользователей. Процесс в контейнере выполняется в изолированной среде и используется так, как если бы он работал в системе, независимой от хоста.Эта особенность делает приложение, упакованное в контейнер, более безопасным, чем работающее непосредственно на хосте.
Как упоминалось ранее, образы используют многоуровневое хранилище, как и контейнеры. Каждая среда выполнения контейнера основана на образе в качестве базового уровня, и на нем создается слой хранения текущего контейнера, который можно назвать подготовленным для чтения и записи при запуске контейнера.слой хранения контейнеров. Жизненный цикл слоя хранения контейнера такой же, как и у самого контейнера.Когда умирает контейнер, уровень хранения контейнера также умирает. Поэтому любая информация, хранящаяся на уровне хранения контейнера, будет потеряна при удалении контейнера.
Согласно требованиям лучших практик Docker, контейнеры не должны записывать данные на свой уровень хранения, а уровень хранения контейнера должен оставаться без состояния. Все операции записи файлов должны использовать том данных (Volume) или привязывать каталог хоста.Чтение и запись в этих местах будут пропускать уровень хранения контейнера и напрямую читать и записывать на хост (или сетевое хранилище).Его производительность и более высокая стабильность. Жизненный цикл тома данных не зависит от контейнера.Когда умирает контейнер, том данных не умирает.Поэтому после использования тома данных данные не будут потеряны после удаления или повторного запуска контейнера.
2.3 Склад
После сборки образа его можно легко запустить на текущем хосте, но если вам нужно использовать образ на других серверах, вам понадобится централизованная служба для хранения и распространения образа, которой является реестр.Docker HubЭто общедоступный репозиторий образов, официально предоставленный Docker, который предоставляет образы большого количества часто используемого программного обеспечения.Конечно, в целях безопасности и конфиденциальности вы также можете создать свой собственный частный репозиторий.
2.4 Docker daemon
Демон Docker (dockerd) отвечает за прослушивание запросов Docker API и управление объектами Docker, такими как образы, контейнеры, сети и тома, а также может взаимодействовать друг с другом.
2.5 Docker Client
Клиент Docker (docker) — это основной способ взаимодействия пользователей с Docker. Когда вы используете такие команды, как docker run, клиент отправляет эти команды в dockerd, который заботится об их выполнении. Клиент Docker может взаимодействовать с несколькими dockerd s.
3. Общие команды Docker
Docker предоставляет большое количество команд для управления образами, контейнерами и сервисами, унифицированный формат команд:docker [OPTIONS] COMMAND
, где OPTIONS — необязательные параметры. Следует отметить, что выполнение команд Docker, как правило, требует привилегий root, потому что инструмент командной строки Docker docker и демон docker — это один и тот же бинарный файл, демон docker отвечает за получение и выполнение команд от docker, а для его работы требуются привилегии root. Все распространенные команды и сценарии их использования следующие:
3.1 Основные команды
- docker version: используется для просмотра информации о версии докера.
- docker info: используется для просмотра информации о конфигурации докера.
- docker help: для просмотра справочной информации
3.2 команда зеркалирования
1. имя образа поиска докеров
Найдите образ с указанным именем в официальном репозитории образов Docker Hub. Общие параметры--no-trunc
, что означает отображение полной информации об изображении.
2. docker images
Список информации обо всех изображениях верхнего уровня. Общие параметры следующие:
- -a: показать все зеркала, в том числе скрытые посередине
- -q: отображать только идентификатор зеркала
- --digests: Показать сводную информацию
- --no-trunc: Показать полную информацию о зеркале
3. имя образа docker pull [:TAG]
Скачайте образ из официального репозитория,:TAG
Это зеркальная версия, если ее не добавить, по умолчанию будет загружена последняя версия.
4. имя или идентификатор образа docker rmi [:TAG]
Удалить зеркало указанной версии без добавления:TAG
Последняя версия образа по умолчанию удаляется. Если есть контейнер на основе образа, образ нельзя удалить напрямую, можно использовать параметр-f
, что означает принудительное удаление. Команда rmi поддерживает пакетное удаление, а несколько имен изображений разделяются пробелами. Если вы хотите удалить все зеркала, вы можете использовать командуdocker rmi -f $(docker images -qa)
.
3.3 Команды, связанные с контейнером
1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
run — самая основная команда в докере, она используется для создания и запуска контейнера, имеет много доступных параметров и может использоватьсяdocker run --help
Посмотреть все доступные параметры. Общие параметры следующие:
- -i: указывает, что используется интерактивный режим, а входной поток всегда остается открытым;
-
-t: Указывает, что выделить псевдо терминал, обычно и
-i
При совместном использовании это означает использование псевдотерминала для взаимодействия с контейнером; - -d: запустить контейнер в фоновом режиме;
- --name: Укажите имя контейнера для запуска контейнера, если не указано, оно будет назначено докером случайным образом;
- -c: значение доли, используемое для выделения ЦП всем процессам, работающим в контейнере, которое является относительным весом, а фактическая скорость обработки связана с ЦП хоста;
- -m: используется для ограничения общего объема памяти, выделяемой для всех процессов в контейнере, в единицах B, K, M, G;
-
-v: Смонтируйте том тома данных, вы можете использовать несколько
-v
Параметр монтирует несколько томов одновременно. Формат тома:[host-dir]:[container-dir]:[rw:ro]
,[rw:ro]
режим, используемый для указания объема данных,rw
означает режим чтения и записи,ro
Представляет режим только для чтения. -
-p: порт, используемый для предоставления порта контейнера порту хоста в формате:
hostPort:containerPort
, открывая порт, внешний узел может получить доступ к приложению в контейнере.
2. docker ps [OPTIONS]
Список всех запущенных в данный момент контейнеров. Общие параметры следующие:
- -a: список всех контейнеров, как запущенных, так и остановленных.
- -n: показать n последних созданных контейнеров
- -q: отображать только номер контейнера
- --no-trunc: не усекать выходную информацию
3. Start\Restart\Stop\Force Stop контейнер
Команды, связанные с запуском и остановкой контейнера:docker start|restart|stop|kill 容器名或ID
, команда start используется для запуска существующего контейнера, restart используется для перезапуска работающего контейнера, stop используется для остановки работающего контейнера, а kill используется для принудительной остановки контейнера.
4. Войдите в запущенный контейнер
Чтобы войти в работающий контейнер и взаимодействовать с основным процессом контейнера, есть два распространенных метода:
- имя или идентификатор контейнера прикрепления докера
- docker exec -it имя или идентификатор контейнера /bin/bash
5. Выйти из контейнера
Чтобы выйти из запущенного контейнера, есть два распространенных метода:
- exit: выйти и остановить контейнер;
- ctrl+P+Q:покидать.
6. имя или идентификатор контейнера docker rm
Удалить остановленный контейнер, общие параметры-f
, что означает принудительное удаление контейнера, даже если контейнер все еще работает. Чтобы удалить все контейнеры, вы можете использоватьdocker rm -f $(docker ps -aq)
Заказ.
7. Просмотр информации о контейнере
можно использоватьdocker inspect [OPTIONS] NAME|ID [NAME|ID...]
Просмотр сведений о контейнере или образе Для просмотра указанной информации можно использовать-- format
параметр для указания формата шаблона вывода, например:
docker inspect --format='{{.NetworkSettings}}' 32cb3ace3279
8. Просмотр журнала работы контейнера
можно использоватьdocker logs [OPTIONS] CONTAINER
Просмотр журнала выполнения процесса в контейнере.Общие параметры следующие:
- --details: Показать подробности журнала
- -f: показать следующий вывод журнала
- --tail: Отображение данных указанной строки с конца
- -t: показать временную метку
- --since:Время начала
- --until: Время окончания
4. Докерфайл
Dockerfile — это текстовый файл, используемый Docker для создания образов. Он содержит пользовательские инструкции и форматы. Вы можете создавать образы из файлов dockerfile с помощью команды сборки. Формат команды:docker build [OPTIONS] PATH | URL | -
.
Dockerfile описывает шаги по сборке образа, где каждая инструкция выполняется отдельно. За исключением инструкции FROM, все остальные инструкции будут выполняться на основе изображения, сгенерированного предыдущей инструкцией.После выполнения будет сгенерирован новый слой изображения, и новый слой изображения будет наложен на исходное изображение, чтобы сформировать новое изображение. Чтобы ускорить сборку образа, Docker Daemon кэширует промежуточные образы в процессе сборки. При создании образа он сравнивает следующую инструкцию в файле докеров со всеми фрагментами базового образа.Если есть фрагмент, созданный той же инструкцией, он попадет в кеш и будет использовать образ напрямую вместо создания другого. зеркало. Общие команды следующие:
1. FROM
Директива FROM используется для указания базового образа, поэтому все файлы докеров должны начинаться с директивы FROM. Команда FROM может появляться несколько раз, что приведет к созданию нескольких образов.После создания каждого образа интерфейс командной строки Docker выводит идентификатор образа. Общий формат команды:FROM <image>[:<tag>] [AS <name>]
.
2. MAINTAINER
Команду MAINTAINER можно использовать для установки имени автора и адреса электронной почты.В настоящее время команда MAINTAINER помечена как устаревшая, и официально рекомендуется использовать вместо нее LABEL.
3. LABEL
Директива LABEL может использоваться для указания метаданных, связанных с изображением. Формат:LABEL <key>=<value> <key>=<value> <key>=<value> ...
.
4. ENV
Инструкция ENV используется для объявления переменных среды. На объявленные переменные среды можно ссылаться в следующих инструкциях.$variable_name
или${variable_name}
. Есть два распространенных формата:
-
ENV <key> <value>
: используется для установки одной переменной окружения; -
ENV <key>=<value> ...
: используется для одновременной установки нескольких переменных среды.
5. EXPOSE
EXPOSE используется для указания номера порта, предоставляемого контейнером, формат:EXPOSE <port> [<port>/<protocol>...]
, вы можете указать, прослушивает ли порт TCP или UDP, если протокол не указан, по умолчанию используется TCP.
6. WORKDIR
WORKDIR используется для указания рабочего каталога, его можно использовать несколько раз. Если указан относительный путь, он будет относиться к пути предыдущей инструкции WORKDIR. Пример выглядит следующим образом:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd # 此时pwd为:/a/b/c
7. COPY
Общий формат инструкции COPY:COPY <src>... <dest>
, который используется для добавления файлов по указанному пути в новый образ Целевой путь копии может не существовать, и программа автоматически создаст его.
8. ADD
Обычный формат инструкции ADD:COPY <src>... <dest>
, которая похожа на инструкцию COPY, но более мощная, например.Src
сетевой адрес вспомогательного файла, и еслиSrc
Он указывает на сжатый файл, и ADD автоматически распаковывает его после завершения копирования.
9. RUN
Команда RUN создаст контейнер на основе образа, созданного предыдущей командой, запустит команду в контейнере и отправит контейнер как новый образ после завершения команды. Он поддерживает следующие два формата:
-
RUN <command>
(shellФормат) -
RUN ["executable", "param1", "param2"]
(execФормат)
При использовании формата оболочки команда передается через/bin/sh -c
run, тогда как при использовании формата exec команда запускается напрямую, контейнер не вызывает оболочку, что означает, что нормальная обработка оболочки не происходит. Например,RUN ["echo","$HOME"]
не правильно$HOME
Выполните подстановку переменных, правильный формат должен быть:RUN ["sh","-c","echo $HOME"]
. Та же проблема существует со следующей инструкцией CMD.
10. CMD
-
CMD ["executable","param1","param2"]
(execформат желательно) -
CMD ["param1","param2"]
(так какENTRYPOINTпараметры по умолчанию) -
CMD command param1 param2
(shellФормат)
Инструкции CMD предоставляют значения по умолчанию для среды выполнения контейнера, которые могут быть инструкцией или некоторыми параметрами. В файле докеров может быть несколько инструкций CMD, но действительна только последняя инструкция CMD. Формат команды инструкции CMD такой же, как у инструкции RUN, но функции разные: инструкция RUN используется для создания нового образа на этапе построения образа, а инструкция CMD используется по умолчанию в контейнере. На этапе запуска инструкция CMD используется в качестве первой выполняемой команды. Если пользователь указывает новый параметр команды при запуске докера, он перезапишет команду в инструкции CMD.
11. ENTRYPOINT
Директива ENTRYPOINT поддерживает следующие два формата:
-
ENTRYPOINT ["executable", "param1", "param2"]
(execформат первый) -
ENTRYPOINT command param1 param2
(shellФормат)
Директива ENTRYPOINT аналогична директиве CMD тем, что позволяет контейнеру выполнять одну и ту же команду при каждом запуске. Но разница в том, что за CMD могут следовать параметры или команды, а за ENTRYPOINT могут быть только команды; кроме того, рабочие параметры, предоставляемые командой запуска docker, могут переопределять CMD, но не ENTRYPOINT, что означает, что команда на инструкции ENTRYPOINT будет казнен. . Следующий фрагмент докерфайла:
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
при исполненииdocker run -it image
, то выходhello world
, и когда вы выполняетеdocker run -it image spring
, параметры в CMD будут перезаписаны, а выводhello spring
.
5. Кейсы
5.1 Развертывание проекта Spring Boot на основе образа Centos
Большинство проектов в производственной среде обычно развертываются на серверах Linux.Здесь мы начинаем с базового образа Linux и упаковываем наш проект (здесь, например, проект Spring Boot) в полный исполняемый образ. Сначала нужно создатьDockerfileфайл со следующим содержимым:
# 以官方仓库的centos镜像为基础开始创建
FROM centos
# 作者信息
MAINTAINER heibaiying@heibaiying.com
# 把JDK安装包拷贝到容器中并自动进行解压
ADD jdk-8u211-linux-x64.tar.gz /usr/java/
# 拷贝项目Jar包到容器中
COPY spring-boot-base.jar /usr/app/
# 配置Java环境变量
ENV JAVA_HOME /usr/java/jdk1.8.0_211
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH ${JAVA_HOME}/bin:$PATH
# 项目启动命令
ENTRYPOINT ["java", "-jar", "/usr/app/spring-boot-base.jar"]
Поместите пакет установки JDK, пакет Jar проекта Spring Boot и файл Dockerfile в один каталог, а затем выполните следующую команду сборки образа:
docker build -t spring-boot-base-java:latest .
После сборки образа его можно запустить следующей командой:
docker run -it -p 8080:8080 spring-boot-base-java
Здесь, чтобы наблюдать за эффектом запуска, он запускается интерактивным способом, который можно использовать при фактическом развертывании.-d
Параметры запускаются в фоновом режиме, и вывод выглядит следующим образом:
5.2 Развертывание проекта Spring Boot на основе образа JDK
Для вышеупомянутого проекта мы начали сборку на основе самого простого образа Centos, но, поскольку образ JDK уже предоставлен на Docker Hub, мы также можем выбрать сборку из образа JDK, и процесс сборки на данный момент проще. Шаги сборки точно такие же, как описано выше, но содержимое Dockerfile отличается следующим образом:
# 由于只需要运行环境,这里我们直接以官方仓库的jre镜像为基础开始创建
FROM openjdk:8u212-jre
# 作者信息
MAINTAINER heibaiying@heibaiying.com
# 拷贝项目Jar包到容器中
COPY spring-boot-base.jar /usr/app/
# 项目启动命令
ENTRYPOINT ["java", "-jar", "/usr/app/spring-boot-base.jar"]
использованная литература
- Официальное введение Докера:docs.docker.com/engine/dock…
- Официальная документация Docker CLI и Dockerfile:docs.docker.com/reference/
- Лаборатория SEL Чжэцзянского университета. Docker Container и Container Cloud (2-е издание). People's Posts and Tele Communications Press. 2016-10
- Докер от входа к практике:Есть easy.git books.IO/docker_PR AC…
Для получения дополнительных статей, пожалуйста, посетите [Руководство для разработчиков полного стека], адрес GitHub:GitHub.com/Black and WhiteShould/…