Введение
Этот учебник проведет вас через процесс клонирования образа контейнера 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, мы создадим пользовательский образ, изменив его. Это основа процесса клонирования. Мы:
- Внесем изменения в работающий контейнер
- Создадим новый образ из этих изменений
- Запустим контейнер на основе нашего нового образа
Понимание создания образа Docker
Образы Docker можно создавать двумя способами:
- Используя Dockerfile (рекомендуемый подход для продакшена)
- Фиксируя изменения, внесенные в работающий контейнер (полезно для изучения и экспериментов)
Мы будем использовать второй подход в этом руководстве, так как он более понятен для понимания процесса клонирования.
Изменение работающего контейнера
Во-первых, давайте создадим пользовательский 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
Эти команды:
- Останавливают исходный контейнер
- Удаляют исходный контейнер
- Создают новый контейнер на основе нашего пользовательского образа, отображенного на порт 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. Для этого вам потребуется:
- Создать учетную запись на Docker Hub
- Войти в Docker Hub из вашего терминала
- Тегировать свой образ с вашим именем пользователя Docker Hub
- Отправить образ
Для демонстрационных целей предположим, что ваше имя пользователя 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
Это показывает каждый слой образа и команды, которые их создали.
Очистка
Теперь давайте очистим нашу среду, удалив созданные нами контейнеры и образы:
- Сначала остановите и удалите наш пользовательский контейнер:
docker stop my-custom-container
docker rm my-custom-container
- Удалите созданные нами образы:
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
- При необходимости удалите образ Nginx:
docker rmi nginx:latest nginx:alpine
- Убедитесь, что все контейнеры и образы были удалены:
docker ps -a
docker images
Использование Docker System Prune
Docker предоставляет удобную команду для очистки неиспользуемых ресурсов:
docker system prune
Это удаляет все остановленные контейнеры, неиспользуемые сети, висячие образы и кэш сборки. Вам будет предложено подтвердить перед продолжением.
Для более агрессивной очистки вы можете использовать:
docker system prune -a
Это дополнительно удаляет все неиспользуемые образы, а не только висячие.
Заключение
Теперь вы узнали, как:
- Загружать и запускать образы Docker
- Изменять работающие контейнеры
- Фиксировать изменения для создания новых пользовательских образов
- Тегировать образы для организации и распространения
- Сохранять образы в файлы для ручной передачи
- Документировать свои пользовательские образы
- Очищать свою среду Docker
Эти навыки составляют основу работы с образами Docker и будут полезны по мере продолжения вашего пути с контейнеризацией.
Резюме
В этом практическом руководстве вы изучили полный процесс клонирования образа контейнера Docker. Вы начали с понимания основ Docker и проверки своей среды. Затем вы извлекли официальный образ Nginx и запустили его как контейнер. Далее вы настроили этот контейнер, изменив его содержимое, и зафиксировали эти изменения, чтобы создать свой собственный пользовательский образ.
Вы также узнали, как правильно тегировать свои образы для версионирования и распространения, как сохранять образы в файлы для ручной передачи и как документировать свои изменения. Наконец, вы изучили лучшие практики работы с образами Docker и очистили свою среду.
Эти навыки обеспечивают прочную основу для работы с Docker в средах разработки и производства. Теперь вы можете уверенно создавать и настраивать образы Docker в соответствии со своими конкретными требованиями, делая ваши приложения более переносимыми и согласованными в разных средах.



