First basic container
app.py
from flask import Flask, Response, send_file
import os
app = Flask(__name__)
@app.route('/')
def hello():
return "Docker is Awesome!"
@app.route('/logo')
def docker_logo():
return send_file('docker-logo.png', mimetype='image/png')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8080)
docker-logo.png:

requirements.txt
Dockerfile:
#Створює новий layer з базовим образом python:3.14.0a3-alpine3.21
FROM python:3.14.0a3-alpine3.21
#Створює новий layer з робочою директорією /app
WORKDIR /app
#Змінна середовища яка буде в контейнері за замовчуванням
ENV APP_ENV="SomeVariable"
#Створює новий layer з копіюванням файлів app.py, docker-logo.png, requirements.txt в робочу директорію /app
COPY app.py .
COPY docker-logo.png .
COPY requirements.txt .
#Створює новий layer з виконанням команди pip install -r requirements.txt
RUN pip install -r requirements.txt
#Не створює новий layer, а виконує команду EXPOSE 8080 що додає метаданні
EXPOSE 8080
#Не створює новий layer, а виконує команду ENTRYPOINT ["python", "app.py"] що вказує як запустити контейнер
ENTRYPOINT ["python", "app.py"]
Розберемо кожну інструкцію окремо:
FROM python:3.14.0a3-alpine3.21вкаже базовий Image;WORKDIR /appвстановить робочу директорію всередині контейнера;COPY app.py .таCOPY docker-logo.png .скопіюють код додатка до контейнера;RUN pip install flaskвстановить бібліотекуFlask;EXPOSE 8080встановить порт8080;ENTRYPOINT [“python”, “app.py” ]встановить команду запуску додатка.
Layerʼи треба створювати від найменш змінюванного да найчастіш змінюваного бо при перезбірці контейнера ті layerʼи які не були змінені підкачуються з кешу.
Then run in terminal:
-t - key to specify image name : tag . - path where program files are located relative to point where we execute docker build
Run it with:
If name of dockerfile is not "Dockerfile" but something else, you should specify -f key with name: