Docker là một nền tảng mã nguồn mở giúp đơn giản hóa quá trình phát triển, triển khai và chạy các ứng dụng bằng cách sử dụng các container. Một trong những khía cạnh quan trọng của Docker là khả năng quản lý lưu trữ (storage) để đảm bảo rằng dữ liệu được lưu trữ một cách an toàn và hiệu quả. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về các tùy chọn lưu trữ trong Docker, cách sử dụng chúng, và cung cấp các ví dụ cụ thể để minh họa.
Tổng Quan Về Storage Trong Docker
Docker cung cấp nhiều tùy chọn lưu trữ để quản lý dữ liệu của các container. Các tùy chọn này bao gồm:
- Volumes: Là phương pháp lưu trữ được Docker khuyến nghị, volumes lưu trữ dữ liệu trên hệ thống file của host và có thể được chia sẻ giữa các container.
- Bind Mounts: Cho phép bạn gắn kết một thư mục hoặc file từ hệ thống file của host vào container.
- tmpfs Mounts: Lưu trữ dữ liệu trong bộ nhớ RAM của host, không được ghi vào hệ thống file của host.
- Storage Drivers: Quản lý cách các image và container được lưu trữ và quản lý trên host Docker.
Docker Volumes
Khái Niệm Về Docker Volumes
Docker volumes là các hệ thống file được gắn kết vào container để lưu trữ dữ liệu. Volumes được lưu trữ trên hệ thống file của host và có thể được chia sẻ giữa nhiều container. Volumes cung cấp nhiều lợi ích như tính di động, hiệu suất cao, và khả năng quản lý dễ dàng.
Tạo và Sử Dụng Docker Volumes
-
Tạo Docker Volume
Sử dụng lệnh
docker volume create
để tạo một Docker volume:bashdocker volume create my-volume
-
Gắn Kết Docker Volume Vào Container
Sử dụng lệnh
docker run
với tùy chọn-v
để gắn kết Docker volume vào container:bashdocker run -d -v my-volume:/data --name my-container ubuntu
Trong ví dụ trên:
my-volume
là tên của Docker volume./data
là thư mục trong container nơi volume được gắn kết.
-
Kiểm Tra Docker Volumes
Sử dụng lệnh
docker volume ls
để liệt kê tất cả các Docker volumes:bashdocker volume ls
-
Xóa Docker Volume
Sử dụng lệnh
docker volume rm
để xóa một Docker volume:bashdocker volume rm my-volume
Bind Mounts
Khái Niệm Về Bind Mounts
Bind mounts cho phép bạn gắn kết một thư mục hoặc file từ hệ thống file của host vào container. Bind mounts rất hữu ích khi bạn cần chia sẻ dữ liệu giữa host và container hoặc khi bạn cần truy cập các file hệ thống của host từ container.
Tạo và Sử Dụng Bind Mounts
-
Gắn Kết Bind Mount Vào Container
Sử dụng lệnh
docker run
với tùy chọn-v
để gắn kết bind mount vào container:bashdocker run -d -v /path/on/host:/path/in/container --name my-container ubuntu
Trong ví dụ trên:
/path/on/host
là đường dẫn trên hệ thống file của host./path/in/container
là thư mục trong container nơi bind mount được gắn kết.
-
Kiểm Tra Bind Mounts
Sử dụng lệnh
docker inspect
để kiểm tra các bind mounts của container:bashdocker inspect my-container
tmpfs Mounts
Khái Niệm Về tmpfs Mounts
tmpfs mounts lưu trữ dữ liệu trong bộ nhớ RAM của host và không được ghi vào hệ thống file của host. tmpfs mounts rất hữu ích khi bạn cần lưu trữ dữ liệu tạm thời hoặc khi bạn cần bảo vệ hiệu suất của container bằng cách tránh ghi dữ liệu vào đĩa.
Tạo và Sử Dụng tmpfs Mounts
-
Gắn Kết tmpfs Mount Vào Container
Sử dụng lệnh
docker run
với tùy chọn--tmpfs
để gắn kết tmpfs mount vào container:bashdocker run -d --tmpfs /path/in/container:size=64m --name my-container ubuntu
Trong ví dụ trên:
/path/in/container
là thư mục trong container nơi tmpfs mount được gắn kết.size=64m
chỉ định kích thước của tmpfs mount là 64MB.
Storage Drivers
Khái Niệm Về Storage Drivers
Storage drivers quản lý cách các image và container được lưu trữ và quản lý trên host Docker. Mỗi storage driver có các đặc điểm hiệu suất và tính năng riêng, phù hợp với các loại workload khác nhau.
Các Loại Storage Drivers
Docker hỗ trợ nhiều loại storage drivers, bao gồm:
- overlay2: Là storage driver mặc định cho hầu hết các bản phân phối Linux hiện tại, không cần cấu hình thêm.
- fuse-overlayfs: Được sử dụng cho Docker rootless trên các host không hỗ trợ rootless
overlay2
. - btrfs và zfs: Hỗ trợ các tùy chọn nâng cao như tạo "snapshots", nhưng yêu cầu cấu hình và bảo trì nhiều hơn.
- vfs: Được sử dụng cho mục đích kiểm thử, không khuyến nghị sử dụng trong môi trường sản xuất do hiệu suất kém.
Kiểm Tra Storage Driver Hiện Tại
Sử dụng lệnh docker info
để kiểm tra storage driver hiện tại:
bash
docker info | grep "Storage Driver"
Ví Dụ: Tạo và Sử Dụng Docker Volumes
Trong ví dụ này, chúng ta sẽ tạo và sử dụng Docker volumes để lưu trữ dữ liệu của một ứng dụng web đơn giản.
-
Tạo Dockerfile Cho Ứng Dụng Web
Tạo một file có tên là
Dockerfile
với nội dung sau:Dockerfile# Sử dụng image chính thức của Node.js làm base image FROM node:14 # Tạo thư mục làm việc trong container WORKDIR /app # Sao chép package.json và package-lock.json vào thư mục làm việc COPY package*.json ./ # Cài đặt các phụ thuộc của ứng dụng RUN npm install # Sao chép mã nguồn ứng dụng vào thư mục làm việc COPY . . # Mở cổng 8080 để truy cập ứng dụng EXPOSE 8080 # Chạy ứng dụng khi container khởi động CMD ["node", "app.js"]
-
Tạo file package.json
Tạo một file có tên là
package.json
với nội dung sau:json{ "name": "docker-example", "version": "1.0.0", "description": "A simple web application", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.17.1" } }
-
Tạo file app.js
Tạo một file có tên là
app.js
với nội dung sau:javascriptconst express = require("express"); const app = express(); const port = 8080; app.get("/", (req, res) => { res.send("Hello, Docker Volumes!"); }); app.listen(port, () => { console.log(`App running at http://localhost:${port}`); });
-
Xây Dựng Docker Image Cho Ứng Dụng Web
Sử dụng lệnh
docker build
để xây dựng Docker image từ Dockerfile:bashdocker build -t docker-example .
-
Tạo Docker Volume
Sử dụng lệnh
docker volume create
để tạo Docker volume:bashdocker volume create my-volume
-
Chạy Docker Container Với Docker Volume
Sử dụng lệnh
docker run
để tạo và chạy một container từ Docker image vừa xây dựng, gắn kết Docker volume vào container:bashdocker run -d -p 8080:8080 -v my-volume:/data --name my-docker-app docker-example
-
Truy Cập Ứng Dụng
Mở trình duyệt web và truy cập
http://localhost:8080
. Bạn sẽ thấy thông báo "Hello, Docker Volumes!".
Các Thực Hành Tốt Nhất Khi Sử Dụng Docker Storage
Sử Dụng Các Image Chính Thức
Sử dụng các Docker image chính thức từ Docker Hub để đảm bảo tính bảo mật và hiệu suất.
Dockerfile
FROM python:3.9-slim
Giảm Số Lớp (Layers)
Mỗi chỉ thị RUN
, COPY
, ADD
tạo ra một lớp mới trong Docker image. Hãy kết hợp các lệnh lại để giảm số lớp.
Dockerfile
RUN apt-get update && apt-get install -y \
curl \
vim \
&& rm -rf /var/lib/apt/lists/*
Sử Dụng .dockerignore
Sử dụng file .dockerignore
để loại bỏ các file không cần thiết khỏi build context, giúp giảm kích thước Docker image.
plaintext
node_modules
.git
Dockerfile
.dockerignore
Không Lưu Trữ Secrets Trong Dockerfile
Không lưu trữ các thông tin nhạy cảm như mật khẩu hoặc khóa API trong Dockerfile. Sử dụng Docker secrets hoặc biến môi trường để quản lý các thông tin này.
Chạy Container Với Quyền Hạn Thấp
Tránh chạy container với quyền root. Sử dụng chỉ thị USER
để thiết lập người dùng không có quyền root.
Dockerfile
RUN useradd -m myuser
USER myuser
Kết Luận
Storage trong Docker là một khía cạnh quan trọng giúp đảm bảo rằng dữ liệu của các container được lưu trữ một cách an toàn và hiệu quả. Bằng cách sử dụng các tùy chọn lưu trữ như Docker volumes, bind mounts, tmpfs mounts, và storage drivers, các nhà phát triển có thể quản lý dữ liệu của mình một cách linh hoạt và hiệu quả. Việc hiểu rõ các tùy chọn lưu trữ và cách sử dụng chúng sẽ giúp bạn tận dụng tối đa các lợi ích mà Docker mang lại. Bằng cách tuân theo các thực hành tốt nhất, bạn có thể đảm bảo rằng ứng dụng của mình sẽ hoạt động nhất quán và an toàn trên nhiều môi trường khác nhau.