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

Flask==3.0.0

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:

docker build -t some_server:1.0 .

-t - key to specify image name : tag . - path where program files are located relative to point where we execute docker build

Run it with:

docker run --name some-server -d -p 8080:8080 some_server:1.0

If name of dockerfile is not "Dockerfile" but something else, you should specify -f key with name:

docker build -t some_serv:1.0 -f DocDocDockerfile .