Lịch sử của vấn đề di chuyển bộ lưu trữ docker (root docker)

Cách đây không quá vài ngày, một trong các máy chủ đã quyết định di chuyển bộ lưu trữ docker (thư mục nơi docker lưu trữ tất cả các tệp vùng chứa và hình ảnh) sang một phần riêng biệt, trong đó
đã có công suất lớn hơn. Nhiệm vụ có vẻ tầm thường và không báo trước rắc rối...

Bắt đầu nào:

1. Dừng và hủy tất cả các container trong ứng dụng của chúng tôi:

docker-compose down

nếu có nhiều vùng chứa và chúng có thành phần khác nhau, bạn có thể thực hiện việc này:

docker rm -f $(docker ps -q)

2. Dừng trình nền docker:

systemctl stop docker

3. Di chuyển thư mục đến vị trí mong muốn:

cp -r /var/lib/docker /docker/data/storage

4. Chúng tôi yêu cầu daemon docker tìm trong thư mục mới. Có một số tùy chọn: sử dụng cờ -g để trỏ daemon đến một đường dẫn mới hoặc cấu hình systemd mà chúng tôi đã sử dụng. Hoặc một liên kết tượng trưng. Tôi sẽ không đi sâu vào chi tiết về điều này, nó có trên Internet. đầy hướng dẫn di chuyển root docker đến vị trí mới.

5. Khởi động trình nền docker và đảm bảo nó xuất hiện ở đúng vị trí:

systemctl status docker

Ở một trong những dòng đầu ra chúng ta sẽ thấy:

├─19493 /usr/bin/dockerd --data-root=/docker/data/storage

Chúng tôi đã đảm bảo rằng tùy chọn đã được chuyển tới daemon, bây giờ hãy kiểm tra xem nó có áp dụng nó hay không (cảm ơn inkvizitor68sl)!

docker info | awk '/Root Dir/ {print $NF}' 

6. Hãy bắt đầu ứng dụng của chúng ta:

docker-compose up -d

7. Kiểm tra

Và ở đây cuộc vui bắt đầu, DBMS, MQ, mọi thứ đều ổn! Cơ sở dữ liệu còn nguyên vẹn, mọi thứ đều hoạt động... ngoại trừ nginx. Chúng tôi có bản dựng nginx của riêng mình với Kerberos và gái điếm. Và việc xem nhật ký vùng chứa cho biết rằng nó không thể ghi vào/var/tmp - Quyền bị từ chối. Tôi dùng ngón tay xoa xoa thái dương và cố gắng phân tích tình hình... Làm sao điều này có thể xảy ra? Hình ảnh Docker không thay đổi. Chúng tôi vừa di chuyển thư mục. Nó luôn hoạt động và đây là dành cho bạn... Để thử nghiệm, tôi đã dùng tay vào thùng chứa và thay đổi quyền đối với thư mục này, đã có gốc, gốc 755, đã đưa cho gốc, gốc 777. Và mọi thứ bắt đầu... Một ý nghĩ bắt đầu vang lên trong đầu tôi - một điều gì đó vô nghĩa... Tôi nghĩ, à, có lẽ tôi đã không tính đến điều gì đó...

Tôi quyết định rằng chúng tôi yêu thích quyền truy cập vào các tệp trong quá trình chuyển. Chúng tôi đã dừng ứng dụng, trình nền docker, xóa thư mục mới và sao chép thư mục /var/lib/docker bằng cách sử dụng rsync -a.

Tôi nghĩ bây giờ mọi thứ đều ổn, hãy nâng cấp ứng dụng Docker.

Aaand... vấn đề vẫn còn... Mắt tôi giật giật. Tôi chạy nhanh đến bảng điều khiển của máy ảo của mình, nơi tôi chạy nhiều thử nghiệm khác nhau, tôi có hình ảnh nginx này và tôi leo vào bên trong vùng chứa và ở đây quyền đối với thư mục /var/tmp là root, root 777. Tức là, giống như tôi phải thiết lập bằng tay. Nhưng hình ảnh giống hệt nhau!

Hệ thống tệp xfs đã được sử dụng ở mọi nơi.

Tôi so sánh bằng cách sử dụng lệnh

docker inspect my-nginx:12345

Tất cả các giá trị băm đều giống hệt nhau, tất cả đều giống nhau. Cả trên máy chủ và trên máy ảo của tôi. Tôi đã xóa hình ảnh nginx cục bộ và kéo lại nó từ sổ đăng ký, vì một số lý do nó nằm trên cùng một máy. Và vấn đề vẫn như cũ... Bây giờ con mắt thứ hai của tôi đang co giật.

Tôi không còn nhớ trong đầu mình đang nghĩ gì, ngoài việc hét lên “AAAAAAAAA” và những thứ khác. Lúc đó là 4 giờ sáng và mã nguồn Docker đã được sử dụng để hiểu nguyên tắc băm các lớp hình ảnh. Mở lon nước tăng lực thứ ba. Và cuối cùng tôi nhận ra rằng việc băm chỉ tính đến tệp, nội dung của nó, nhưng KHÔNG CÓ QUYỀN TRUY CẬP! Nghĩa là, theo một cách bí ẩn nào đó, quyền của chúng tôi đã bị mất, selinux bị vô hiệu hóa, acl không được sử dụng và không có chút dính nào.

Tôi đã xóa hình ảnh cục bộ, cũng xóa hình ảnh khỏi sổ đăng ký docker và đẩy lại. Và mọi thứ đều hiệu quả. Hóa ra trong quá trình chuyển giao, các quyền đã bị mất, cả bên trong hình ảnh cục bộ và bên trong hình ảnh nằm trong sổ đăng ký. Như tôi đã nói, vì một số lý do mà nó được đặt trên cùng một chiếc xe. Và kết quả là, trong một thư mục /var/lib/docker.

Và đoán trước câu hỏi liệu họ có cố gắng đưa ánh nhìn của docker trở lại thư mục cũ hay không - không, họ đã không thử, than ôi, hoàn cảnh không cho phép điều đó. Vâng, và tôi thực sự muốn tìm hiểu nó.

Sau khi viết bài này, đối với tôi, giải pháp cho vấn đề có vẻ hiển nhiên, nhưng tại thời điểm phân tích thì có vẻ không như vậy. Thành thật mà nói, tôi đã tìm trên Google và không tìm thấy tình huống tương tự.

Kết quả: Mình đã giải quyết được vấn đề, vẫn chưa hiểu lý do =(

Nếu ai đó biết, đoán, có tầm nhìn về những nguyên nhân có thể xảy ra của vấn đề này, tôi sẽ vô cùng vui mừng khi được nghe ý kiến ​​​​của bạn trong phần bình luận!

Nguồn: www.habr.com

Thêm một lời nhận xét