7.1 Gắn kết volumes
Gắn kết volumes và mạng trong Docker Compose cho phép tạo ra các ứng dụng đa container linh hoạt và hiệu quả. Volumes được sử dụng để lưu trữ dữ liệu cần được duy trì bên ngoài container, trong khi mạng (networks) đảm bảo sự tương tác giữa các container. Trong bài giảng này, bọn mình sẽ tìm hiểu chi tiết cách sử dụng volumes và mạng trong Docker Compose nha.
Volumes trong Docker cho phép lưu trữ dữ liệu bên ngoài container, đảm bảo chúng vẫn có sẵn ngay cả khi container bị dừng hoặc xóa. Điều này đặc biệt hữu ích để lưu trữ dữ liệu cơ sở dữ liệu, tệp nhật ký, và dữ liệu cần tính lâu dài khác.
Các loại volumes:
- Volumes được đặt tên (Named Volumes): được Docker quản lý và lưu trong một thư mục đặc biệt trên máy chủ host.
- Volumes được gắn kết (Bind Mounts): được gắn kết vào container từ thư mục cụ thể trên máy chủ host.
Định nghĩa volumes trong Docker Compose
Ví dụ volumes được đặt tên
Trong ví dụ này, một volume được đặt tên là postgres-data
được gắn kết vào thư mục /var/lib/postgresql/data
bên trong container db
.
version: '3.8'
services:
db:
image: postgres:latest
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Ví dụ volumes được gắn kết
Trong ví dụ này, thư mục cục bộ và tệp nginx.conf
cũng như html
được gắn kết vào container web
dưới dạng volumes được gắn kết.
version: '3.8'
services:
web:
image: nginx:latest
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
7.2 Gắn kết mạng
Mạng trong Docker Compose cho phép các containers tương tác với nhau. Mỗi container có thể được kết nối với một hoặc nhiều mạng, đảm bảo sự cách ly và quản lý lưu lượng.
Các loại mạng:
- Mạng cầu (Bridge): mặc định, containers được kết nối với mạng cầu, cho phép chúng tương tác trên cùng một host.
- Mạng overlay: được sử dụng để kết nối các containers chạy trên các host khác nhau trong cluster Docker Swarm.
- Plugins mạng (Network Plugins): cho phép sử dụng các driver mạng bên thứ ba để tạo cấu hình phức tạp hơn.
Ví dụ tạo và sử dụng mạng người dùng
Trong ví dụ này, hai mạng người dùng front-end và back-end được tạo. Dịch vụ app được kết nối với cả hai mạng, dịch vụ web chỉ với front-end, và dịch vụ db chỉ với back-end.
version: '3.8'
services:
web:
image: nginx:latest
networks:
- front-end
app:
image: myapp:latest
networks:
- front-end
- back-end
db:
image: postgres:latest
networks:
- back-end
networks:
front-end:
back-end:
Lời khuyên thực tế:
- Sử dụng volumes có tên: volumes có tên được quản lý bởi Docker và mang lại sự đơn giản trong việc sử dụng và quản lý dữ liệu. Volumes có tên có thể được kết nối đồng thời với nhiều dịch vụ. Ví dụ, dịch vụ backend ghi log, còn dịch vụ giám sát thì phân tích chúng và thông báo nếu phát hiện lỗi cấp độ
error
. - Phân tách mạng: sử dụng nhiều mạng cho phép cách ly các phần khác nhau của ứng dụng và kiểm soát sự tương tác của chúng.
- Lưu trữ các file cấu hình: sử dụng volumes gắn kết để liên kết các file cấu hình, điều này cho phép dễ dàng thay đổi cấu hình mà không cần rebuild lại images.
- Bảo mật mạng: giới hạn quyền truy cập vào mạng để chỉ các container cần thiết có thể tương tác với nhau, tăng cường bảo mật cho ứng dụng.
7.3 Ví dụ sử dụng volumes và networks
Ví dụ sử dụng volumes và networks trong Docker Compose:
Ví dụ 1: Ứng dụng với web server và cơ sở dữ liệu
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
networks:
- webnet
db:
image: postgres:latest
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db-data:
networks:
webnet:
Trong ví dụ này:
- Web server nginx và cơ sở dữ liệu PostgreSQL được kết nối vào cùng một mạng webnet, cho phép chúng giao tiếp với nhau. Nếu chỉ có một mạng, không cần chỉ định - sẽ tự động tạo mạng mặc định.
- Dữ liệu cơ sở dữ liệu được lưu trữ trong một volume có tên là db-data, đảm bảo dữ liệu được giữ lại khi khởi động lại containers.
Ví dụ 2: Ứng dụng đa tầng
version: '3.8'
services:
frontend:
image: myfrontend:latest
networks:
- front-tier
- back-tier
backend:
image: mybackend:latest
networks:
- back-tier
volumes:
- backend-data:/var/lib/backend
database:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db-data:/var/lib/mysql
networks:
- back-tier
volumes:
backend-data:
db-data:
networks:
front-tier:
back-tier:
Trong ví dụ này:
- Tạo hai mạng: front-tier và back-tier.
- Service frontend được kết nối vào cả hai mạng, điều này cho phép nó giao tiếp với cả backend và client bên ngoài.
- Các service backend và database chỉ được kết nối với mạng back-tier để đảm bảo cô lập và giao tiếp của chúng với nhau.
- Dữ liệu của các service backend và database được lưu trong các volumes riêng biệt là backend-data và db-data.
GO TO FULL VERSION