Docker для начинающих: создаем образы в VS Code

Работа с Docker за пределами терминала

До этого момента мы использовали Docker исключительно через терминал. Теперь создадим полноценный проект, поместим его в образ и добавим необходимый функционал, включая язык программирования. В этом курсе используется Visual Studio Code, но вы можете использовать и другие IDE. Рекомендуется установить расширения «Docker» и «Remote — Containers» для VS Code, чтобы упростить работу с Docker и контейнерами.

Создание проекта и Dockerfile

Создайте новый проект. Например, откройте папку «Загрузки», создайте папку «project» и откройте её. В этой папке создайте файл Dockerfile (с заглавной буквы «D» и без расширения).

Dockerfile: пример на основе OpenJDK

В Dockerfile записывается код. Рассмотрим пример на основе образа openjdk. Код для других образов будет похож, отличаться будут имена образов и версии.

FROM openjdk
COPY . /app
WORKDIR /app
RUN javac Main.java
CMD ["java", "Main"]
EXPOSE 8001

Описание команд:

  • FROM openjdk: указывает базовый образ (OpenJDK). Можно указать версию (например, openjdk:11), иначе будет использована последняя.
  • COPY . /app: копирует все файлы из текущей директории в папку /app внутри образа. Для файлов из отдельной папки укажите её путь.
  • WORKDIR /app: устанавливает рабочую директорию внутри образа.
  • RUN javac Main.java: компилирует файл Main.java при создании образа.
  • CMD ["java", "Main"]: команда, выполняемая при запуске контейнера. Синтаксис: массив строк.
  • EXPOSE 8001: указывает порт 8001, доступный извне контейнера.

Файл Main.java

Создайте файл Main.java:

class Main {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}

Сборка образа

В терминале выполните команду:

docker build .

Точка (.) указывает на текущую директорию, где находится Dockerfile.

Проверка и удаление образа

Проверьте созданный образ:

docker images

Для удаления образа используйте:

docker rmi <IMAGE_ID>

где <IMAGE_ID> — идентификатор образа.

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

Запустите контейнер:

docker run -p 3001:8001 <IMAGE_ID>

-p 3001:8001 перенаправляет порт 3001 на локальной машине на порт 8001 внутри контейнера. <IMAGE_ID> — идентификатор образа. В случае ошибки (например, из-за неверного кода в Main.java), исправьте код, удалите образ и пересоберите его.

Работа с другими языками программирования

Аналогичный подход применим к другим языкам (Python, Node.js и др.). Docker позволяет запускать различные приложения и технологии, включая WordPress, Laravel.

Передача проекта

Для передачи проекта достаточно передать Dockerfile и другие необходимые файлы. Получатель запустит проект командой docker run. Выгрузка на Docker Hub будет рассмотрена в следующих уроках.

Ограничения использования EXPOSE с OpenJDK

Использование EXPOSE и -p с базовым образом OpenJDK может не работать, так как в нём нет встроенного веб-сервера. Для веб-приложений добавьте веб-сервер (например, Nginx или Apache) с использованием Docker Compose (будет рассмотрено в следующих уроках).

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

Что будем искать? Например,программа