Hướng dẫn bắt đầu Docker: Nhanh chóng container hóa ứng dụng của bạn
# Hướng dẫn bắt đầu Docker: Nhanh chóng container hóa ứng dụng của bạn
Docker đã trở thành một phần không thể thiếu trong phát triển và triển khai phần mềm hiện đại. Mặc dù các cuộc thảo luận về Kubernetes diễn ra tràn lan, nhưng Docker vẫn là công cụ được nhiều công ty lựa chọn để xây dựng, kiểm tra và triển khai ứng dụng. Bài viết này sẽ hướng dẫn bạn nhanh chóng làm quen với Docker, hiểu các khái niệm cốt lõi của nó và cung cấp một ví dụ thực tế để giúp bạn bắt đầu container hóa ứng dụng của mình.
## Các khái niệm cốt lõi của Docker
Trước khi bắt đầu thực hành, điều quan trọng là phải hiểu một số khái niệm cốt lõi của Docker:
* **Image (Ảnh):** Ảnh là một template chỉ đọc, chứa mọi thứ cần thiết để chạy một ứng dụng: mã, môi trường runtime, công cụ hệ thống, thư viện và các dependency. Tương tự như ảnh máy ảo, nhưng nhẹ hơn nhiều.
* **Container (Container):** Container là một instance đang chạy được tạo từ một ảnh. Nó là một instance runtime của ảnh, chứa ứng dụng và tất cả các dependency của nó. Các container được cách ly với nhau, có hệ thống tệp, tiến trình và không gian mạng riêng.
* **Docker Hub:** Docker Hub là một kho lưu trữ ảnh công khai, nơi bạn có thể tải xuống các ảnh được xây dựng sẵn hoặc tải lên ảnh của riêng bạn. Tương tự như GitHub, nhưng dành riêng cho ảnh Docker.
* **Dockerfile:** Dockerfile là một tệp văn bản chứa tất cả các chỉ thị để xây dựng một ảnh Docker. Bằng cách viết Dockerfile, bạn có thể tự động hóa quá trình tạo ảnh.
* **Docker Compose:** Docker Compose là một công cụ để định nghĩa và chạy các ứng dụng Docker đa container. Nó cho phép bạn sử dụng tệp YAML để cấu hình các service của ứng dụng, sau đó sử dụng một lệnh duy nhất để khởi động hoặc dừng tất cả các service.
## Cài đặt Docker
Đầu tiên, bạn cần cài đặt Docker. Docker cung cấp các gói cài đặt cho nhiều hệ điều hành khác nhau. Truy cập [trang web chính thức của Docker](https://www.docker.com/get-started/) và làm theo hướng dẫn tương ứng để cài đặt.
Sau khi cài đặt xong, bạn có thể chạy lệnh `docker --version` để xác minh rằng Docker đã được cài đặt chính xác.
## Container hóa một ứng dụng Python đơn giản
Chúng ta sẽ tạo một ứng dụng Python đơn giản và sử dụng Docker để container hóa nó.
### 1. Tạo ứng dụng Python
Tạo một tệp có tên `app.py`, chứa đoạn mã sau:
```python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, Docker!"
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0')
Ứng dụng Flask đơn giản này sẽ trả về "Hello, Docker!" trên đường dẫn gốc /.
2. Tạo tệp requirements.txt
Ứng dụng phụ thuộc vào thư viện Flask, chúng ta cần tạo một tệp requirements.txt để khai báo các dependency này.
Flask
3. Tạo Dockerfile
Tạo một tệp có tên Dockerfile và thêm nội dung sau:
# Sử dụng ảnh Python chính thức làm ảnh cơ sở
FROM python:3.9-slim-buster
# Thiết lập thư mục làm việc
WORKDIR /app
# Sao chép tệp requirements.txt vào thư mục làm việc
COPY requirements.txt .
# Cài đặt các dependency
RUN pip install --no-cache-dir -r requirements.txt
```# Sao chép mã ứng dụng vào thư mục làm việc
COPY app.py .
# Mở cổng 5000
EXPOSE 5000
# Định nghĩa lệnh khởi động
CMD ["python", "app.py"]
Giải thích Dockerfile:
FROM python:3.9-slim-buster: Chỉ định image nền là phiên bản rút gọn của Python 3.9.WORKDIR /app: Đặt thư mục làm việc bên trong container là/app.COPY requirements.txt .: Sao chép filerequirements.txttừ thư mục hiện tại vào thư mục/apptrong container.RUN pip install --no-cache-dir -r requirements.txt: Chạy lệnhpipbên trong container để cài đặt các dependency được chỉ định trong filerequirements.txt. Tham số--no-cache-dirgiúp giảm kích thước image.COPY app.py .: Sao chép fileapp.pytừ thư mục hiện tại vào thư mục/apptrong container.EXPOSE 5000: Khai báo container sẽ lắng nghe trên cổng 5000.CMD ["python", "app.py"]: Định nghĩa lệnh sẽ được thực thi khi container khởi động.
4. Xây dựng Docker Image
Trong thư mục chứa Dockerfile, chạy lệnh sau để xây dựng Docker image:
docker build -t my-python-app .
docker build: Lệnh xây dựng image.-t my-python-app: Chỉ định tên cho image (my-python-app)..: Chỉ định thư mục chứa Dockerfile (thư mục hiện tại).
Quá trình xây dựng có thể mất một chút thời gian, tùy thuộc vào tốc độ mạng và kích thước của các dependency.
5. Chạy Docker Container
Sử dụng lệnh sau để chạy Docker container:
docker run -d -p 5000:5000 my-python-app
docker run: Lệnh chạy container.-d: Chạy container ở chế độ detached (chạy ngầm).-p 5000:5000: Ánh xạ cổng 5000 của host machine vào cổng 5000 của container.my-python-app: Chỉ định tên image sẽ sử dụng.
6. Xác minh ứng dụng
Truy cập http://localhost:5000 trong trình duyệt, bạn sẽ thấy "Hello, Docker!".
7. Dừng và xóa Container
Sử dụng lệnh sau để dừng container:
docker stop
`` Bạn có thể xem thông qua lệnh docker ps.
Sử dụng lệnh sau để xóa container:
docker rm
Bắt đầu với Docker Compose
Nếu ứng dụng của bạn bao gồm nhiều service, bạn có thể sử dụng Docker Compose để quản lý chúng.
1. Tạo file docker-compose.yml
Tạo một file có tên docker-compose.yml và thêm nội dung sau:
version: "3.9"
services:
web:
image: my-python-app
ports:
- "5000:5000"
Giải thích docker-compose.yml:* version: "3.9": Chỉ định phiên bản của tệp Docker Compose.
services: Định nghĩa các dịch vụ của ứng dụng.web: Định nghĩa một dịch vụ có tên là "web".image: my-python-app: Chỉ định image mà dịch vụ sử dụng.ports: Định nghĩa ánh xạ cổng.
2. Khởi động ứng dụng
Trong thư mục chứa tệp docker-compose.yml, hãy chạy lệnh sau để khởi động ứng dụng:
docker-compose up -d
docker-compose up: Lệnh khởi động ứng dụng.-d: Chạy container ở chế độ tách rời (detached).
3. Dừng ứng dụng
Sử dụng lệnh sau để dừng ứng dụng:
docker-compose down
Các biện pháp bảo mật tốt nhất cho Docker
Như đã thấy từ cuộc thảo luận, tính bảo mật của Docker image là một vấn đề quan trọng. Dưới đây là một số biện pháp bảo mật tốt nhất cho Docker:
- Sử dụng image chính thức: Cố gắng sử dụng các image được cung cấp chính thức, vì chúng thường được quét và bảo trì về mặt bảo mật.
- Quét lỗ hổng trong image: Sử dụng các công cụ như Trivy để quét các lỗ hổng đã biết trong image và cập nhật image kịp thời.
- Sử dụng nguyên tắc quyền tối thiểu: Tránh chạy container với quyền root.
- Giới hạn tài nguyên container: Sử dụng cgroups để giới hạn việc sử dụng CPU và bộ nhớ của container.
- Cập nhật image thường xuyên: Luôn cập nhật image để vá các lỗ hổng bảo mật.
- Sử dụng công cụ quét bảo mật: Các công cụ như Snyk, Clair có thể được tích hợp vào quy trình CI/CD của bạn để tự động quét các lỗ hổng trong image.





