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