Поиск по сайту:

Docker для начинающих: все, что вам нужно знать


Docker создает упакованные приложения, называемые контейнерами. Каждый контейнер представляет собой изолированную среду, похожую на виртуальную машину (ВМ). В отличие от виртуальных машин, контейнеры Docker не работают под управлением полной операционной системы. Они совместно используют ядро вашего хоста и виртуализируются на программном уровне.

Основы докера

Docker стал стандартным инструментом для разработчиков программного обеспечения и системных администраторов. Это удобный способ быстро запускать приложения, не влияя на остальную часть вашей системы. Вы можете запустить новый сервис с помощью одной команды docker run.

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

Образы определяют программное обеспечение, доступное в контейнерах. Это примерно эквивалентно запуску виртуальной машины с ISO-образом операционной системы. Если вы создадите образ, любой пользователь Docker сможет запустить ваше приложение с помощью docker run.

Как работает Докер?

Контейнеры используют функции ядра операционной системы для предоставления частично виртуализированных сред. Контейнеры можно создавать с нуля с помощью таких команд, как chroot. Это запускает процесс с указанным корневым каталогом вместо системного корня. Но прямое использование функций ядра неудобно, небезопасно и чревато ошибками.

Docker — это комплексное решение для производства, распространения и использования контейнеров. Современные выпуски Docker состоят из нескольких независимых компонентов. Во-первых, это CLI Docker, с которым вы взаимодействуете в своем терминале. CLI отправляет команды демону Docker. Это может работать локально или на удаленном хосте. Демон отвечает за управление контейнерами и образами, из которых они созданы.

Последний компонент называется среда выполнения контейнера. Среда выполнения вызывает функции ядра для фактического запуска контейнеров. Docker совместим со средами выполнения, которые соответствуют спецификации OCI. Этот открытый стандарт обеспечивает взаимодействие между различными инструментами контейнеризации.

Вам не нужно слишком беспокоиться о внутренней работе Docker, когда вы только начинаете. Установка docker в вашей системе даст вам все необходимое для создания и запуска контейнеров.

Почему так много людей используют Docker?

Контейнеры стали настолько популярными, потому что они решают многие распространенные проблемы в разработке программного обеспечения. Возможность контейнеризации один раз и запускать везде сокращает разрыв между вашей средой разработки и рабочими серверами.

Использование контейнеров дает вам уверенность в том, что все среды идентичны. Если у вас есть новый член команды, ему достаточно docker run, чтобы настроить собственный экземпляр разработки. При запуске службы вы можете использовать образ Docker для развертывания в рабочей среде. Живая среда будет точно соответствовать вашему локальному экземпляру, избегая сценариев «это работает на моей машине».

Docker удобнее, чем полноценная виртуальная машина. Виртуальные машины — это инструменты общего назначения, предназначенные для поддержки всех возможных рабочих нагрузок. Контейнеры, напротив, легкие, самодостаточные и лучше подходят для одноразового использования. Поскольку Docker разделяет ядро хоста, контейнеры оказывают незначительное влияние на производительность системы. Время запуска контейнера практически мгновенное, так как вы запускаете только процессы, а не всю операционную систему.

Начиная

Docker доступен во всех популярных дистрибутивах Linux. Он также работает на Windows и macOS. Следуйте инструкциям по настройке Docker для вашей платформы, чтобы запустить его.

Вы можете проверить, что ваша установка работает, запустив простой контейнер:

docker run hello-world

Это запустит новый контейнер с базовым изображением hello-world. Изображение выдает некоторый вывод, объясняющий, как использовать Docker. Затем контейнер выходит, возвращая вас обратно к терминалу.

Создание изображений

После запуска hello-world вы готовы создавать собственные образы Docker. Dockerfile описывает, как запустить службу, установив необходимое программное обеспечение и скопировав файлы. Вот простой пример использования веб-сервера Apache:

FROM httpd:latest
RUN echo "LoadModule headers_module modules/mod_headers.so" >> /usr/local/apache2/conf/httpd.conf
COPY .htaccess /var/www/html/.htaccess
COPY index.html /var/www/html/index.html
COPY css/ /var/www/html/css

Строка FROM определяет базовое изображение. В данном случае мы начинаем с официального образа Apache. Docker применяет оставшиеся инструкции в вашем Dockerfile поверх базового образа.

Этап RUN запускает команду внутри контейнера. Это может быть любая команда, доступная в среде контейнера. Мы включаем модуль Apache headers, который может использоваться файлом .htaccess для настройки правил маршрутизации.

Последние строки копируют файлы HTML и CSS из вашего рабочего каталога в образ контейнера. Теперь ваш образ содержит все, что вам нужно для запуска вашего веб-сайта.

Теперь вы можете создать образ:

docker build -t my-website:v1 .

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

-t в команде помечает ваше изображение заданным именем (my-website:v1). Это облегчает обращение в будущем. Теги состоят из двух компонентов, разделенных двоеточием. Первая часть задает имя образа, а вторая обычно обозначает его версию. Если вы опустите двоеточие, Docker по умолчанию будет использовать latest в качестве версии тега.

. в конце команды указывает Docker использовать Dockerfile в вашем локальном рабочем каталоге. Это также устанавливает контекст сборки, позволяя вам использовать файлы и папки в вашем рабочем каталоге с инструкциями COPY в вашем Dockerfile.

Создав образ, вы можете запустить контейнер с помощью docker run:

docker run -d -p 8080:80 my-website:v1

Здесь мы используем несколько дополнительных флагов с docker run. Флаг -d отключает интерфейс командной строки Docker от контейнера, позволяя ему работать в фоновом режиме. Сопоставление портов определяется с помощью -p, поэтому порт 8080 на вашем хосте сопоставляется с портом 80 в контейнере. Вы должны увидеть свою веб-страницу, если посетите localhost:8080 в своем браузере.

Образы Docker формируются из слоев. Каждая инструкция в вашем Dockerfile создает новый слой. Вы можете использовать расширенные функции построения для ссылки на несколько базовых изображений, отбрасывая промежуточные слои из более ранних изображений.

Реестры изображений

Получив образ, вы можете отправить его в реестр. Реестры обеспечивают централизованное хранилище, так что вы можете делиться контейнерами с другими. Реестр по умолчанию — Docker Hub.

Когда вы запускаете команду, которая ссылается на образ, Docker сначала проверяет, доступен ли он локально. Если это не так, он попытается получить его из Docker Hub. Вы можете вручную загрузить изображения с помощью команды docker pull:

docker pull httpd:latest

Если вы хотите опубликовать образ, создайте учетную запись Docker Hub. Запустите docker login и введите имя пользователя и пароль.

Затем пометьте свое изображение, используя свое имя пользователя Docker Hub:

docker tag my-image:latest docker-hub-username/my-image:latest

Теперь вы можете отправить свое изображение:

docker push docker-hub-username/my-image:latest

Другие пользователи смогут извлекать ваш образ и запускать с ним контейнеры.

Вы можете запустить свой собственный реестр, если вам нужно частное хранилище образов. Несколько сторонних сервисов также предлагают реестры Docker в качестве альтернативы Docker Hub.

Управление вашими контейнерами

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

Список контейнеров

docker ps показывает все ваши запущенные контейнеры. Добавление флага -a также покажет остановленные контейнеры.

Остановка и запуск контейнеров

Чтобы остановить контейнер, запустите docker stop my-container. Замените my-container именем или идентификатором контейнера. Вы можете получить эту информацию с помощью команды ps. Остановленный контейнер перезапускается с помощью docker start my-container.

Контейнеры обычно работают до тех пор, пока их основной процесс остается в живых. Политики перезапуска управляют тем, что происходит при остановке контейнера или перезапуске хоста. Передайте --restart always в docker run, чтобы перезапустить контейнер сразу после его остановки.

Получение оболочки

Вы можете запустить команду в контейнере, используя docker exec my-container my-command. Это полезно, когда вы хотите вручную вызвать исполняемый файл, отдельный от основного процесса контейнера.

Добавьте флаг -it, если вам нужен интерактивный доступ. Это позволяет перейти в оболочку, запустив docker exec -it my-container sh.

Журналы мониторинга

Docker автоматически собирает выходные данные, передаваемые в стандартные потоки ввода и вывода контейнера. Команда docker logs my-container покажет журналы контейнера внутри вашего терминала. Флаг --follow устанавливает непрерывный поток, чтобы вы могли просматривать журналы в режиме реального времени.

Очистка ресурсов

Старые контейнеры и образы могут быстро накапливаться в вашей системе. Используйте docker rm my-container, чтобы удалить контейнер по его идентификатору или имени.

Для изображений используется команда docker rmi my-image:latest. Передайте идентификатор изображения или полное имя тега. Если вы укажете тег, изображение не будет удалено до тех пор, пока ему не будут назначены теги. В противном случае данный тег будет удален, но другие теги изображения останутся пригодными для использования.

Массовая очистка возможна с помощью команды docker prune. Это дает вам простой способ удалить все остановленные контейнеры и избыточные образы.

Графическое управление

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

Постоянное хранилище данных

Контейнеры Docker по умолчанию эфемерны. Изменения, внесенные в файловую систему контейнера, не сохранятся после остановки контейнера. Небезопасно запускать любую форму системы хранения файлов в контейнере, запускаемом простой командой docker run.

Существует несколько различных подходов к управлению постоянными данными. Наиболее распространенным является использование тома Docker. Тома — это единицы хранения, которые монтируются в файловые системы контейнеров. Любые данные в томе останутся нетронутыми после того, как его связанный контейнер остановится, что позволит вам подключить другой контейнер в будущем.

Обеспечение безопасности

Докеризованные рабочие нагрузки могут быть более безопасными, чем их аналоги на «голом железе», поскольку Docker обеспечивает некоторое разделение между операционной системой и вашими службами. Тем не менее, Docker представляет собой потенциальную проблему безопасности, поскольку обычно он запускается с правами root и может использоваться для запуска вредоносного программного обеспечения.

Если вы используете Docker только в качестве инструмента разработки, установка по умолчанию, как правило, безопасна. Рабочие серверы и машины с сокетом демона, открытым в сети, должны быть защищены перед запуском.

Проведите аудит установки Docker, чтобы выявить потенциальные проблемы безопасности. Доступны автоматизированные инструменты, которые могут помочь вам найти слабые места и предложить решения. Вы также можете сканировать отдельные образы контейнеров на наличие проблем, которые могут быть использованы изнутри.

Работа с несколькими контейнерами

Команда docker работает только с одним контейнером за раз. Вы часто захотите использовать контейнеры в совокупности. Docker Compose — это инструмент, который позволяет декларативно определять контейнеры в файле YAML. Вы можете запустить их все с помощью одной команды.

Это полезно, когда ваш проект зависит от других служб, таких как веб-сервер, который зависит от сервера базы данных. Вы можете определить оба контейнера в файле docker-compose.yml и воспользоваться упрощенным управлением с автоматическим подключением к сети.

Вот простой файл docker-compose.yml:

version: "3"
services:
  app:
    image: app-server:latest
    ports:
      - 8000:80
  database:
    image: database-server:latest
    volumes:
        - database-data:/data
volumes:
    database-data:

Это определяет два контейнера (app и database). Том создается для базы данных. Это монтируется в /data в контейнере. Порт 80 сервера приложений отображается на хосте как 8000. Запустите docker-compose up -d, чтобы запустить обе службы, включая сеть и том.

Использование Docker Compose позволяет вам писать повторно используемые определения контейнеров, которыми вы можете поделиться с другими. Вы можете зафиксировать docker-compose.yml в системе управления версиями, вместо того чтобы заставлять разработчиков запоминать команды docker run.

Существуют и другие подходы к запуску нескольких контейнеров. Приложение Docker — это новое решение, обеспечивающее новый уровень абстракции. В другом месте экосистемы Podman — это альтернатива Docker, которая позволяет создавать «модули» контейнеров в вашем терминале.

Оркестрация контейнеров

Docker обычно не запускается как есть в производственной среде. Сейчас более распространено использование платформы оркестрации, такой как режим Kubernetes или Docker Swarm. Эти инструменты предназначены для обработки нескольких реплик контейнеров, что повышает масштабируемость и надежность.

Docker — лишь один из компонентов более широкого движения контейнеризации. Оркестраторы используют одни и те же технологии среды выполнения контейнеров, чтобы обеспечить среду, которая лучше подходит для производства. Использование нескольких экземпляров контейнера позволяет чередовать обновления, а также распределять их между компьютерами, что делает ваше развертывание более устойчивым к изменениям и сбоям. Обычный интерфейс командной строки docker нацелен на один хост и работает с отдельными контейнерами.

Мощная платформа для контейнеров

Docker дает вам все необходимое для работы с контейнерами. Он стал ключевым инструментом для разработки программного обеспечения и системного администрирования. Основными преимуществами являются повышенная изоляция и переносимость отдельных служб.

Знакомство с Docker требует понимания основных концепций контейнеров и образов. Вы можете применить их для создания специализированных образов и сред, которые контейнеризируют ваши рабочие нагрузки.