Hướng dẫn chia sẻ dữ liệu giữa Docker Container và máy chủ
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:
- Người dùng non-root với quyền sudo ( xem Thiết lập ban đầu cho server dùng Ubuntu 16.04 để biết thêm )
- Cài đặt Docker
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ệnhnginx -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:
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ư:
Output
203.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.