Triển khai ứng dụng Flask, Celery, Redis cùng với Docker Compose

Tiếp tục với mục đích rèn luyện kỹ năng viết Dockerfile và Docker Compose, hôm nay mình sẽ cũng bạn triển khai ứng dụng Flask với Docker Compose cùng với service Redis, Celery.

triển khai flask với docker compose

Chuẩn bị môi trường #

  • Docker version 18.09.1 hoặc mới hơn.
  • Docker Compose version 1.24.0 hoặc mới hơn.

Tạo ứng dụng Flask #

Trong bài viết này, mình sẽ sử dụng ứng dụng Flask tại đây. Vì vậy, trước tiên bạn hãy lấy source code từ Github về nhé:

git clone https://github.com/nickjj/build-a-saas-app-with-flask

# Truy cập vào thư mục chứa source code vừa tải về
cd build-a-saas-app-with-flask

git checkout 8804f0d899c9908a6cc45756a00f284daba462f5

cp .env.example .env

Chuẩn bị Dockerfile #

Trong thư mục hiện tại, bạn hãy tạo mới một Dockerfile cho source code Flask vừa tải về:

vi Dockerfile

Điền vào file như bên dưới:

FROM python:3.7.4-slim-buster
LABEL maintainer="tel4vn.edu.vn"

WORKDIR /app

COPY requirements.txt requirements.txt

ENV BUILD_DEPS="build-essential" \
    APP_DEPS="curl libpq-dev"

RUN apt-get update \
  && apt-get install -y ${BUILD_DEPS} ${APP_DEPS} --no-install-recommends \
  && pip install -r requirements.txt \
  && rm -rf /var/lib/apt/lists/* \
  && rm -rf /usr/share/doc && rm -rf /usr/share/man \
  && apt-get purge -y --auto-remove ${BUILD_DEPS} \
  && apt-get clean

ARG FLASK_ENV="production"
ENV FLASK_ENV="${FLASK_ENV}" \
    PYTHONUNBUFFERED="true"

COPY . .

RUN pip install --editable .

EXPOSE 8000

CMD ["gunicorn", "-c", "python:config.gunicorn", "snakeeyes.app:create_app()"]

Chỉnh sửa .dockerignore #

Bạn có thể thấy trong Dockerfile bên trên, có một thao tác là COPY . .”. Thao tác này sẽ copy toàn bộ file trong thư mục source code của Flask vào trong Docker image. Việc này rất nguy hiểm nếu trong source code có các file chứa thông tin nhạy cảm như password, thông tin cá nhân, … 

Do đó, bạn nên sử dụng file .dockerignore để không copy các file nhạy cảm khi build Image.

Tạo file docker-compose.yml #

Tiếp theo, hãy tạo một file docker-compose.yml để chạy nhiều Container một lúc:

version: "3.4"

services:
  redis:
    env_file:
      - ".env"
    image: "redis:5.0.4-stretch"
    restart: "${DOCKER_RESTART_POLICY:-unless-stopped}"
    stop_grace_period: "${DOCKER_STOP_GRACE_PERIOD:-3s}"
    volumes:
      - "redis:/data"

  web:
    build:
      context: "."
      args:
        - "FLASK_ENV=${FLASK_ENV:-production}"
    depends_on:
      - "redis"
    env_file:
      - ".env"
    healthcheck:
      test: "${DOCKER_HEALTHCHECK_TEST:-curl localhost:8000/healthy}"
      interval: "60s"
      timeout: "3s"
      start_period: "5s"
      retries: 3
    ports:
      - "${DOCKER_WEB_PORT:-127.0.0.1:8000}:8000"
    restart: "${DOCKER_RESTART_POLICY:-unless-stopped}"
    stop_grace_period: "${DOCKER_STOP_GRACE_PERIOD:-3s}"
    volumes:
      - "${DOCKER_WEB_VOLUME:-./public:/app/public}"

  worker:
    build:
      context: "."
      args:
        - "FLASK_ENV=${FLASK_ENV:-production}"
    command: celery worker -B -l info -A snakeeyes.blueprints.contact.tasks
    depends_on:
      - "redis"
    env_file:
      - ".env"
    restart: "${DOCKER_RESTART_POLICY:-unless-stopped}"
    stop_grace_period: "${DOCKER_STOP_GRACE_PERIOD:-3s}"
    volumes:
      - "${DOCKER_WEB_VOLUME:-./public:/app/public}"

volumes:
  redis: {}

Ở file docker-compose.yml trên, bạn có thể thấy một cấu hình là:

env_file:
      - ".env"

Với cấu hình này, Docker Compose sẽ đọc file .env trong thư mục cùng với file docker-compose.yml để khởi tạo các biến môi trường khi chạy container.

Khởi chạy ứng dụng Flask #

Như vậy mọi thứ đã xong, giờ bạn có thể khởi tạo ứng dụng Flask bằng cách sử dụng câu lệnh:

docker-compose up --build

Sau khi quá trình chạy hoàn tất, bạn có thể kiểm tra trạng thái các Container được tạo bằng câu lệnh dưới:

docker-compose ps

Thông tin tương tự như bên dưới sẽ hiển thị trên màn hình:

Name                        State   Ports          
----------------------------------------------------------
snakeeyes_redis_1     ...   Up      6379/tcp
snakeeyes_web_1       ...   Up      0.0.0.0:8000->8000/tcp
snakeeyes_worker_1    ...   Up      8000/tcp

Khi muốn tắt ứng dụng, bạn hãy sử dụng câu lệnh Docker Compose như bên dưới:

docker-compose stop

Kết luận #

Thông qua ví dụ trên, mình đã hướng dẫn bạn cách triển khai một ứng dụng Flask sử dụng Docker Compose. Với những ứng dụng khác, bạn có thể làm các bước tương tự nhé. Cuối cùng, nếu bất kì thắc mắc nào, bạn hãy bình luận ở bên dưới để mình hỗ trợ nhé. 

Nguồn tham khảo: nickjanetakis.com

Trung tâm đào tạo Viễn thông và Công nghệ thông tin TEL4VN (TEL4VN) chuyên đào tạo các khóa học về DevOps như: Docker, Kubernetes, Ansible, Jenkins, Linux…….Ngoài ra, TEL4VN còn là Trung tâm đào tạo duy nhất về VoIP mã nguồn mở.

🌐Website: https://tel4vn.edu.vn/
🔗 Fanpage: https://www.facebook.com/tel4vn

🔗 Youtube: TEL4VN

🏠Địa chỉ: 82/2/9 Đinh Bộ Lĩnh, P.26, Q.Bình Thạnh, TP.HCM
☎️SĐT: 028 3622 0868
📩 Email: tuyensinh@tel4vn.com

Mình là Tùng, hiện đang là DevOps tại Công Ty CP EcoIT. Với kinh nghiệm có được từ trong công việc, mình muốn chia sẻ cho bạn đọc cùng biết và cùng nhau học thêm nhiều điều mới trong lĩnh vực DevOps.

Powered by BetterDocs

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *