Пошаговое руководство по клонированию образа контейнера Docker

DockerBeginner
Практиковаться сейчас

Введение

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

Понимание Docker и проверка вашей среды

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

Что такое Docker?

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

Проверка установки Docker

Давайте сначала убедимся, что Docker правильно установлен в нашей системе. Откройте окно терминала и запустите:

docker --version

Вы должны увидеть вывод, похожий на:

Docker version 20.10.21, build baeda1f

Далее, проверьте, что служба Docker запущена:

sudo systemctl status docker

Вывод должен указывать, что Docker активен (запущен). Если он не запущен, вы можете запустить его с помощью:

sudo systemctl start docker

Тестирование функциональности Docker

Давайте запустим простую тестовую команду, чтобы убедиться, что Docker работает правильно:

docker run hello-world

Эта команда загружает и запускает образ hello-world, который выводит подтверждающее сообщение и завершает работу. Вы должны увидеть вывод, похожий на:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Список образов Docker

Чтобы увидеть, какие образы Docker в настоящее время доступны в вашей системе, запустите:

docker images

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

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

Извлечение и запуск образа Docker

На этом шаге мы извлечем образ Docker из Docker Hub и запустим его в нашей локальной системе. Это первый шаг в процессе клонирования образа Docker.

Что такое Docker Hub?

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

Извлечение образа из Docker Hub

Давайте извлечем официальный образ веб-сервера Nginx из Docker Hub. Nginx - популярный веб-сервер, который мы будем использовать в качестве примера в этом руководстве.

Выполните следующую команду, чтобы загрузить образ Nginx:

docker pull nginx:latest

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

latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Проверка загруженного образа

Чтобы убедиться, что образ был успешно загружен, снова выведите список ваших образов Docker:

docker images

Теперь вы должны увидеть образ Nginx в списке:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   2 weeks ago    142MB

Запуск контейнера Docker Nginx

Теперь давайте запустим контейнер на основе образа Nginx, который мы только что извлекли:

docker run --name my-nginx -d -p 8080:80 nginx

Эта команда выполняет следующее:

  • --name my-nginx: Называет наш контейнер "my-nginx"
  • -d: Запускает контейнер в detached mode (в фоновом режиме)
  • -p 8080:80: Отображает порт 8080 на нашем хосте на порт 80 в контейнере
  • nginx: Использует образ Nginx, который мы извлекли ранее

Вы должны увидеть длинную строку вывода, которая является идентификатором контейнера.

Проверка работающего контейнера

Чтобы проверить, запущен ли контейнер:

docker ps

Вы должны увидеть вывод, похожий на:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f8d3e9c5b9a7   nginx     "/docker-entrypoint.…"   30 seconds ago   Up 29 seconds   0.0.0.0:8080->80/tcp   my-nginx

Теперь вы можете получить доступ к странице по умолчанию Nginx, открыв веб-браузер и перейдя по адресу http://localhost:8080 или используя curl:

curl http://localhost:8080

Вы должны увидеть HTML-содержимое приветственной страницы Nginx.

Теперь, когда мы успешно извлекли и запустили образ Docker, мы готовы создать свой собственный пользовательский образ на его основе на следующем шаге.

Создание пользовательского образа Docker

Теперь, когда у нас есть работающий контейнер Nginx, мы создадим пользовательский образ, изменив его. Это основа процесса клонирования. Мы:

  1. Внесем изменения в работающий контейнер
  2. Создадим новый образ из этих изменений
  3. Запустим контейнер на основе нашего нового образа

Понимание создания образа Docker

Образы Docker можно создавать двумя способами:

  1. Используя Dockerfile (рекомендуемый подход для продакшена)
  2. Фиксируя изменения, внесенные в работающий контейнер (полезно для изучения и экспериментов)

Мы будем использовать второй подход в этом руководстве, так как он более понятен для понимания процесса клонирования.

Изменение работающего контейнера

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

Используйте следующую команду, чтобы выполнить shell внутри работающего контейнера:

docker exec -it my-nginx bash

Это открывает интерактивный bash shell внутри контейнера. Теперь давайте создадим пользовательский HTML-файл:

echo "<html><body><h1>My Custom Docker Image</h1><p>This is a custom Nginx image created in the LabEx tutorial.</p></body></html>" > /usr/share/nginx/html/index.html

Вы можете проверить изменение, проверив содержимое файла:

cat /usr/share/nginx/html/index.html

Теперь выйдите из shell контейнера:

exit

Тестирование изменений

Давайте проверим, были ли применены наши изменения, снова обратившись к серверу Nginx:

curl http://localhost:8080

Теперь вы должны увидеть наше пользовательское HTML-содержимое вместо страницы приветствия Nginx по умолчанию.

Создание нового образа из измененного контейнера

Теперь, когда мы изменили контейнер, мы создадим новый образ, который включает эти изменения. Это делается с помощью команды docker commit:

docker commit my-nginx my-custom-nginx:v1

Эта команда создает новый образ с именем my-custom-nginx с тегом v1 на основе текущего состояния контейнера my-nginx.

Проверка нового образа

Давайте проверим, был ли создан наш новый образ:

docker images

Вы должны увидеть свой новый образ в списке:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 seconds ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Запуск контейнера из нового образа

Теперь давайте остановим и удалим исходный контейнер, а затем запустим новый контейнер на основе нашего пользовательского образа:

docker stop my-nginx
docker rm my-nginx
docker run --name my-custom-container -d -p 8081:80 my-custom-nginx:v1

Эти команды:

  1. Останавливают исходный контейнер
  2. Удаляют исходный контейнер
  3. Создают новый контейнер на основе нашего пользовательского образа, отображенного на порт 8081

Тестирование нового контейнера

Давайте проверим, правильно ли работает наш новый контейнер:

docker ps

Вы должны увидеть свой новый контейнер в списке:

CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                  NAMES
g9h8i7j6k5l4   my-custom-nginx:v1   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8081->80/tcp   my-custom-container

Теперь получите доступ к серверу Nginx на новом порту:

curl http://localhost:8081

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

Поздравляем! Вы успешно клонировали образ Docker и настроили его. На следующем шаге мы узнаем, как поделиться этим пользовательским образом.

Тегирование и совместное использование вашего образа Docker

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

Понимание тегов образа Docker

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

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

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

docker tag my-custom-nginx:v1 my-custom-nginx:latest
docker tag my-custom-nginx:v1 my-custom-nginx:stable

Эти команды создают два дополнительных тега для нашего образа: latest и stable. Фактические данные образа совместно используются между всеми тремя тегами, поэтому эта операция очень эффективна.

Проверка тегов

Давайте снова проверим наши образы:

docker images

Теперь вы должны увидеть несколько записей для my-custom-nginx:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   latest    a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   stable    a1b2c3d4e5f6   10 minutes ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Обратите внимание, что все образы my-custom-nginx имеют один и тот же идентификатор образа (Image ID), что указывает на то, что это один и тот же образ с разными тегами.

Подготовка к распространению образа

В реальном сценарии вы бы отправили свой образ в реестр, такой как Docker Hub. Для этого вам потребуется:

  1. Создать учетную запись на Docker Hub
  2. Войти в Docker Hub из вашего терминала
  3. Тегировать свой образ с вашим именем пользователя Docker Hub
  4. Отправить образ

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

docker tag my-custom-nginx:v1 yourusername/my-custom-nginx:v1

Чтобы отправить образ (в реальном сценарии), вы бы использовали:

## Это только для демонстрации - мы на самом деле не будем отправлять
## docker push yourusername/my-custom-nginx:v1

Сохранение образа Docker в файл

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

docker save -o my-custom-nginx.tar my-custom-nginx:v1

Эта команда сохраняет образ в архив tar с именем my-custom-nginx.tar. Вы можете проверить, был ли создан файл:

ls -lh my-custom-nginx.tar

Вы должны увидеть вывод, похожий на:

-rw------- 1 labex labex 142M Nov 10 12:34 my-custom-nginx.tar

Загрузка образа из файла

Чтобы загрузить образ из архива tar на другой машине (или на той же машине после удаления образа), вы бы использовали:

## Мы на самом деле не будем запускать эту команду в рамках руководства
## docker load -i my-custom-nginx.tar

Экспорт документации контейнера

Чтобы помочь другим понять ваш пользовательский образ, хорошей практикой является документирование внесенных вами изменений. Давайте создадим простой файл документации:

cat > my-custom-nginx-doc.txt << EOF
## My Custom Nginx Image

This is a custom Nginx image created by cloning the official Nginx image.

### Changes Made
- Replaced the default welcome page with a custom HTML page

### How to Run
docker run --name my-custom-container -d -p 8080:80 my-custom-nginx:v1

### Version History
- v1: Initial custom version with modified welcome page
EOF

Теперь у вас есть файл документации для вашего пользовательского образа.

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

Лучшие практики и очистка

На этом заключительном этапе мы рассмотрим некоторые лучшие практики работы с образами Docker и очистим нашу среду.

Лучшие практики для образов Docker

1. Используйте конкретные теги

Всегда используйте конкретные теги версий, а не полагайтесь на тег latest. Это обеспечивает согласованность в ваших развертываниях.

## Лучший подход
docker pull nginx:1.23.2

## Менее предсказуемо
docker pull nginx:latest

2. Поддерживайте небольшие размеры образов

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

## Давайте посмотрим разницу в размерах
docker pull nginx:alpine
docker images | grep nginx

Вы можете увидеть вывод, подобный:

nginx         alpine    2bc7edbc3cf2   2 weeks ago    40.7MB
nginx         latest    605c77e624dd   2 weeks ago    142MB

Версия alpine значительно меньше!

3. Используйте многоступенчатые сборки

При создании образов с помощью Dockerfile используйте многоступенчатые сборки, чтобы сохранить небольшой размер конечного образа. Вот простой пример (вам не нужно его запускать):

## Build stage
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

## Final stage
FROM alpine:3.15
COPY --from=builder /app/app /app
CMD ["/app"]

4. Документируйте свои образы

Всегда ведите документацию для своих пользовательских образов, включая:

  • Для чего предназначен образ
  • Как его использовать
  • Какие изменения вы внесли
  • Любые параметры конфигурации

Мы создали простой файл документации на предыдущем шаге.

5. Сканируйте на наличие уязвимостей

Регулярно сканируйте свои образы на наличие уязвимостей:

## Пример сканирования (Docker Desktop имеет это встроенным)
## docker scan my-custom-nginx:v1

Инспектирование образов Docker

Давайте рассмотрим полезную команду для инспектирования образов Docker:

docker inspect my-custom-nginx:v1

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

Просмотр истории образа

Вы можете увидеть историю создания образа:

docker history my-custom-nginx:v1

Это показывает каждый слой образа и команды, которые их создали.

Очистка

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

  1. Сначала остановите и удалите наш пользовательский контейнер:
docker stop my-custom-container
docker rm my-custom-container
  1. Удалите созданные нами образы:
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
  1. При необходимости удалите образ Nginx:
docker rmi nginx:latest nginx:alpine
  1. Убедитесь, что все контейнеры и образы были удалены:
docker ps -a
docker images

Использование Docker System Prune

Docker предоставляет удобную команду для очистки неиспользуемых ресурсов:

docker system prune

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

Для более агрессивной очистки вы можете использовать:

docker system prune -a

Это дополнительно удаляет все неиспользуемые образы, а не только висячие.

Заключение

Теперь вы узнали, как:

  1. Загружать и запускать образы Docker
  2. Изменять работающие контейнеры
  3. Фиксировать изменения для создания новых пользовательских образов
  4. Тегировать образы для организации и распространения
  5. Сохранять образы в файлы для ручной передачи
  6. Документировать свои пользовательские образы
  7. Очищать свою среду Docker

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

Резюме

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

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

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