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

Cách tạo Dockerfile và Docker Compose cho ứng dụng Flask với cơ sở dữ liệu PostgreSQL

Trong bài đăng trước của chúng tôi, "Tạo Dockerfile cho ứng dụng Flask", chúng tôi đã khám phá việc đóng gói ứng dụng Flask bằng Docker.

Trong bài đăng này, chúng ta sẽ tích hợp cơ sở dữ liệu PostgreSQL với SQLAlchemy và hướng dẫn 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 hình ả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 hình ả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 . .

# Tiết lộ cổng ứng dụng
EXPOSE 5000

# Lệnh để khởi động ứ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 hình ảnh Docker:

docker-compose build

 

Khởi động các container:

docker-compose up
docker-compose up -d  # Chạy như một daemon

 

Xác minh 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 có thể 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.

 

Lỗi Docker thường gặp và cách khắc phục

Lỗi: "Không thể kết nối với 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 vấn đề 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 cách sử dụ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: "Hình ảnh không tìm thấy"

Điều này xảy ra khi hình ả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 hình ả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 hình ảnh, hãy sử dụng docker search < image_name > để tìm hình ảnh chính xác.

 

Lỗi: "Cổng đã được sử dụng"

Nếu một container hoặc ứ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ủ. Hãy đảm bảo quyền chính xác với chmod 777 < file_or_directory >. Trên các hệ thống có SELinux, hãy sử dụng các tùy chọn :z hoặc :Z khi gắn kết các volume để cho phép truy cập chính xác, chẳng hạn như volumes: - /host/path:/container/path:Z.

 

Lỗi: "Container exited with code 1"

Lỗi này cho thấy ứ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 cách sử dụng docker logs <container_name></container_name>. Xem lại cấu hình ứng dụng, các phụ thuộc hoặc điểm nhập để 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 cách sử dụ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 cho 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. Hãy xóa các hình ả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 cách sử dụ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 cách sử dụ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 đang sử dụng volume bằng docker stop <container_name></container_name>docker rm < container_name >. Sau đó, hãy xóa volume bằng docker volume rm <volume_name></volume_name>.

 

Lỗi: "Build failed: Invalid reference format"

Lỗi này xảy ra nếu tên hoặc thẻ hình ảnh trong Dockerfile hoặc lệnh không hợp lệ. Hãy đảm bảo định dạng tuân theo <repository>/:<tag></tag></repository> 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 cách sử dụng docker-compose --version, và hãy 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 ứ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 khả năng mở rộng và nhất quán để 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

Liên quan

Python Flask

Đọc thêm
Experience Python

Đọc thêm
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.