Thứ năm, 17/11/2016 | 00:00 GMT+7

Cách làm việc với Docker Data Volumes trên Ubuntu 14.04

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

Vào thời điểm ta kết thúc bài viết, bạn sẽ cảm thấy thoải mái khi tạo và sử dụng bất kỳ loại data volumes Docker nào.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần những thứ sau:

Lưu ý: Mặc dù các yêu cầu đưa ra hướng dẫn để cài đặt Docker trên Ubuntu 14.04, các docker lệnh cho data volumes Docker trong bài viết này sẽ làm việc trên hệ điều hành khác miễn là Docker là cài đặt.

Giải thích về Docker Containers

Làm việc với Docker đòi hỏi bạn phải hiểu khá nhiều khái niệm dành riêng cho Docker 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 nhiều về lý do bạn muốn sử dụng bất kỳ công cụ nào trong số đó. Điều này có thể gây nhầm lẫn nếu bạn mới sử dụng Docker, vì vậy ta sẽ bắt đầu bằng cách đi qua một số khái niệm cơ bản và sau đó bắt đầu làm việc với các containers Docker. Vui lòng bỏ qua phần tiếp theo nếu bạn đã 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 .

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

Vì quá nhiều thứ được chia sẻ nên việc kích hoạt containers Docker là một thao tác nhanh chóng và rẻ - trong hầu hết các trường hợp, bạn có thể kích hoạt một containers Docker đầy đủ (tương đương với một máy ảo thông thường) trong cùng thời gian chạy bình thường chương trình dòng lệnh. Điều này thật tuyệt vời vì nó làm cho việc triển khai các hệ thống phức tạp trở thành một quá trình module dễ dàng hơn nhiều, 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 data volumes Docker

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

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

Trường hợp thứ ba nâng cao hơn một chút, vì vậy ta 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 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 ở xung quanh ngay cả khi bạn loại bỏ containers , vì vậy, việc để Docker quản lý nơi dữ liệu được lưu trữ thường dễ dàng nhất.

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

Không có cách nào để tạo trực tiếp “ data volumes ” trong Docker, vì vậy thay vào đó ta tạo một vùng chứa data volumes với một dung lượng được gắn vào nó. Đối với bất kỳ containers nào khác mà bạn muốn kết nối với containers data volumes này, hãy sử dụng tùy chọn --volumes-from của Docker để lấy dung lượng từ containers này và áp dụng chúng vào containers hiện tại. Thoạt nhìn, điều này hơi bất thường, vì vậy hãy xem qua một ví dụ nhanh về cách ta có thể sử dụng cách tiếp cận này để làm cho file byebye của ta bám xung quanh ngay cả khi containers bị xóa.

Trước tiên, hãy tạo một containers data volumes mới để lưu trữ dung lượng của ta :

  • docker create -v /tmp --name datacontainer ubuntu

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

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

Đầu tiên, bắt đầu hình ảnh ubuntu :

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

Tùy chọn dòng lệnh -t gọi một terminal từ bên trong containers . Cờ -i làm cho kết nối tương tác.

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

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

Hãy tiếp tục và nhập exit để quay lại vỏ server 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 file hi đã ở đó:

  • 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 --volumes-from tùy thích (ví dụ: nếu bạn muốn tập hợp một containers sử dụng dữ liệu từ nhiều containers dữ liệu). Bạn cũng có thể tạo bao nhiêu containers data volumes tùy thích.

Lưu ý duy nhất đối với cách tiếp cận này là bạn chỉ có thể chọn đường dẫn mount bên trong containers ( /tmp trong ví dụ của ta ) khi bạn tạo containers data volumes .

Chia sẻ dữ liệu giữa server và containers Docker

Việc sử dụng phổ biến khác cho containers Docker là như một phương tiện chia sẻ file giữa server và containers Docker. Điều này hoạt động khác với ví dụ cuối cùng. Trước tiên, không cần tạo containers “chỉ dữ liệu”. Bạn có thể chỉ cần chạy một containers bất kỳ Docker image nào và overrides một trong các folder của nó bằng nội dung của một folder trên hệ thống server .

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

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

  • mkdir ~/nginxlogs

Sau đó, khởi động containers :

  • 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 mà ta đã sử dụng cho đến nay, vì vậy hãy chia nhỏ nó ra từng phần:

  • -v ~/nginxlogs:/var/log/nginx - Ta cài đặt một ổ đĩa liên kết folder /var/log/nginx từ bên trong containers Nginx với folder ~/nginxlogs trên server . Docker sử dụng : để tách đường dẫn của server khỏi đường dẫn containers và đường dẫn server luôn đến trước.

  • -d - Tách tiến trình và chạy ở chế độ nền. Nếu không, ta sẽ chỉ xem một dấu nhắc Nginx trống và sẽ không thể sử dụng terminal này cho đến khi ta giết Nginx.

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

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

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

  • curl localhost:5000

Bạn sẽ nhận được một đoạn mã HTML từ Nginx cho thấy rằng Nginx đang hoạt động. Nhưng thú vị hơn, nếu bạn nhìn vào folder ~/nginxlogs trên server và xem file access.log bạn sẽ thấy thông báo log từ Nginx hiển thị yêu cầu của ta :

  • 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 bạn thực hiện bất kỳ thay đổi nào đối với folder ~/nginxlogs , bạn cũng có thể thấy chúng từ bên trong containers Docker trong thời gian thực.

Kết luận

Đó là về tiền nó lên! Bây giờ ta đã trình bày cách tạo containers data volumes có dung lượng mà ta có thể sử dụng như một cách để duy trì dữ liệu trong các containers khác cũng như cách chia sẻ folder giữa hệ thống file server và containers Docker. Đ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 data volumes Docker.

Nếu bạn đang sử dụng Docker Compose, bạn có thể cấu hình data volumes Docker trong file docker-compose.yml . Kiểm tra Cách cài đặt và sử dụng Docker Compose trên Ubuntu 14.04 để biết chi tiết.

Chúc may mắn và hạnh phúc với Docking!


Tags:

Các tin liên quan

Làm việc với Docker Containers
2016-11-04
Cách cấu hình môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 14.04
2016-11-03
Cách cấu hình môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 16.04
2016-11-03
Cách cài đặt và sử dụng Docker trên CentOS 7
2016-11-02
Cách gỡ lỗi và khắc phục các sự cố thường gặp của Docker
2016-10-20
Cách cài đặt Prometheus bằng Docker trên CentOS 7
2016-01-15
Cách cài đặt Prometheus bằng Docker trên Ubuntu 14.04
2016-01-12
Cách cài đặt Wordpress và PhpMyAdmin với Docker Compose trên Ubuntu 14.04
2015-11-19
Cách cài đặt và sử dụng Docker Compose trên Ubuntu 14.04
2015-11-19
Cách dọn dẹp môi trường Docker của bạn bằng CloudSlang trên CoreOS Cluster
2015-06-10