- Ba phương pháp để gắn kết dữ liệu từ máy chủ vào container trong Docker
Docker cung cấp ba cách để gắn dữ liệu từ hệ thống tệp của máy chủ vào container:
- volumes: Docker quản lý một phần của hệ thống tệp (đường dẫn /var/lib/docker/volumes). Đây là cách tốt nhất để lưu trữ dữ liệu.
- bind mounts: Gắn bất kỳ thư mục hoặc tệp nào trên máy chủ vào container.
- tmpfs: Gắn dữ liệu vào bộ nhớ của hệ thống, không ghi vào hệ thống tệp. Cách này hữu ích nếu bạn không muốn lưu trữ dữ liệu lâu dài và cải thiện hiệu năng bằng cách tránh ghi vào lớp khả thi của container.
- Quản lý volumes trong Docker
- Tạo và quản lý volumes
[root@test-1 ~]# docker volume create app_data
app_data
[root@test-1 ~]# docker volume ls
DRIVER VOLUME NAME
local app_data
[root@test-1 ~]# docker volume inspect app_data # Hiển thị thông tin chi tiết về app_data
[
{
"CreatedAt": "2018-11-22T01:10:06-05:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/app_data/_data", # Điểm gắn kết
"Name": "app_data",
"Options": {},
"Scope": "local"
}
]
- Khởi tạo container với volume
(1) Sử dụng lệnh --mount
[root@test-1 html]# docker run -d --name web02 --mount src=app_data,dst=/usr/share/nginx/html nginx
79afc418f70031478f098f8390ba1475563b1d9c52fa084e383f0113ce683d4d
[root@test-1 html]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e380bf77ea4 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp web02
[root@test-1 html]# ll /var/lib/docker/volumes/app_data/_data/
total 8
-rw-r--r-- 1 root root 494 Nov 6 08:32 50x.html
-rw-r--r-- 1 root root 612 Nov 6 08:32 index.html
(2) Sử dụng -v
[root@test-1 html]# docker run -d --name=web03 -v app_data:/usr/share/nginx/html nginx
3a086829032e967657867298640d83a1212a4642f07245f0fab882315afd4e64
[root@test-1 html]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a086829032e nginx "nginx -g 'daemon of…" 3 minutes ago Up 3 minutes 80/tcp web03
2f6d6db0c6a4 nginx "nginx -g 'daemon of…" 11 minutes ago Exited (0) 9 minutes ago web02
(3) Xóa
[root@test-1 html]# docker stop web02
web02
[root@test-1 html]# docker rm web02
web02
[root@test-1 html]# docker stop web03
web03
[root@test-1 html]# docker rm web03
web03
[root@test-1 html]# docker volume rm app_data
app_data
(4) Lưu ý
- Nếu không chỉ định volume, nó sẽ được tạo tự động.
- Nên sử dụng --mount vì nó linh hoạt hơn.
- Quản lý file bằng bind mounts
- Gắn kết file từ máy chủ vào container
[root@test-1 html]# docker run -d -p80:80 --name=web01 --mount type=bind,src=/var/www/html,dst=/usr/share/nginx/html nginx
[root@test-1 html]# docker run -d -p81:80 --name=web02 -v /var/www/html:/usr/share/nginx/html nginx
Lưu ý:
--mount và -v có tác dụng tương tự nhau
- Kiểm tra
[root@test-1 html]# docker inspect web01
- Xóa
[root@test-1 html]# docker stop web01
web01
[root@test-1 html]# docker stop web02
web02
[root@test-1 html]# docker rm web01
web01
[root@test-1 html]# docker rm web02
web02
-
Lưu ý (1) Nếu nguồn tệp hoặc thư mục không tồn tại, sẽ phát sinh lỗi. (2) Nếu thư mục đích trong container không trống, nội dung hiện tại sẽ bị che khuất.
-
Kết quả chạy
- Tổng kết
-
Đặc điểm của volumes • Chia sẻ dữ liệu giữa nhiều container đang chạy • Volume vẫn tồn tại khi container dừng hoặc xóa • Nhiều container có thể gắn cùng một volume • Volume chỉ bị xóa khi bạn xóa nó rõ ràng • Lưu trữ dữ liệu trên máy chủ khác hoặc thiết bị lưu trữ • Khi di chuyển dữ liệu từ máy Docker này sang máy khác, hãy dừng container trước, sau đó sao lưu thư mục volume (đường dẫn /var/lib/docker/volumes/).
-
Đặc điểm của bind mounts • Chia sẻ cấu hình từ máy chủ vào container. Mặc định, máy chủ gắn kết /etc/resolv.conf vào mỗi container để cung cấp giải mã DNS. • Chia sẻ mã nguồn giữa môi trường phát triển trên máy chủ và container. Ví dụ, bạn có thể gắn mục /target của Maven vào container, mỗi lần xây dựng dự án Maven trên máy chủ, container đều có thể truy cập gói đã xây dựng. • Yêu cầu cấu trúc tệp và thư mục trên máy chủ phải khớp với yêu cầu của liên kết gắn kết.