Hướng dẫn làm việc với Docker Data Volumes trên Ubuntu 14.04

4 năm trước

Giới thiệu

Trong bài viết này chúng tôi sẽ giới thiệu khái niệm về Docker data volumes: chúng là gì, tại sao lại hữu ích, các loại volume khác nhau, cách sử dụng và khi nào sử dụng . Chúng tôi cũng đi qua một số ví dụ về cách sử dụng Docker volumes thông qua công cụ dòng lệnh docker.

Sau bài viết này, bạn sẽ cảm thấy thoải mái khi tạo và sử dụng bất kỳ loại Docker data volume nào.

 

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

Để làm theo hướng dẫn, bạn cần:

  • VPS Ubuntu 14.04( xem hướng dẫn tại đây)
  • với user non-root yêu cầu có quyền sudo 
  • cài đặt Docker 

Lưu ý: Mức dù các điều kiện tiên quyết chỉ ra cách cài đặt Docker trên Ubuntu 14.04, các lệnh docker  cho Docker data volumes trong bài viết này sẽ hoạt động trên hệ điều hành khác miễn là Docker được cài đặt.

 

Giải thích Docker Containers

Làm việc với Docker yêu cầu hiểu khá nhiều khái niệm Docker cụ thể, và hầu hết tài liệu tập trung vào việc giải thích cách sử dụng bộ công cụ của Docker mà không giải thích lý do tại sao muốn sử dụng bất kỳ công cụ nào. Điều này có thể gây nhầm lẫn nếu mới sử dụng Docker, vì vậy chúng tôi sẽ bắt đầu bằng một số khái niệm cơ bản và sau đó chuyển sang làm việc với các Docker container. Vui lòng bỏ qua phần tiếp theo nếu đã làm việc với Docker trước đây và chỉ muốn biết cách bắt đầu với data volumes.

Docker container tương tự như một máy ảo. Về cơ bản nó cho phép bạn chạy một "hộp Linux" đóng gói sẵn bên trong một container. Sự khác biệt chính giữa Docker container và máy ảo điển hình là Docker không hoàn toàn tách biệt với môi trường xung quanh như máy ảo bình thường. Docker container chia sẻ hạt nhân Linux với hệ điều hành chủ, có nghĩa là nó không cần phải "khởi động" theo cách mà máy ảo sẽ làm.

Vì phần lớn được chia sẻ, việc kích hoạt Docker container là một hoạt động nhanh và rẻ - trong hầu hết các trường hợp, bạn có thể tạo một Docker container đầy đủ (tương đương với một máy ảo bình thường) trong cùng một thời gian bằng việc chạy chương trình dòng lệnh thông thường. Điều này tuyệt vời vì nó làm cho việc triển khai các hệ thống phức tạp trở nên dễ dàng hơn và nhiều mô-đun hơn, nhưng đó là một mô hình khác với cách tiếp cận máy ảo thông thường và có một số tác dụng phụ không mong muốn đối với những người đến từ thế giới ảo hóa.

 

Tìm hiểu các loại Docker Data Volumes

Có ba trường hợp sử dụng chính với Docker data volumes:

  1. Để giữ dữ liệu xung quanh khi container bị xóa
  2. Để chia sẻ dữ liệu giữa hệ thống tệp lưu trữ và Docker container
  3. Để chia sẻ dữ liệu với các Docker containers khác

Trường hợp thứ ba là cao cấp hơn một chút, vì vậy sẽ không đi sâu vào nó trong hướng dẫn này, nhưng hai trường hợp đầu tiên là khá phổ biến.

Trong trường hợp đầu tiên (và đơn giản nhất),bạn chỉ muốn dữ liệu được treo xung quanh ngay cả khi bạn loại bỏ container, vì vậy thường dễ nhất để Docker quản lý nơi dữ liệu được lưu trữ.

 

Giữ dữ liệu liên tục

Không có cách nào để trực tiếp tạo ra "data volume" trong Docker, thay vào đó hãy tạo ra một data volume container kèm theo một volume gắn liền. Đối với các vùng chứa khác muốn kết nối với data volume container này, hãy sử dụng tùy chọn --volumes-from của Docker để lấy volume từ container này và áp dụng chúng cho container hiện tại. Có một chút bất thường ở lần đầu tiên, vì vậy hãy xem qua một ví dụ nhanh về cách chúng ta có thể sử dụng cách tiếp cận này để làm cho tệp byebye gắn ở xung quanh ngay cả khi container bị loại bỏ.

Trước tiên, hãy tạo một data volume container mới để lưu trữ volume:

docker create -v /tmp --name datacontainer ubuntu 

Điều này tạo ra một container có tên datacontainer dựa trên hình ảnh ubuntu và trong thư mục /tmp.

Bây giờ, nếu chạy Ubuntu container mới với cờ --volumes-from và chạy bash một lần nữa như đã làm trước đó, bất cứ điều gì ghi vào thư mục /tmp sẽ được lưu vào volume /tmp của container  datacontainer  .

Trước tiên, bắt đầu hình ảnh ubuntu:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash 

Các tùy chọn dòng lệnh -t gọi một thiết bị đầu cuối từ bên trong container. Cờ -i làm cho kết nối tương tác.

Tại dấu nhắc bash cho ubuntu container, hãy tạo một tệp trong/tmp:

echo "I'm not going anywhere" > /tmp/hi 

Tiếp tục và gõ exit để trở về shell máy chủ của bạn. Bây giờ, chạy lại lệnh tương tự:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash 

Lần này tập tin hi đã có sẵn:

cat /tmp/hi 

Bạn nên thấy:

Output of cat /tmp/hi
I'm not going anywhere 

Bạn có thể thêm bao nhiêu cờ --volumes-from bạn muốn (ví dụ, nếu muốn lắp ráp một container có sử dụng data từ nhiều data containers). 

Chỉ báo trước cho phương pháp này là bạn chỉ có thể chọn đường dẫn gắn kết bên trong container (/tmp trong ví dụ của chúng tôi) khi tạo data volume container.

 

Chia sẻ data giữa máy chủ và Docker Container

Cách sử dụng phổ biến khác cho các Docker container là phương tiện chia sẻ tệp giữa máy chủ và Docker container. Điều này hoạt động khác với ví dụ cuối cùng. Không cần phải tạo "data-only" container trước. Bạn có thể chỉ cần chạy một container bất kỳ hình ảnh Docker nào và ghi đè lên một trong các thư mục của nó với nội dung của một thư mục trên hệ thống máy chủ.

Như ví dụ thế giới thực nhanh chóng, giả sử bạn muốn sử dụng hình ảnh Docker nginx chính thức nhưng muốn giữ một bản sao vĩnh viễn các tệp nhật ký của Nginx để phân tích sau này. Theo mặc định, hình ảnh nginx Docker đăng nhập vào thư mục /var/log/nginx, nhưng đây là /var/log/nginx bên trong Docker Nginx container. Thông thường nó không thể truy cập từ hệ thống tập tin lưu trữ.

Hãy tạo một thư mục lưu trữ các bản ghi và sau đó chạy một bản sao của ảnh Nginx với một voume được chia sẻ để Nginx ghi các bản ghi của nó vào hệ thống tệp của máy chủ thay vì vào   /var/log/nginx bên trong container:

mkdir ~/nginxlogs 

Sau đó khởi động container:

docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx 

Lệnh run này hơi khác so với lệnh đã sử dụng từ trước đến giờ, vì vậy hãy chia nhỏ từng phần một:

  • -v ~/nginxlogs:/var/log/nginx — Thiết lập một volume liên kết thư mục /var/log/nginx từ bên trong Nginx container tới thư mục ~/nginxlogs  trên máy chủ. Docker sử dụng : để chia đường dẫn của máy chủ khỏi đường dẫn container và đường dẫn máy chủ luôn đi trước. 

  • -d — Gỡ bỏ quá trình và chạy trong nền. Nếu không, sẽ chỉ xem dấu nhắc Nginx trống và không thể sử dụng thiết bị đầu cuối này cho đến khi loại bỏ Nginx.

  • -p 5000:80 — Thiết lập cổng chuyển tiếp. Nginx container đang nghe trên cổng 80 theo mặc định và điều này ánh xạ cổng 80 của Nginx container đến cổng 5000 trên hệ thống máy chủ.

Nếu chú ý kỹ, bạn cũng có thể nhận thấy sự khác biệt  so với các lệnh run trước đó. Cho đến bây giờ đã chỉ định một lệnh ở cuối tất cả các lệnh run (thường là /bin/bash) để báo cho Docker biết lệnh nào chạy bên trong container. Bởi vì hình ảnh Nginx là hình ảnh Docker chính thức, theo các thực hành tốt nhất Docker, và tác giả của hình ảnh thiết lập hình ảnh để chạy lệnh bắt đầu Nginx một cách tự động ảo. Chúng ta chỉ có thể thả bình thường/bin/bash  ở đây và để cho tác giả của bức ảnh chọn lệnh chạy trong container cho chúng ta.

Vì vậy, bây giờ chúng ta có một bản sao của Nginx chạy bên trong một Docker container trên máy của mình, và cổng 5000 của máy chủ trực tiếp tới bản sao của cổng Nginx 80. Hãy sử dụng curl để thực hiện một yêu cầu kiểm tra nhanh:

curl localhost:5000 

Bạn nhận được màn hình HTML trở lại từ Nginx cho thấy Nginx đang hoạt động. Nhưng thú vị hơn, nếu nhìn vào thư mục ~/nginxlogs trên máy chủ và xem tập tin access.log bạn sẽ thấy một thông điệp tường trình từ Nginx hiển thị yêu cầu:

cat ~/nginxlogs/access.log 

Bạn sẽ thấy một cái gì đó tương tự như:

Output of `cat ~/nginxlogs/access.log`
172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-" 

Nếu thực hiện bất kỳ thay đổi nào đối với thư mục ~/nginxlogs, bạn sẽ có thể xem chúng từ bên trong Docker container trong thời gian thực.

 

Kết luận

Bây giờ chúng tôi đã giới thiệu cách tạo data volume containers mà volumes có thể sử dụng như một cách để lưu trữ dữ liệu trong các containers khác cũng như cách chia sẻ các thư mục giữa hệ thống tệp lưu trữ và Docker container. Điều này bao gồm tất cả trừ các trường hợp sử dụng nâng cao nhất khi nói đến Docker data volumes.

Nếu bạn đang sử dụng Docker Compose, Docker có thể được định dạng trong tập tin docker-compose.yml