Làm việc với Docker Data Volumes

Giới thiệu

Trong bài viết này chúng ta sẽ nói về các khái niệm của Docker data volumes. Chúng ta cũng sẽ có một số ví dụ về cách sử dụng Docker data volumes qua các dòng lệnh Docker.

Và khi kết thúc bài viết này, bạn có thể thoải mái sử dụng Docker data volumes.

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

Để thực hiện theo hướng dẫn này, bạn sẽ cần những điều sau đây:

  • Ubuntu 14.04 Droplet
  • Một người sử dụng không phải root với quyền sudo (Initial Server Setup với Ubuntu 14.04 giải thích làm thế nào để thiết lập này lên.)
  • Docker

Giải thích về Docker Container

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

Một container Docker 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" được đóng gói trước đó bên trong một container. Sự khác biệt chính giữa một container Docker và một máy ảo điển hình là Docker không cô lập với môi trường xung quanh như một máy ảo bình thường. Một Docker container chia sẻ các Linux kernel với các hệ điều hành máy chủ, có nghĩa là nó không cần phải khởi động như một máy ảo.

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

Một số loại Docker Data Volumes

Có ba trường hợp sử dụng Docker Data Volumes:

  • Để giữ lai 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

Trong trường hợp đầu tiên, bạn chỉ muốn các dữ liệu được giữ lại ngay cả khi bạn xóa các container, do đó, nó là cách dễ dàng nhất để Docker quản lý dữ liệu được lưu trữ.

Lưu trữ dữ liệu an toàn

Không có cách nào để trực tiếp tạo ra một "data volume" trong Docker, nên thay vì đó chúng ta tạo ra một container data volume với một volume gắn liền với nó. Đối với bất kỳ container khác sau đó bạn muốn kết nối với data volume này, sử dụng tùy chọn Docker --volumes-from để lấy volume từ container này và áp dụng chúng vào các container hiện tại.

Đầu tiên, tạo một container data volume mới để lưu trữ volume của chúng ta:

docker create -v /tmp --name datacontainer ubuntu

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

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

Đầu tiên,start ubuntu image:

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

Tùy chọn dòng lệnh -t chạy terminal trong container. Tùy chọn -i tạo các kết nối tương tác.

Tạo ra một tập tin trong / tmp:

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

Gõ exit để trở về với máy chủ của bạn. Bây giờ, chạy lại lệnh trên:

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

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

cat /tmp/hi

Bạn sẽ thấy:

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

Bạn có thể thêm bao nhiêu --volumes-from tùy bạn muốn (ví dụ, nếu bạn muốn lắp ráp một container sử dụng dữ liệu từ nhiều data containers). Bạn cũng có thể tạo ra nhiều data container volume như bạn muốn.

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

Chia sẻ dữ liệu giữa các máy chủ và các Docker container

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

Một ví dụ thực tế , bạn muốn sử dụng Docker Nginx image nhưng bạn muốn giữ một bản sao vĩnh viễn các file log của Nginx để phân tích sau đó. Theo mặc định, log Docker Nginx image được ghi vào thư mục /var/log/nginx, nhưng đây là /var/log/nginx trong container Docker Nginx. Thông thường không thể truy cập từ các hệ thống tập tin host.

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

mkdir ~/nginxlogs

Sau đó start container:

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

lệnh chạy này có chút khác biệt nên chúng ta sẽ chia ra phân tích:

  • v ~/nginxlogs: /var/log/nginx - Chúng tôi thiết lập một volume liên kết thư mục /var/log/nginx trong container Nginx vào thư mục ~/nginxlogs trên máy chủ.

  • -d - Bỏ process và chạy ở chế độ nền. Nếu không, chúng tôi sẽ chỉ được xem một Nginx trống và sẽ không thể sử dụng terminal cho đến khi chúng ta kill Nginx.

  • -p 5000: 80 - Thiết lập một cổng chuyển tiếp. Các container Nginx sẽ lắng nghe trên cổng 80 theo mặc định, và kết nối công 80 của Nginx container đến cổng 5000 trên hệ thống máy chủ.

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

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 container Docker trên máy tính của chúng ta, và máy chủ của chúng ta có cổng 5000 map trực tiếp với cổng 80 của bản sao của Nginx. Hãy sử dụng curl kiểm tra nhanh:

curl localhost:5000

Bạn tạo 1 file HTML và chạy trên Nginx.Khi bạn xem thư mục ~/nginxlogs trên máy chủ và hãy nhìn vào các tập tin access.log bạn sẽ thấy một thông báo đăng nhập từ Nginx:

cat ~/nginxlogs/access.log

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

172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

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

Tham khảo : https://www.digitalocean.com