1. Vấn đề của volume với Swarm mode
- Volume native (local driver): Chỉ tạo tại node mà service đang chạy.
- Khi scale service ra nhiều node, mỗi node tạo 1 volume riêng biệt.
- Dữ liệu không đồng bộ giữa các volume trên các node.
Giải pháp:
- Dùng Volume Plugin hỗ trợ block storage phân tán:
- Ví dụ: REX-Ray, Portworx, NFS plugin,…
- Hỗ trợ các cloud & storage như:
- AWS (EBS, EFS, S3)
- Google Cloud
- DigitalOcean
- Ceph, EMC, OpenStack,…
2. Quản lý Plugin Volume
- Cài đặt:
docker plugin install <plugin_name>
- Xem plugin:
docker plugin ls
- Disable plugin:
docker plugin disable <plugin_id>
- Xoá plugin:
docker plugin rm <plugin_id>
Ví dụ cài rexray/dobs (DigitalOcean Block Storage):
docker plugin install rexray/dobs \
DOBS_REGION=<region> \
DIGITALOCEAN_TOKEN=<token> \
CONVERTUNDERSCORES=true
Ví dụ AWS EBS:
docker plugin install rexray/ebs \
AWS_ACCESSKEY=<access_key> \
AWS_SECRETKEY=<secret_key> \
AWS_REGION=<region>
3. Tạo Volume local
docker volume create -d local portainer_data
d local: Dùng driver local.
Volume này chỉ tồn tại trên node tạo.
4. Deploy Portainer service trên Swarm gắn Volume
docker service create \
--name portainer \
-p 8000:9000 \
--constraint 'node.role==manager' \
--mount type=volume,source=portainer_data,target=/data \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
portainer/portainer \
-H unix:///var/run/docker.sock
- -constraint ‘node.role==manager’: ép service chỉ chạy trên manager.
- volume mount: gắn volume đã tạo vào
/data. - bind mount: gắn docker.sock để Portainer có thể quản lý Docker.
5. Mở Portainer
- Truy cập:
http://<public-ip>:8000 - Thiết lập tài khoản và quản lý swarm trên giao diện.
6. Tổng kết
| Thao tác | Câu lệnh |
|---|---|
| Cài plugin | docker plugin install |
| Tạo volume | docker volume create -d local <name> |
| Deploy service gắn volume | docker service create --mount |
| Ràng buộc service chạy trên manager | --constraint 'node.role==manager' |
| Quản lý plugin | docker plugin ls / disable / rm |