Cách tạo Dockerfile và Docker Compose cho ứng dụng Flask với cơ sở dữ liệu PostgreSQL
By khoanc, at: 09:25 Ngày 20 tháng 11 năm 2024
Thời gian đọc ước tính: __READING_TIME__ minutes


Trong bài viết trước, "Tạo một Dockerfile cho ứng dụng Flask", chúng ta đã tìm hiểu về việc đóng gói một ứng dụng Flask với Docker.
Trong bài viết này, chúng ta sẽ tích hợp cơ sở dữ liệu PostgreSQL với SQLAlchemy và chỉ ra cách đóng gói cả ứng dụng Flask và cơ sở dữ liệu bằng Docker và Docker Compose. Đối với hướng dẫn này, chúng ta sẽ sử dụng python:3.10-slim
làm ảnh cơ sở vì nó nhẹ.
Bước 1: Dockerfile cho Flask
Đây là Dockerfile
đã được cập nhật:
# Sử dụng thời gian chạy Python chính thức làm ảnh cơ sở
FROM python:3.10-slim
# Thiết lập thư mục làm việc trong container
WORKDIR /app
# Cài đặt các phụ thuộc Python
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Sao chép mã ứng dụng vào container
COPY . .
# Bộc lộ cổng ứng dụng
EXPOSE 5000
# Lệnh để khởi chạy ứng dụng Flask
CMD ["python", "app.py"]
Bước 2: Cấu hình Docker Compose
Tệp docker-compose.yml
đã được cập nhật để quản lý cả Flask và PostgreSQL:
version: '3.8'
services:
web:
build:
context: .
container_name: flask_app
ports:
- "5000:5000"
volumes:
- .:/app
environment:
- SQLALCHEMY_DATABASE_URI=postgresql://glinteco:glinteco@db:5432/glinteco
depends_on:
- db
db:
image: postgres:13
container_name: postgres_db
environment:
POSTGRES_USER: glinteco
POSTGRES_PASSWORD: glinteco
POSTGRES_DB: glinteco
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Bước 3: Cập nhật ứng dụng Flask cho SQLAlchemy
Đây là một ví dụ về ứng dụng Flask (app.py
) được cấu hình để sử dụng cơ sở dữ liệu PostgreSQL:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# Cấu hình cơ sở dữ liệu
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://glinteco:glinteco@db:5432/glinteco'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
# Định nghĩa một mô hình đơn giản
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), nullable=False)
@app.route('/')
def index():
return "Hello, Flask with PostgreSQL!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Bước 4: Xây dựng và chạy các container
Xây dựng ảnh Docker:
docker-compose build
Khởi chạy các container:
docker-compose up
docker-compose up -d # Chạy như một daemon
Kiểm tra thiết lập:
Truy cập ứng dụng Flask tại http://localhost:5000
.
PostgreSQL sẽ chạy trên localhost:5432
với tên người dùng, mật khẩu và tên cơ sở dữ liệu là glinteco
.
Lợi ích chính của thiết lập này
- Môi trường phát triển thống nhất: Flask và PostgreSQL chạy liền mạch trong các container, đảm bảo tính nhất quán.
- Cài đặt cơ sở dữ liệu tùy chỉnh: Tên người dùng, mật khẩu và tên cơ sở dữ liệu có thể dễ dàng cập nhật trong cấu hình.
- Tích hợp đơn giản: SQLAlchemy cung cấp một cách sạch sẽ và hiệu quả để tương tác với cơ sở dữ liệu.
Các lỗi Docker thường gặp và cách khắc phục
Lỗi: "Không thể kết nối đến daemon Docker"
Điều này xảy ra khi daemon Docker không chạy hoặc người dùng thiếu quyền truy cập vào nó. Để giải quyết điều này, hãy đảm bảo daemon Docker đang chạy với lệnh sudo systemctl start docker
. Bạn cũng có thể thêm người dùng của mình vào nhóm Docker bằng sudo usermod -aG docker $USER
để tránh sử dụng sudo
cho mọi lệnh. Sau đó, khởi động lại hệ thống hoặc đăng xuất và đăng nhập lại để áp dụng các thay đổi nhóm.
Lỗi: "Ảnh không tìm thấy"
Điều này xảy ra khi ảnh Docker được chỉ định không tồn tại cục bộ hoặc trong kho lưu trữ Docker Hub. Để khắc phục điều này, hãy kiểm tra lại tên và phiên bản ảnh, sau đó tải xuống bằng docker pull < image_name >:< tag >
. Nếu bạn không chắc chắn về tên ảnh, hãy sử dụng docker search < image_name >
để tìm ảnh chính xác.
Lỗi: "Cổng đã được sử dụng"
Nếu một container hoặc một ứng dụng khác đã sử dụng cổng được chỉ định, hãy sử dụng lệnh sudo lsof -i :< port >
để xác định quy trình xung đột. Bạn có thể dừng quy trình đó hoặc chỉ định một cổng khác trong lệnh chạy Docker hoặc docker-compose.yml
của bạn.
Lỗi: "Permission denied" khi truy cập tệp
Lỗi này phát sinh khi container thiếu quyền truy cập vào các tệp hoặc thư mục trên máy chủ. Đảm bảo quyền chính xác bằng chmod 777 < file_or_directory >
. Trên các hệ thống có SELinux, hãy sử dụng tùy chọn :z
hoặc :Z
khi gắn kết các volume để cho phép truy cập đúng, chẳng hạn như volumes: - /host/path:/container/path:Z
.
Lỗi: "Container exited with code 1"
Lỗi này cho biết ứng dụng bên trong container gặp sự cố và đã thoát. Kiểm tra nhật ký container để biết chi tiết bằng docker logs
. Xem lại cấu hình ứng dụng, các phụ thuộc hoặc điểm vào để giải quyết sự cố.
Lỗi: "Hết bộ nhớ" hoặc "Không thể phân bổ bộ nhớ"
Docker hoặc hệ thống máy chủ có thể thiếu bộ nhớ đủ. Hạn chế việc sử dụng bộ nhớ container trong docker-compose.yml
bằng mem_limit: 512m
. Ngoài ra, hãy giải phóng bộ nhớ hệ thống hoặc thêm không gian hoán đổi vào hệ thống máy chủ.
Lỗi: "Mounts denied: path outside of the allowed directories" trên Mac hoặc Windows
Docker Desktop hạn chế quyền truy cập vào một số thư mục. Để khắc phục điều này, hãy thêm thư mục vào danh sách thư mục được chia sẻ trong cài đặt Docker Desktop hoặc sử dụng các thư mục trong các đường dẫn được phép, chẳng hạn như các thư mục bên trong thư mục người dùng của bạn.
Lỗi: "No space left on device"
Điều này xảy ra khi Docker tiêu thụ tất cả dung lượng đĩa khả dụng. Xóa các ảnh, container và volume không sử dụng bằng docker system prune -a
. Bạn cũng có thể kiểm tra các tệp Docker lớn bằng docker system df
và dọn dẹp chúng cho phù hợp.
Lỗi: "Network not found"
Điều này xảy ra khi mạng Docker được chỉ định không tồn tại. Liệt kê các mạng hiện có bằng docker network ls
, và nếu cần, hãy tạo mạng bằng docker network create < network_name >
.
Lỗi: "Conflict: Unable to remove volume"
Một volume có thể vẫn đang được sử dụng bởi một container. Để khắc phục điều này, hãy dừng và xóa container sử dụng volume bằng docker stop
và docker rm < container_name >
. Sau đó, xóa volume bằng docker volume rm
.
Lỗi: "Build failed: Invalid reference format"
Lỗi này xảy ra nếu tên hoặc thẻ ảnh trong Dockerfile hoặc lệnh không hợp lệ. Đảm bảo định dạng tuân theo
và tránh các ký tự đặc biệt hoặc khoảng trắng.:
Lỗi: "Docker Compose version mismatch"
Điều này xảy ra khi phiên bản tệp Docker Compose không tương thích với phiên bản Compose đã cài đặt. Kiểm tra phiên bản Docker Compose của bạn bằng docker-compose --version
, và hoặc sử dụng phiên bản tương thích trong tệp docker-compose.yml
của bạn hoặc cập nhật Docker Compose lên phiên bản mới hơn.
Kết luận
Bằng cách làm theo hướng dẫn này, bạn có thể đóng gói một ứng dụng Flask với cơ sở dữ liệu PostgreSQL bằng Docker và Docker Compose. Thiết lập này đảm bảo một môi trường có thể mở rộng và nhất quán cho việc phát triển và triển khai. Nếu bạn chưa từng, hãy xem lại bài đăng gốc của chúng tôi ở đây để hiểu sâu hơn về việc đóng gói các ứng dụng Flask.