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

How to Create a Dockerfile and Docker Compose for Flask Application with PostgreSQL Database
How to Create a Dockerfile and Docker Compose for Flask Application with PostgreSQL Database

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 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.

Tag list:
- Cannot connect to the Docker daemon
- Container exited with code 1
- Docker Image not found
- Docker Compose version mismatch
- Conflict: Unable to remove volume
- Image not found
- Containerized Flask application tutorial
- SQLAlchemy database URI for Flask
- PostgreSQL database in Flask Docker
- Build failed: Invalid reference format
- No space left on device
- Network not found
- Dockerfile for Flask and PostgreSQL
- SQLAlchemy integration in Docker
- How to containerize Flask with PostgreSQL
- PostgreSQL in Docker Compose
- Flask SQLAlchemy database setup
- Permission denied
- Out of memory
- Flask Docker Compose tutorial
- Flask application Docker Compose
- Flask app deployment with Docker
- Mounts denied: path outside of the allowed directories
- Build Flask app with Docker Compose
- Flask Docker Compose PostgreSQL tutorial
- Cannot allocate memory
- Port already in use

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.