Понимание инструкций и слоев Dockerfile
Начнем с создания Dockerfile, в котором задействуем различные инструкции. Мы соберем образ для веб-приложения на Python с использованием Flask и попутно разберем, как каждая инструкция влияет на формирование слоев нашего Docker-образа.
- Сначала создадим новую директорию для нашего проекта. В терминале WebIDE выполните:
mkdir -p ~/project/advanced-dockerfile && cd ~/project/advanced-dockerfile
Эта команда создает папку advanced-dockerfile внутри каталога project и переходит в нее.
-
Теперь создадим файл приложения. В проводнике WebIDE (обычно слева) нажмите правой кнопкой мыши на папку advanced-dockerfile и выберите "New File". Назовите его app.py.
-
Откройте app.py и добавьте следующий код на Python:
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f"Hello from {os.environ.get('ENVIRONMENT', 'unknown')} environment!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Это простое приложение на Flask, которое возвращает приветствие с указанием среды, в которой оно запущено.
- Далее создадим файл
requirements.txt для указания зависимостей Python. Создайте новый файл с именем requirements.txt в той же директории и добавьте в него:
Flask==2.0.1
Werkzeug==2.0.1
Здесь мы указываем точные версии Flask и Werkzeug для обеспечения совместимости.
- Теперь создадим сам Dockerfile. Создайте файл с именем
Dockerfile (с заглавной буквы 'D') в той же директории и добавьте следующее содержимое:
## Use an official Python runtime as the base image
FROM python:3.9-slim
## Set the working directory in the container
WORKDIR /app
## Set an environment variable
ENV ENVIRONMENT=production
## Copy the requirements file into the container
COPY requirements.txt .
## Install the required packages
RUN pip install --no-cache-dir -r requirements.txt
## Copy the application code into the container
COPY app.py .
## Specify the command to run when the container starts
CMD ["python", "app.py"]
## Expose the port the app runs on
EXPOSE 5000
## Add labels for metadata
LABEL maintainer="Your Name <your.email@example.com>"
LABEL version="1.0"
LABEL description="Flask app demo for advanced Dockerfile techniques"
Разберем эти инструкции и их вклад в формирование слоев образа:
FROM python:3.9-slim: Это всегда первая инструкция. Она определяет базовый образ. Это создает первый слой нашего образа, включающий среду выполнения Python.
WORKDIR /app: Устанавливает рабочую директорию для последующих команд. Сама по себе она не создает новый слой, но влияет на поведение следующих инструкций.
ENV ENVIRONMENT=production: Устанавливает переменную окружения. Переменные окружения не создают новые слои, а сохраняются в метаданных образа.
COPY requirements.txt .: Копирует файл зависимостей из хост-системы в образ. Это создает новый слой, содержащий только этот файл.
RUN pip install --no-cache-dir -r requirements.txt: Выполняет команду в контейнере во время сборки. Она устанавливает зависимости Python. Это создает новый слой, содержащий все установленные пакеты.
COPY app.py .: Копирует код приложения в образ, создавая еще один слой.
CMD ["python", "app.py"]: Определяет команду, которая будет запущена при старте контейнера. Слой не создается, но задается команда по умолчанию.
EXPOSE 5000: Это форма документации. Она сообщает Docker, что контейнер будет прослушивать этот порт, но фактически не "пробрасывает" его. Слой не создается.
LABEL ...: Добавляет метаданные к образу. Как и ENV, они не создают слои, а хранятся в метаданных.
Каждая инструкция RUN, COPY и ADD в Dockerfile создает новый слой. Слои — это фундаментальная концепция Docker, позволяющая эффективно хранить и передавать образы. Когда вы вносите изменения в Dockerfile и пересобираете образ, Docker повторно использует кэшированные слои, которые не изменились, что значительно ускоряет процесс сборки.
- Теперь, когда мы понимаем структуру Dockerfile, соберем образ. В терминале выполните:
docker build -t advanced-flask-app .
Эта команда собирает новый Docker-образ с тегом advanced-flask-app. Точка . в конце указывает Docker искать Dockerfile в текущей директории.
Вы увидите вывод каждого этапа сборки. Обратите внимание, как каждый шаг соответствует инструкции в Dockerfile, и как Docker пишет "Using cache" для шагов, которые не изменились при повторном запуске.
- После завершения сборки запустим контейнер на основе нашего образа:
docker run -d -p 5000:5000 --name flask-container advanced-flask-app
Разбор параметров:
-d запускает контейнер в фоновом режиме (detached mode).
-p 5000:5000 сопоставляет порт 5000 хоста с портом 5000 контейнера.
--name flask-container присваивает имя нашему контейнеру.
advanced-flask-app — имя образа, который мы используем.
Проверить работу контейнера можно командой:
docker ps
- Чтобы протестировать приложение, воспользуемся командой
curl:
curl http://localhost:5000
Вы должны увидеть сообщение: "Hello from production environment!"
Если возникли сложности с curl, можно открыть новую вкладку браузера и перейти по адресу http://localhost:5000. Результат должен быть тем же.
В случае проблем проверьте логи контейнера:
docker logs flask-container
Это покажет сообщения об ошибках или стандартный вывод вашего Flask-приложения.