Cách lưu trữ dữ liệu Docker Container trong Docker Volumes

theanh

Administrator
Nhân viên
Một tùy chọn để tự động hóa một container với dữ liệu là lưu trữ dữ liệu trong ảnh container. Tuy nhiên, điều này yêu cầu phải có một bản sao của dữ liệu trong mỗi container bạn chạy, điều này có thể dẫn đến lãng phí tài nguyên nếu các container được mở rộng. Một tùy chọn tốt hơn là lưu trữ một bản sao của dữ liệu trong một ổ đĩa Docker rồi chia sẻ ổ đĩa đó giữa các container.

Bạn có thể coi ổ đĩa Docker là một thư mục nằm ngoài hệ thống tệp container nhưng vẫn có thể truy cập được bởi các container đang chạy trên cùng một máy chủ. Khi bạn tạo một container mới, bạn có thể gắn một ổ đĩa hiện có hoặc tạo một ổ đĩa mới. Nếu bạn tạo một ổ đĩa mới, Docker sẽ tự động tạo một lớp lưu trữ mới trên hệ thống tệp máy chủ cơ bản và khởi tạo nó bằng dữ liệu bạn chỉ định.

Sau khi tạo một ổ đĩa, bạn có thể sử dụng nó để lưu trữ bất kỳ loại dữ liệu nào, bao gồm các tệp tĩnh, dữ liệu ứng dụng hoặc nhật ký. Bạn cũng có thể sử dụng volume để chia sẻ dữ liệu giữa các container.

Ví dụ: nếu bạn có một ứng dụng web chạy trong một container, bạn có thể sử dụng volume để lưu trữ mã nguồn của ứng dụng để các container khác trong triển khai của bạn có thể truy cập vào đó. Điều này cho phép bạn giữ mã nguồn của ứng dụng tách biệt với môi trường thời gian chạy, giúp bạn dễ dàng cập nhật và triển khai lại ứng dụng.

Ngoài việc chia sẻ dữ liệu giữa các container, bạn cũng có thể sử dụng volume để lưu trữ dữ liệu khi bạn dừng và khởi động container. Đây là một cách tuyệt vời để giữ an toàn cho dữ liệu của bạn ngay cả khi container của bạn vô tình bị xóa hoặc dừng.

Trong hướng dẫn này, bạn sẽ tìm hiểu cách các volume Docker tương tác với các container. Bạn sẽ thực hiện điều này bằng cách tạo các container mới và sử dụng các volume để lưu trữ và chia sẻ dữ liệu giữa chúng. Sau đó, bạn sẽ khám phá cách giải phóng không gian còn lại của các volume ẩn danh được các container tự động tạo ra. Cuối cùng, bạn sẽ học cách sao lưu dữ liệu Docker volumes của mình.

Bắt đầu thôi!

Điều kiện tiên quyết​

  • Để làm theo hướng dẫn này, bạn phải nắm rõ những điều cơ bản khi làm việc với các vùng chứa Docker.
  • Hướng dẫn này giả định rằng bạn đang sử dụng máy chủ Linux. Hướng dẫn này sử dụng CentOS, nhưng các bước tương tự cũng có thể áp dụng trên bất kỳ bản phân phối Linux nào khác.
  • Bạn phải cài đặt và chạy Docker trên máy chủ của mình. Nếu bạn chưa cài đặt, hãy làm theo hướng dẫn trong Hướng dẫn cài đặt của chúng tôi.
  • Tài khoản người dùng có quyền root
  • Bạn đã cài đặt Docker trên máy chủ Linux.

Khám phá các ổ đĩa Docker ẩn danh​

Khi bạn tạo một vùng chứa Docker mới, theo mặc định, một ổ đĩa ẩn danh mới sẽ được tạo trên hệ thống tệp máy chủ. Ổ đĩa này được sử dụng để lưu trữ dữ liệu mà vùng chứa yêu cầu.

1. Chạy lệnh sau để kiểm tra xem docker có đang chạy và hoạt động không.
Mã:
sudo systemctl status docker


2. Chạy lệnh sau để thêm tài khoản người dùng của bạn vào nhóm docker để bạn có thể chạy các lệnh docker mà không cần sử dụng sudo. Sau khi bạn đã thêm tài khoản người dùng của mình vào nhóm docker, hãy đăng xuất và đăng nhập lại để các thay đổi của bạn có hiệu lực.
Mã:
sudo usermod -aG docker $(whoami)
3. Chạy lệnh sauđể kéo một số hình ảnh từ sổ đăng ký Docker vào máy chủ của bạn. Bạn sẽ sử dụng những hình ảnh này để thực hành tạo và làm việc với các ổ đĩa Docker.
Mã:
docker pull postgres:12.1
Mã:
docker pull bash
Mã:
docker pullhttpd:2.4
4. Chạy lệnh sauđể liệt kê các hình ảnh hiện có trên máy chủ của bạn để xác minh rằng các hình ảnh đã được kéo.
Mã:
docker images


5. Chạy lệnh sauđể xem có bất kỳ ổ đĩa nào đang hoạt động trên máy chủ của bạn không. Bạn sẽ thấy một đầu ra tương tự như sau.
Mã:
docker volume ls
Bạn sẽ thấy một đầu ra trống.



6. Chạy lệnh sau để tạo một container mới và xác minh rằng một volume ẩn danh mới đã được tạo trên máy chủ. Bạn sử dụng cờ -d để chạy container ở chế độ tách biệt để bạn có thể tiếp tục làm việc trong thiết bị đầu cuối. Bạn sử dụng cờ --name để đặt tên cho container để bạn có thể dễ dàng xác định nó. Bạn sử dụng hình ảnh postgres:12.1 tại đây vì Postgres cần các volume nền để lưu trữ dữ liệu của nó. Bạn nên chạy hai container, một cho mỗi cơ sở dữ liệu Postgres của bạn để có biện pháp tốt và để xem thêm thông tin.
Mã:
docker run -d --name db1 postgres:12.1
Mã:
docker run -d --name db2 postgres:12.1


7. Chạy lệnh docker bên dưới để liệt kê các container hiện đang chạy trên máy chủ của bạn.
Mã:
docker ps
Bây giờ bạn có hai container:db1db2, như hiển thị bên dưới.



8. Bây giờ, hãy liệt kê các ổ đĩa đã được tạo trên máy chủ.
Mã:
docker volume ls
Bạn sẽ thấy đầu ra tương tự như sau. Khi Postgres khởi động, nó cần một nơi để lưu trữ dữ liệu của mình. Postgres không muốn mất dữ liệu của mình, vì vậy Postgres tự động tạo các ổ đĩa ẩn danh. Các ổ đĩa được đặt tên bằng một chuỗi ký tự Hex ngẫu nhiên được thêm vào (e9f338...ee3423...).



Chúng ta hãy xem xét kỹ hơn các ổ đĩa bằng cách sử dụng lệnh docker inspect.

9. Chạy lệnh bên dưới để biết thêm thông tin về vùng chứa db1 ở định dạng mà con người có thể đọc được.
Mã:
docker inspect db1 -f '{{ json .Mounts }}' | python -m json.tool
Như bạn có thể thấy bên dưới, dòng e9f338 Name khớp với đầu ra của lệnh docker volume ls ở trên. Dòng này cho bạn biết rằng ổ đĩa này được liên kết và gắn kết với vùng chứa db1.





10. Thực hiện tương tự để kiểm tra container db2.
Mã:
docker inspect db2 -f '{{ json .Mounts}}' | python -m json.tool
Bạn sẽ thấy đầu ra giống hệt với container db1, ngoại trừ tên ổ đĩa sẽ khác. Đầu ra này xác nhận rằng Docker tạo một ổ đĩa ẩn danh mới cho mỗi container được tạo.



11. Chạy thêm một container nữa. Nhưng lần này, chúng ta sẽ sử dụng cờ --rm và xem điều gì xảy ra với các ổ đĩa. Chúng ta đặt tên cho container này là dbTmp. Hãy cùng tìm hiểu!
Mã:
docker run -d --rm --name dbTmp postgres:12.1


Bây giờ chúng ta có ba container: db1, db2,dbTmp đang chạy
Mã:
docker ps


12. Liệt kê lại các ổ đĩa.
Mã:
docker volume ls
Bạn sẽ thấy rằng một ổ đĩa thứ ba đã được tạo cho dbTmpcontainer.



13. Bây giờ, hãy dừng db2 cùng với container dbTmp bằng lệnh bên dưới.

docker stop db2 dbTmp



13. Liệt kê lại các container và các ổ đĩa.

docker ps
Mã:
docker volume ls
Như được hiển thị bên dưới, container duy nhất còn chạy là container db1 . Tuy nhiên, volume cho container dbTemp hiện đã biến mất nhưng volume cho container db2 (ee3423...) vẫn còn đó.

Hành vi này là bình thường. Cờ --rm xóa container sau khi nó dừng, cùng với bất kỳ ổ đĩa nào được liên kết. Ổ đĩa cho container dbTmp đã biến mất vì chúng ta đã dừng container dbTemp.Vì chúng ta không chỉ định cờ --rm khi tạo container db2, nên container db2 và ổ đĩa được liên kết của nó vẫn nằm trên máy chủ ngay cả khi chúng ta dừng container. Bài học rút ra từ ví dụ này là bạn cần phải cẩn thận với cờ --rm. Nếu bạn dừng một container có một ổ đĩa được liên kết, ổ đĩa đó sẽ bị xóa.

Tạo một ổ đĩa Docker​

Ổ đĩa Docker là một container lưu trữ được đặt tên mà bạn tạo bằng lệnh docker volume create. Sau đó, bạn sẽ sử dụng ổ đĩa để lưu trữ dữ liệu hoặc chia sẻ dữ liệu giữa các container.

1. Chạy lệnh sau để tạo một ổ đĩa mới có tên là website.
Mã:
docker volume create website


2. Liệt kê các ổ đĩa, bạn có thể thấy ổ đĩa mới mà bạn vừa tạo.
Mã:
docker volume ls


3.Tải xuống mã trang web này từ GitHubvào thư mục làm việc hiện tại của bạn.

4. Chạy lệnh bên dưới để sao chép mã trang web mà bạn vừa tải xuống vào website volume.
Mã:
sudo cp -r /home/cloud_user/widget-factory-inc/web/* /var/lib/docker/volumes/website/_data/
5. Chạy lệnh bên dưới để liệt kê các tệp trong ổ đĩa trang web.
Mã:
sudo ls -l /var/lib/docker/volumes/website/_data/
Bạn có thể thấy rằng mã trang web hiện được lưu trữ trong ổ đĩa trang web.



6. Bây giờ bạn có thể khởi động một vùng chứa mới và đính kèm ổ đĩa trang web vào đó. Bạn sử dụng cờ -v (ổ đĩa) để gắn ổ đĩa. Bạn sử dụng cờ -p (ánh xạ cổng) để ánh xạ một cổng trên máy chủ sang một cổng trong vùng chứa. Trong ví dụ này, chúng tôi đang ánh xạ cổng 80 trên máy chủ tới cổng 80 trong container. Web1 là tên của container.
Mã:
docker run -d --name web1 -p 80:80 -v website:/usr/local/apache2/htdocs:ro httpd:2.4


7. Bây giờ trang web sẽ được phục vụ từ container web1. Chạy lệnh docker ps để kiểm tra trạng thái của container web1. Bạn có thể thấy rằng trang web đang được phục vụ từ container web1. Bạn cũng có thể thấy cổng mà trang web đang được phục vụ trên (80) như hiển thị bên dưới.



8. Bạn có thể mở địa chỉ IP của máy chủ trên trình duyệt web của mình để xem trang web bạn vừa sao chép.



9. Bây giờ hãy chạy thêm một container có tên là webTmp lần này với cờ --rm để xem điều gì xảy ra với khối lượng trang web khi bạn dừng container webTmp .
Mã:
docker run -d --name webTmp --rm -v website:/usr/local/apache2/htdocs:ro httpd:2.4


10. Chạy lệnh docker ps show để xác minh rằng container webTmp đang chạy.


Mã:
docker ps


11. Bây giờ hãy dừng container webTmp và liệt kê các ổ đĩa.
Mã:
docker stop webTmp
docker volume ls

Như bạn đã nhớ ở phần đầu của bài viết này, khi bạn dừng một container, các ổ đĩa được liên kết cũng bị xóa. Nhưng lần này, như được hiển thị bên dưới, bạn có thể thấy volume của trang web vẫn ở đó. Vậy điều gì đã xảy ra?



Điểm chính trong ví dụ này là khi bạn dừng một vùng chứa, dữ liệu trong các vùng chứa được liên kết với vùng chứa đó sẽ không bị xóa miễn là các vùng chứa đó đang được vùng chứa khác sử dụng. Trong trường hợp này, vùng chứa web1 vẫn đang sử dụng vùng chứa trang web. Đây là một điểm rất quan trọng cần nhớ khi làm việc với các vùng chứa Docker.

Xóa các vùng chứa không sử dụng​

Mặc dù các vùng chứa là một cách tuyệt vời để lưu trữ dữ liệu và sắp xếp dữ liệu, nhưng chúng cũng có thể chiếm nhiều dung lượng đĩa nếu không được sử dụng. Nếu bạn không sử dụng một vùng chứa nào đó, tốt nhất là xóa vùng chứa đó khỏi hệ thống để giải phóng dung lượng đĩa. May mắn thay, Docker cung cấp tất cả các công cụ bạn cần để xóa các vùng chứa không sử dụng khỏi hệ thống của mình.

1. Chạy lệnh docker volume prune để xóa các tài nguyên dangling (hình ảnh, mạng, volume và container). Một tài nguyên dangling là một đối tượng Docker hiện không được liên kết với container.Nhưng trước khi xóa một volume, hãy đảm bảo rằng không có container nào đang sử dụng nó. Ví dụ: bạn phải xóa container db2 trước khi có thể xóa các volume chưa sử dụng được liên kết với nó.
Mã:
docker stop db2
Mã:
docker rm db2
Mã:
docker volume prune


2. Liệt kê các volume và bạn có thể thấy rằng volume db2 hiện đã biến mất.
Mã:
docker volume ls


3. Chạy lệnh bên dưới để tìm vị trí dữ liệu ổ đĩa cho trang web của bạn để bạn có thể sao lưu.
Mã:
docker volume inspect website
Bạn sẽ thấy Điểm gắn kết cho trang web của mình. Điểm gắn kết là thư mục trên hệ điều hành máy chủ lưu trữ nơi ổ đĩa docker được gắn kết. Trong ví dụ này, điểm gắn kết là /var/lib/docker/volumes/website/_data, như được hiển thị bên dưới.



4. Bạn có thể sử dụng lệnh tar để sao lưu nội dung của ổ đĩa trang web của mình. Lệnh này đã có từ lâu và được hỗ trợ trên hầu hết các nền tảng. Lệnh tar có thể được sử dụng để sao lưu một thư mục, bao gồm tất cả các thư mục con và tệp của nó.

Lưu ý: bạn PHẢI chạy lệnh này với tư cách là người dùng root, nếu không, bạn sẽ không có quyền ghi vào ổ đĩa docker đã gắn kết, như được hiển thị bên dưới.


Mã:
tar czf /tmp/website_$(date +%Y-%m-%d-%H%M).tgz -C /var/lib/docker/volumes/website/_data .


5. Chạy lệnh bên dưới để xác minh rằng tệp sao lưu tar đã được tạo thành công.
Mã:
ls -l /tmp/website_*.tgz


6. Chạy lệnh bên dưới để xác minh rằng tệp sao lưu chứa dữ liệu chính xác. Thay thế YOUR_BACKUP_FILE_NAME bằng tên thực của tệp sao lưu của bạn.
Mã:
tar tf /tmp/.tgz


7. Bây giờ hãy chạy thêm một container nữa bằng cách sử dụng ổ đĩa trang web. Lần này, bạn sẽ sử dụng cờ -it để tương tác với container nhằm kiểm tra bản sao lưu.
Mã:
docker run -it --rm -v website:/website -v /tmp:/backup bash tar czf /backup/website_$(date +%Y-%m-%d-%H-%M).tgz -C /website .


8. Di chuyển vào thư mục ổ đĩa và xóa tất cả dữ liệu trang web.



9. Liệt kê nội dung của thư mục để xem dữ liệu trang web đã mất chưa.
Mã:
ls -l


10. Chạy lệnh bên dưới để khôi phục dữ liệu trang web. Thay thế <YOUR_BACKUP_FILE_NAME> bằng tên thực của tệp sao lưu của bạn.
Mã:
tar xf .tgz .
11. Liệt kê nội dung của thư mục để xác minh rằng dữ liệu trang web đã được khôi phục.
Mã:
ls -l

Kết luận​

Trong hướng dẫn này, bạn đã học cách tạo, sao lưu ổ đĩa docker và khôi phục dữ liệu. Bạn cũng đã học cách tìm điểm gắn kết cho ổ đĩa docker của mình.

Docker gần đây đã trở nên rất phổ biến vì nó giúp triển khai ứng dụng dễ dàng. Tuy nhiên, với sức mạnh lớn đi kèm với trách nhiệm lớn. Điều quan trọng là phải sao lưu ổ đĩa docker của bạn để ngăn ngừa mất dữ liệu trong trường hợp xảy ra thảm họa.

Có rất nhiều điều để tìm hiểu về Docker. Nếu bạn muốn tìm hiểu sâu hơn về Docker, chúng tôi khuyên bạn nên xem tài liệu của Docker, tại đó bạn sẽ tìm thấy mọi thông tin cần thiết để bắt đầu và chạy Docker.
 
Back
Bên trên