Docker allows developers to package Python applications and their dependencies into containers. This ensures consistent environments across development, testing, and production, reducing “works on my machine” issues.
In this guide, we’ll cover:
- What Docker is and why it’s useful
- Writing a
Dockerfile
for a Python app - Building and running a Python container
- Using Docker Compose for multi-container applications
- Best practices for Dockerizing Python apps
1. Understanding Docker
1.1 What is Docker?
Docker is a platform that enables developers to create, deploy, and run applications inside lightweight, portable containers.
1.2 Why Use Docker for Python Applications?
Consistency – Ensures the same environment across all stages
Isolation – Avoids dependency conflicts
Portability – Runs anywhere (local machine, cloud, servers)
Scalability – Easily deploy and manage multiple instances
2. Writing a Dockerfile for a Python Application
A Dockerfile is a script containing instructions for building a Docker image.
2.1 Example Python Application (app.py
)
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello, Docker!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
2.2 Create a requirements.txt
File
txtCopyEditflask
2.3 Writing the Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.9
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container
COPY . .
# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Expose port 5000 for the application
EXPOSE 5000
# Define the command to run the application
CMD ["python", "app.py"]
3. Building and Running the Docker Container
3.1 Build the Docker Image
In the same directory as your Dockerfile
, run:
docker build -t python-docker-app .
This command builds a Docker image named python-docker-app
.
3.2 Run the Docker Container
docker run -p 5000:5000 python-docker-app
The app is now running at http://localhost:5000
.
4. Using Docker Compose for Multi-Container Applications
Docker Compose helps manage multi-container applications, like Python apps with databases.
4.1 Create a docker-compose.yml
File
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- redis
redis:
image: "redis:alpine"
This defines:
- A web service (our Python app)
- A Redis service (for caching)
4.2 Start the Services
Run:
docker-compose up
This starts both the Python app and Redis container.
5. Best Practices for Dockerizing Python Applications
Use a .dockerignore
file to exclude unnecessary files:
__pycache__/
*.pyc
.env
Use multistage builds to keep images lightweight:
FROM python:3.9 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.9
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY . .
CMD ["python", "app.py"]
Keep images small – Use python:3.9-slim
instead of python:3.9
.
Use environment variables instead of hardcoded configurations.
6. Deploying the Dockerized Python Application
6.1 Push to Docker Hub
- Log in:
docker login
- Tag the image:
docker tag python-docker-app username/python-docker-app
- Push the image:
docker push username/python-docker-app
6.2 Deploy with Docker on a Server
docker run -d -p 5000:5000 username/python-docker-app