Hướng dẫn chia sẻ dữ liệu giữa Docker Container và máy chủ

5 năm trước

Giới thiệu

Nói chung,Docker container là không lâu, chỉ chạy miễn là lệnh được đưa ra trong một container để hoàn thành. Theo mặc định, mọi dữ liệu được tạo bên trong container chỉ khả dụng từ bên trong container và chỉ khi container đang chạy.

 Docker Volumes có thể được sử dụng để chia sẻ tệp giữa một hệ thống máy chủ lưu trữ và Docker container. Ví dụ, giả sử bạn muốn sử dụng hình ảnh Docker Nginx chính thức và 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 sẽ đăng nhập vào thư mục /var/log/nginx  trong vùng chứa Docker Nginx. Thông thường không thể truy cập từ hệ thống tập tin lưu trữ.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách làm cho dữ liệu từ bên trong container có thể truy cập được trên máy chủ.

 

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

Để làm theo bài viết này, cần một máy chủ Ubuntu 16.04 với những điều sau đây:

Nếu bạn chưa quen với Docker, loạt hệ sinh thái Docker cung cấp một cái nhìn tổng quan chi tiết.

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

 

Bước 1 - Liên kết gắn ổ đĩa

Lệnh sau sẽ tạo thư mục nginxlogs  trong thư mục chủ của người dùng hiện tại của bạn và liên kết nó với /var/log/nginx trong container:

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

Hãy dành một chút thời gian để kiểm tra chi tiết lệnh này:

  • --name=nginx đặt tên cho container để chúng ta có thể tham khảo dễ dàng hơn.
  • -d làm gián đoạn quá trình và chạy trong nền. Nếu không, chúng ta chỉ xem một 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 bỏ Nginx.
  • -v ~/nginxlogs:/var/log/nginx Thiết lập volume liên kết liên kết thư mục /var/log/nginx từ bên trong vùng chứa Nginx tới thư mục ~/nginxlogs trên máy chủ. Docker sử dụng : để tách đườ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.
  • -p 5000:80 thiết lập một cổng phía trước. Container Nginx đang nghe trên cổng 80 theo mặc định. Lá cờ này ánh xạ cổng 80 của container đến cổng 5000 trên hệ thống máy chủ.
  • nginx xác định rằng container nên được xây dựng từ hình ảnh Nginx, nó sẽ đưa ra lệnh nginx -g "daemon off để khởi động Nginx. 

Lưu ý:  Cờ -v rất linh hoạt. Nó có thể liên kết hoặc đặt tên cho một tập chỉ với một điều chỉnh nhỏ trong cú pháp. Nếu đối số đầu tiên bắt đầu bằng / hoặc ~/ thì bạn đang tạo một liên kết. Loại bỏ điều đó, và bạn đang đặt tên cho tập.

-v /path:/path/in/container gắn kết thư mục máy chủ, /path tại /path/in/container-v path:/path/in/container tạo một tập có tên path không liên quan đến máy chủ.

Bước 2 - Truy cập dữ liệu trên máy chủ

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, và cổng 5000 của máy chủ trực tiếp tới bản sao của cổng 80 của Nginx.

Tải địa chỉ trong trình duyệt web, sử dụng địa chỉ IP hoặc tên máy chủ của bạn và số cổng, http://203.0.113.0:5000. Bạn nên thấy:Nginx Start Page

Thú vị hơn, nếu nhìn vào thư mục ~/nginxlogs trên máy chủ, chúng ta sẽ thấy access.log được tạo bởi nginx của container, sẽ hiển thị yêu cầu:

$ cat ~/nginxlogs/access.log 

                                    Điều này sẽ hiển thị một điều gì đó như:

Output203.0.113.0 - - [11/Nov/2016:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-" 
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"
 

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

Trong hướng dẫn này, chúng ta đã trình bày cách tạo một volume dữ liệu Docker để chia sẻ thông tin giữa container và hệ thống tệp máy chủ hữu ích trong môi trường phát triển, nơi cần truy cập vào nhật ký để gỡ lỗi.