Пользовательские Docker-образы

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Весьма протяжении этого практического занятия мы будем использовать WebIDE (VS Code) для редактирования файлов. WebIDE предоставляет знакомый и удобный для пользователя интерфейс для редактирования файлов, что упрощает работу с конфигурационными файлами и кодом.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) linux(("Linux")) -.-> linux/PackagesandSoftwaresGroup(["Packages and Softwares"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/images("List Images") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") linux/FileandDirectoryManagementGroup -.-> linux/mkdir("Directory Creating") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") linux/PackagesandSoftwaresGroup -.-> linux/curl("URL Data Transferring") subgraph Lab Skills docker/run -.-> lab-389185{{"Пользовательские Docker-образы"}} docker/exec -.-> lab-389185{{"Пользовательские Docker-образы"}} docker/images -.-> lab-389185{{"Пользовательские Docker-образы"}} linux/cd -.-> lab-389185{{"Пользовательские Docker-образы"}} linux/mkdir -.-> lab-389185{{"Пользовательские Docker-образы"}} docker/build -.-> lab-389185{{"Пользовательские Docker-образы"}} linux/curl -.-> lab-389185{{"Пользовательские Docker-образы"}} end

Настройка окружения проекта

Начнем с создания директории проекта и перехода в нее.

Весьма протяжении этого практического занятия мы будем использовать WebIDE (VS Code) для редактирования файлов. WebIDE предоставляет знакомый и удобный для пользователя интерфейс для редактирования файлов, что упрощает работу с конфигурационными файлами и кодом.

  1. Откройте терминал в WebIDE. Для этого нажмите на "Terminal" в верхнем меню, а затем выберите "New Terminal".
  2. В терминале выполните следующие команды:
mkdir -p ~/project/docker
cd ~/project/docker

Эти команды создают новую директорию с именем docker в папке ~/project и изменяют текущую рабочую директорию на нее.

  1. Убедитесь, что вы находитесь в правильной директории:
pwd

В качестве вывода вы должны увидеть /home/labex/project/docker.

Понимание этих команд:

  • mkdir -p: Эта команда создает директорию. Флаг -p позволяет создавать родительские директории, если они не существуют.
  • cd: Эта команда изменяет текущую директорию.
  • pwd: Эта команда выводит текущую рабочую директорию.

Создание простого Docker-образа

Теперь давайте создадим простой Docker-образ, который запускает веб-сервер Nginx.

  1. В WebIDE перейдите к проводнику файлов (обычно это первый иконка в левой боковой панели).
  2. Щелкните правой кнопкой мыши в области проводника файлов и выберите "New File". Назовите его Dockerfile (с заглавной буквы 'D' и без расширения файла).
  3. Откройте Dockerfile, кликнув на него в проводнике файлов. Добавьте следующее содержимое:
FROM nginx
COPY index.html /usr/share/nginx/html/

Этот Dockerfile определяет новый образ на основе официального образа Nginx и копирует файл с именем index.html в каталог корневого документа по умолчанию Nginx.

Понимание Dockerfile:

  • FROM nginx: Эта строка указывает базовый образ, на основе которого мы строим наш новый образ. В данном случае мы используем официальный образ Nginx.
  • COPY index.html /usr/share/nginx/html/: Эта строка копирует наш файл index.html в корневой каталог веб-сервера контейнера.
  1. Создайте новый файл с именем index.html в той же директории. Для этого снова щелкните правой кнопкой мыши в области проводника файлов и выберите "New File".
  2. Откройте index.html и добавьте следующее содержимое:
<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Hello Docker!</title>
  </head>
  <body>
    <h1>Hello Docker!</h1>
    <p>This is a custom Docker image.</p>
  </body>
</html>

Это простая HTML-страница, которая будет обслуживаться нашим сервером Nginx.

  1. Откройте терминал в WebIDE (Terminal -> New Terminal, если вы закрыли предыдущий) и создайте Docker-образ с помощью следующей команды:
docker build -t my-nginx.

Эта команда создает новый Docker-образ с тегом my-nginx.

Понимание команды:

  • docker build: Это команда для создания Docker-образа.
  • -t my-nginx: Флаг -t помечает наш образ именем my-nginx.
  • .: Это указывает контекст сборки (директорию, содержащую Dockerfile) как текущую директорию.
  1. После завершения сборки убедитесь, что образ был успешно создан:
docker images

Вы должны увидеть образ my-nginx в списке вывода.

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

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

  1. В терминале WebIDE запустите контейнер с помощью следующей команды:
docker run -d -p 8080:80 --name my-nginx-container my-nginx

Понимание этой команды:

  • docker run: Эта команда создает и запускает новый контейнер.
  • -d: Этот флаг запускает контейнер в отсоединенном режиме (в фоновом режиме).
  • -p 8080:80: Этот параметр сопоставляет порт 8080 на вашем хосте с портом 80 в контейнере.
  • --name my-nginx-container: Этот параметр присваивает имя нашему контейнеру.
  • my-nginx: Это имя образа, который мы используем для создания контейнера.
  1. Убедитесь, что контейнер запущен:
docker ps

Вы должны увидеть my-nginx-container в списке вывода. Эта команда показывает все запущенные контейнеры.

  1. Чтобы просмотреть содержимое веб-страницы, используйте команду curl:
curl http://localhost:8080

Вы должны увидеть HTML-содержимое файла index.html, отображенное в терминале.

Если вы интересуетесь, что делает curl, это инструмент для передачи данных от сервера или к серверу. В этом случае мы используем его для получения содержимого с нашего веб-сервера.

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

Настройка порта веб-сервера

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

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

  1. В WebIDE откройте Dockerfile. Для этого кликните на Dockerfile в области проводника файлов.
  2. Измените содержимое Dockerfile следующим образом:
FROM nginx
RUN apt-get update && apt-get install -y curl
COPY index.html /usr/share/nginx/html/

В этом Dockerfile добавлена новая инструкция RUN, которая обновляет индекс пакетов и устанавливает утилиту curl с использованием менеджера пакетов apt-get.

Понимание новой строки:

  • RUN apt-get update && apt-get install -y curl: Эта строка обновляет список пакетов (apt-get update), а затем устанавливает curl (apt-get install -y curl). Флаг -y автоматически отвечает "да" на любые запросы во время установки.
  1. Сохраните файл в WebIDE, нажав Ctrl+S (или Cmd+S на Mac).
  2. В терминале WebIDE пересоберите Docker-образ с новым тегом:
docker build -t my-nginx-curl.

Эта команда создает новый Docker-образ с тегом my-nginx-curl, который включает утилиту curl.

  1. Убедитесь, что новый образ был создан:
docker images

Вы должны увидеть образ my-nginx-curl в списке вывода.

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

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

  1. В терминале WebIDE запустите новый контейнер с помощью следующей команды:
docker run -d --name curl-container my-nginx-curl

Эта команда запускает новый контейнер на основе образа my-nginx-curl и присваивает ему имя curl-container.

  1. Запустите оболочку bash в работающем контейнере:
docker exec -it curl-container bash

Эта команда открывает интерактивную оболочку bash внутри работающего контейнера.

Понимание этой команды:

  • docker exec: Эта команда запускает команду в работающем контейнере.
  • -it: Эти флаги выделяют псевдо-TTY и оставляют STDIN открытым, позволяя вам взаимодействовать с оболочкой.
  • curl-container: Это имя нашего контейнера.
  • bash: Это команда, которую мы запускаем в контейнере (открытие оболочки bash).
  1. Теперь вы должны увидеть новый приглашение, которое указывает, что вы находитесь внутри контейнера. Внутри контейнера протестируйте утилиту curl:
curl http://localhost

Вы должны увидеть HTML-содержимое файла index.html, отображенное в терминале.

  1. Выйдите из оболочки bash контейнера:
exit

Эта команда возвращает вас в оболочку хост-системы.

Использование переменных окружения в образе

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

  1. В WebIDE откройте Dockerfile снова.

  2. Измените содержимое Dockerfile следующим образом:

FROM nginx
ENV NGINX_PORT 9000
RUN sed -i "s/listen\s*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html/

В этом Dockerfile добавлена инструкция ENV, которая устанавливает переменную NGINX_PORT со значением 9000. Также добавлена инструкция RUN, которая изменяет конфигурацию Nginx для использования этого порта.

Понимание новых строк:

  • ENV NGINX_PORT 9000: Эта строка устанавливает переменную окружения NGINX_PORT со значением 9000.
  • RUN sed -i "s/listen\s*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf: Эта строка использует sed для замены порта по умолчанию (80) на нашу переменную окружения в конфигурационном файле Nginx.
  1. Сохраните файл в WebIDE.

  2. В терминале WebIDE пересоберите Docker-образ с новым тегом:

docker build -t my-nginx-env.
  1. Запустите контейнер на основе нового образа:
docker run -d -p 9000:9000 -e NGINX_PORT=9000 --name env-container my-nginx-env

Эта команда запускает новый контейнер на основе образа my-nginx-env, сопоставляет порт 9000 на хосте с портом 9000 в контейнере и устанавливает значение переменной NGINX_PORT равным 9000.

Понимание новых частей этой команды:

  • -e NGINX_PORT=9000: Эта строка устанавливает переменную окружения NGINX_PORT равной 9000 для этого конкретного запуска контейнера.
  1. Убедитесь, что веб-сервер запущен на указанном порту:
curl http://localhost:9000

Вы должны увидеть HTML-содержимое файла index.html, отображенное в терминале.

Использование ENTRYPOINT в Dockerfile

На этом шаге мы научимся использовать инструкцию ENTRYPOINT в Dockerfile и использовать другой порт (9100).

  1. В WebIDE откройте Dockerfile снова.

  2. Измените содержимое Dockerfile следующим образом:

FROM nginx
ENV NGINX_PORT 9100
RUN sed -i "s/listen\s*80;/listen $NGINX_PORT;/g" /etc/nginx/conf.d/default.conf
COPY index.html /usr/share/nginx/html/
COPY start.sh /start.sh
RUN chmod +x /start.sh
ENTRYPOINT ["/start.sh"]

В этом Dockerfile устанавливается NGINX_PORT равным 9100 и добавляется инструкция ENTRYPOINT, которая указывает команду, которая будет выполняться при запуске контейнера.

  1. Создайте новый файл с именем start.sh в той же директории со следующим содержимым:
#!/bin/bash
echo "Starting Nginx on port $NGINX_PORT"
nginx -g 'daemon off;'

Этот скрипт выводит сообщение, показывающее, на каком порту будет запущен Nginx, перед запуском Nginx.

  1. Сохраните оба файла в WebIDE.

  2. В терминале WebIDE пересоберите Docker-образ с новым тегом:

docker build -t my-nginx-entrypoint.
  1. Запустите контейнер на основе нового образа:
docker run -d -p 9100:9100 -e NGINX_PORT=9100 --name entrypoint-container my-nginx-entrypoint
  1. Проверьте логи контейнера, чтобы увидеть сообщение о запуске:
docker logs entrypoint-container

В выводе вы должны увидеть сообщение "Starting Nginx on port 9100".

  1. Убедитесь, что веб-сервер корректно работает на новом порту:
curl http://localhost:9100

Вы должны увидеть HTML-содержимое файла index.html, отображенное в терминале.

Итоги

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

Вот краткий обзор того, что вы достигли:

  1. Настроили проектную среду и изучили основные команды терминала.
  2. Создали простой Docker-образ с Nginx и пользовательской HTML-страницей.
  3. Собрали и запустили Docker-контейнеры, изучив сопоставление портов и именование контейнеров.
  4. Изменили Docker-образ, чтобы включить дополнительное программное обеспечение (curl).
  5. Использовали docker exec для выполнения команд внутри контейнера.
  6. Включили переменные окружения в свой Docker-образ для более простой настройки.