[Docker] Docker volume

Như chúng ta đều biết, đặc điểm của Docker container là chúng chạy độc lập, và không ảnh hưởng đến nhau, thế nhưng vì một lí do nào đó, chúng ta lại muốn chia sẻ data giữa các container ví dụ, bạn có một 2,3 web server nginx và mong muốn khi chúng share chung các file config, hay html tĩnh. May mắn docker cung cấp volume để thực hiện việc đó

Docker volume là một volume được tạo ra cho phép các container mount volume vào trong các container hay dễ hiểu hơn là docker sử dụng Volume đó thay thế cho 1 folder của container

Sử dụng volume có 3 tác dụng chính:

  • Để giữ lại dữ liệu khi một container bị xóa.
  • Để chia sẻ dữ liệu giữa các hệ thống tập tin máy chủ và container Docker.
  • Để chia sẻ dữ liệu với các container Docker khác.

VOLUME trong Dockerfile

Trở lại ví dụ trong phần Docker instructions

1
2
3
4
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol

Kết quả như trang này có giải thích nó sẽ tạo ra một volume mới và copy file greeting vào volume được tạo. Nhưng khi tôi build và run docker này lại không có volume myvol nào được tạo ra?

Thực tế không phải volume myvol không được tạo ra mà nó đã được băm dưới dạng id

1
2
3
4
5
docker volume ls
DRIVER VOLUME NAME
local 09ac41f23520dfeaec2d2dcc571168a1a8ff185f633cbaa355915703b3fa6b4f
local 0a7f05233da3de18ae8d67f80b3d6bcda4f374bffd7c2d44b0b0914db976f835
local 16f5fec934cc322c7b065ea89b6bc122c3fabafcad76ff69bc53ab3849ababc5

Công việc của bạn là cần tìm VOLUME NAME đó là cái nào :v (sắp xếp theo ngày tạo ấy sẽ thấy nhé)

Sử dụng VOLUME trong Dockerfile như vậy, các volume sẽ được tạo trong thư mục: /var/lib/docker/volumes/ và được docker quản lý, bạn không thể ánh xạ nó sang thư mục khác của máy thật được.

Đặt tên VOLUME

Nếu cách để docker tự sinh volume name khiến bạn không khó tìm, bạn hoàn toàn có thể đặt tên VOLUME trong file docker-compose.yml

1
2
3
4
5
6
7
8
9
10
version: '3'

services:
...
mysql:
volumes:
- db-data:/var/lib/mysql
...
volumes:
db-data:

Khi đó bạn sẽ dễ dàng thấy VOLUME khi dùng lệnh
1
2
3
4
5
6
docker volume ls
DRIVER VOLUME NAME
local 09ac41f23520dfeaec2d2dcc571168a1a8ff185f633cbaa355915703b3fa6b4f
local 0a7f05233da3de18ae8d67f80b3d6bcda4f374bffd7c2d44b0b0914db976f835
local 16f5fec934cc322c7b065ea89b6bc122c3fabafcad76ff69bc53ab3849ababc5
local laravel_db-data

Việc xoá volume đi cũng dễ dàng, đỡ nhầm lẫn :D
1
docker volume rm laravel_db-data

Tùy chọn volume khi run docker

Sử dụng lệnh thêm tham số volume khi chạy docker cho phép bạn ánh xạ được vùng mount bởi volume từ docker container ra host của chúng ta thông qua 2 tham số source và destination

1
docker run -d --name nginx1 --mount source=nginx-static-html-share-volume,destination=/usr/share/nginx/html -p 2222:80 nginx

Tổng kết

  • Sử dụng VOLUME trong Dockerfile, volume sẽ được Docker quản lý, không thể ánh xạ vị trí khác được
  • Ngược lại sử dụng volume, mount trong khi chạy docker, hoặc trong docker-compose cho phép bạn ánh xạ các file, thư mục đến file, thư mục trên máy thật mà bạn muốn

Tài liệu đọc thêm:

Author

Ming

Posted on

2020-04-12

Updated on

2021-12-31

Licensed under

Comments