Docker là một trong những công cụ container hóa được sử dụng rộng rãi nhất trong thế giới DevOps. Nó rất cần thiết cho việc phát triển, triển khai và chạy các ứng dụng một cách hiệu quả. Bài viết này phác thảo ba dự án Docker thực tế, cung cấp hướng dẫn đầy đủ và mã cho mỗi dự án. Những dự án này sẽ giúp củng cố sự hiểu biết của bạn về Docker và các ứng dụng dựa trên container.
1. Xây dựng và chạy ứng dụng Web Flask trong Docker
Tổng quan về dự án:
Trong dự án này, bạn sẽ container hóa một ứng dụng web Flask đơn giản và chạy nó bên trong một container Docker. Flask là một framework web Python gọn nhẹ, hoàn hảo để minh họa khả năng của Docker với các ứng dụng Python.
Các bước thực hiện:
Bước 1: Thiết lập Ứng dụng Flask
Đầu tiên, chúng ta hãy tạo một ứng dụng Flask cơ bản.
- Tạo một thư mục dự án:
mkdir flask-docker-app cd flask-docker-app
- Bên trong thư mục dự án, hãy tạo một tệp Python có tên là app.py:
# app.py from flask import Flask app = Flask(__name__) @app.route('/') def home(): return "Hello, Dockerized Flask App!" if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000)
- Thêm tệp requirements.txt để xác định các dependency của dự án:
Flask==2.0.3
Bước 2: Tạo Dockerfile
Tạo một tệp có tên Dockerfile trong cùng thư mục để định nghĩa image cho ứng dụng Flask của chúng ta.
# Use an official Python runtime as a parent image
FROM python:3.9-slim # Set the working directory in the container
WORKDIR /app # Copy the current directory contents into the container at /app
COPY . /app # Install the dependencies
RUN pip install --no-cache-dir -r requirements.txt # Make port 5000 available to the outside world
EXPOSE 5000 # Define environment variable
ENV FLASK_APP=app.py # Run the application
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
Bước 3: Xây dựng và Chạy Container Docker
Xây dựng Docker image:
docker build -t flask-app .
Chạy Docker container:
docker run -d -p 5000:5000 flask-app
Bây giờ, nếu bạn điều hướng đến http://localhost:5000, bạn sẽ thấy ứng dụng Flask của mình đang chạy bên trong một container Docker.
Giải thích:
- Chúng ta đã định nghĩa một ứng dụng Flask đơn giản lắng nghe trên cổng 5000.
- Dockerfile kéo một image Python, thiết lập môi trường, cài đặt các dependency và chạy ứng dụng Flask.
- Lệnh docker build tạo một image từ Dockerfile và lệnh docker run khởi động container với cổng 5000 được exposed tới host.
2. Ứng dụng Node.js và MongoDB đa Container sử dụng Docker Compose
Tổng quan dự án:
Dự án này minh họa cách sử dụng Docker Compose để chạy một ứng dụng web Node.js với cơ sở dữ liệu MongoDB trong các container riêng biệt. Docker Compose giúp dễ dàng quản lý các ứng dụng Docker đa container.
Các bước thực hiện:
Bước 1: Thiết lập Ứng dụng Node.js
- Tạo một thư mục mới cho dự án của bạn:
mkdir node-mongo-app cd node-mongo-app
- Bên trong thư mục, khởi tạo một dự án Node.js và cài đặt Express và Mongoose:
npm init -y npm install express mongoose
- Tạo server.js:
const express = require('express'); const mongoose = require('mongoose'); const app = express(); // MongoDB connection mongoose.connect('mongodb://mongo:27017/dockerApp', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('MongoDB connected')) .catch(err => console.log(err)); app.get('/', (req, res) => { res.send('Hello from Node.js and MongoDB app in Docker!'); }); const PORT = 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); });
Bước 2: Tạo Dockerfile cho ứng dụng Node.js
# Use an official Node.js runtime as the base image
FROM node:14 # Set working directory inside the container
WORKDIR /app # Copy package.json and install dependencies
COPY package*.json ./
RUN npm install # Copy the rest of the application code
COPY . . # Expose the app port
EXPOSE 3000 # Run the application
CMD ["node", "server.js"]
Bước 3: Tệp Docker Compose
Tạo tệp docker-compose.yml để định nghĩa các service (ứng dụng Node.js và MongoDB):
version: '3'
services: nodeapp: build: . ports: - '3000:3000' depends_on: - mongo volumes: - .:/app mongo: image: mongo ports: - '27017:27017'
Bước 4: Xây dựng và chạy ứng dụng đa Container
Xây dựng và chạy ứng dụng bằng Docker Compose:
docker-compose up --build
Bây giờ bạn có thể truy cập http://localhost:3000 để xem ứng dụng đang chạy.
Giải thích:
- Ứng dụng Node.js và MongoDB chạy trong các container riêng biệt.
- Docker Compose giúp điều phối thiết lập đa container, đảm bảo MongoDB khởi động trước ứng dụng Node.js thông qua trường depends_on.
- volumes mount thư mục mã nguồn, cho phép cập nhật trực tiếp mà không cần xây dựng lại image.
3. Triển khai ứng dụng WordPress và MySQL sử dụng Docker Compose
Tổng quan dự án:
Trong dự án này, chúng ta sẽ triển khai một trang web WordPress được hỗ trợ bởi cơ sở dữ liệu MySQL bằng Docker Compose. Điều này sẽ minh họa cách thiết lập một môi trường giống như production bằng cách sử dụng container.
Các bước thực hiện:
Bước 1: Tệp Docker Compose cho WordPress và MySQL
Tạo một thư mục dự án và bên trong nó, tạo một tệp docker-compose.yml:
version: '3' services: wordpress: image: wordpress:latest container_name: wordpress_container ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wordpress_user WORDPRESS_DB_PASSWORD: wordpress_password WORDPRESS_DB_NAME: wordpress_db volumes: - ./wp_data:/var/www/html db: image: mysql:5.7 container_name: mysql_container restart: always environment: MYSQL_DATABASE: wordpress_db MYSQL_USER: wordpress_user MYSQL_PASSWORD: wordpress_password MYSQL_ROOT_PASSWORD: root_password volumes: - ./db_data:/var/lib/mysql
Bước 2: Tạo Volume cho lưu trữ liên tục
Trong thiết lập này, chúng ta đã thêm các volume wp_data và db_data để lưu trữ dữ liệu WordPress và MySQL liên tục trên máy chủ.
Bước 3: Chạy ứng dụng
Để chạy ứng dụng:
- Thực hiện:
docker-compose up -d
Điều này sẽ kéo các image WordPress và MySQL từ Docker Hub, thiết lập các biến môi trường và khởi chạy các container.
- Khi các container đang chạy, hãy điều hướng đến http://localhost:8080 để hoàn tất cài đặt WordPress.
Giải thích:
- WordPress và MySQL chạy trong các container riêng biệt, được kết nối thông qua mạng nội bộ của Docker.
- Các biến môi trường MySQL xác định tên cơ sở dữ liệu, người dùng và mật khẩu.
- Phần volumes đảm bảo rằng dữ liệu WordPress và cơ sở dữ liệu MySQL của bạn vẫn còn nguyên vẹn ngay cả khi các container bị dừng hoặc xóa.
Kết luận
Ba dự án này cung cấp kinh nghiệm thực hành, thực tế với Docker, bao gồm nhiều kịch bản trong thế giới thực. Ứng dụng Flask demo cách container hóa một ứng dụng Python đơn giản. Dự án Node.js và MongoDB minh họa cách Docker Compose có thể quản lý các ứng dụng đa container. Dự án WordPress-MySQL cho thấy cách thiết lập một môi trường giống production với bộ nhớ liên tục.
Mỗi dự án tuân theo các phương pháp hay nhất của ngành như cô lập các service, xác định dependency trong Dockerfile và docker-compose.yml, và sử dụng các công cụ điều phối container để sắp xếp hợp lý việc quản lý ứng dụng. Những bài tập này sẽ giúp bạn nắm vững các khái niệm cốt lõi của Docker và cung cấp kinh nghiệm quý báu cho các dự án thực tế. Cảm ơn các bạn đã theo dõi.