Сборка образов сервисов
На предыдущем шаге вы определили сервисы, используя готовые Docker-образы в файле docker-compose.yaml
. В этом шаге вы научитесь создавать собственные Docker-образы для сервисов с помощью Dockerfiles и интегрировать их в файл docker-compose.yaml
.
Сначала создадим простую директорию для веб-сервиса и Dockerfile внутри неё. Перейдите в директорию проекта, если вы ещё не там:
cd ~/project
Создайте директорию web
и перейдите в неё:
mkdir web
cd web
Теперь создайте Dockerfile с именем Dockerfile
в директории web
с помощью редактора nano
:
nano Dockerfile
Вставьте следующее содержимое в Dockerfile
:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Этот Dockerfile выполняет следующее:
FROM ubuntu:latest
: Использует последний образ Ubuntu в качестве базового.
RUN apt-get update && apt-get install -y nginx
: Обновляет список пакетов и устанавливает Nginx.
COPY index.html /var/www/html/
: Копирует файл index.html
(который мы создадим далее) в корневую директорию Nginx.
EXPOSE 80
: Открывает порт 80 на контейнере.
CMD ["nginx", "-g", "daemon off;"]
: Задаёт команду для запуска контейнера — запуск Nginx в foreground-режиме.
Сохраните Dockerfile, нажав Ctrl + X
, затем Y
и Enter
.
Теперь создадим файл index.html
, который копируется в Dockerfile. Оставаясь в директории ~/project/web
, создайте файл:
nano index.html
Вставьте следующий простой HTML-код в index.html
:
<!doctype html>
<html>
<head>
<title>Hello from Docker!</title>
</head>
<body>
<h1>Welcome to my Dockerized Nginx!</h1>
<p>This page is served from a custom Docker image.</p>
</body>
</html>
Сохраните файл index.html
, нажав Ctrl + X
, затем Y
и Enter
.
Теперь вернитесь в корневую директорию проекта, где находится файл docker-compose.yaml
:
cd ~/project
Нам нужно изменить файл docker-compose.yaml
, чтобы сервис web
собирался из созданного Dockerfile, а не использовал готовый образ. Откройте файл для редактирования:
nano docker-compose.yaml
Измените определение сервиса web
, заменив image
на инструкцию build
:
version: "3.8"
services:
web:
build: ./web
ports:
- "80:80"
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: mysecretpassword
Здесь build: ./web
указывает Docker Compose собрать образ для сервиса web
с использованием Dockerfile из директории ./web
(относительно расположения docker-compose.yaml
).
Сохраните изменённый файл docker-compose.yaml
, нажав Ctrl + X
, затем Y
и Enter
.
Теперь вы можете собрать образы, определённые в docker-compose.yaml
, с помощью команды docker-compose build
. Поскольку Docker Compose не предустановлен, сначала установите его:
sudo apt-get update
sudo apt-get install docker-compose-plugin -y
После установки плагина Docker Compose используйте команду docker compose
(обратите внимание на пробел вместо дефиса в новых версиях):
docker compose build
Эта команда прочитает файл docker-compose.yaml
и соберёт образ для сервиса web
на основе Dockerfile в директории ./web
. Также она загрузит образ postgres:latest
для сервиса db
, если он отсутствует. Вы увидите вывод процесса сборки образа web
.
После завершения сборки вы можете просмотреть список Docker-образов в системе, чтобы увидеть новый образ:
docker images
Вы должны увидеть образ с именем, связанным с директорией проекта и именем сервиса (например, project-web
), а также образ postgres
.