Bất cứ ai có thể giải thích docker.sock


130

Tôi đang cố gắng để hiểu lý do thực tế để gắn docker.sockvào docker-compose.ymltập tin. Là nó để tự động khám phá?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

Câu trả lời:


130

docker.socklà ổ cắm UNIX mà Docker daemon đang nghe. Đây là điểm vào chính của Docker API. Nó cũng có thể là ổ cắm TCP nhưng theo mặc định vì lý do bảo mật Docker mặc định sử dụng ổ cắm UNIX.

Docker cli client sử dụng ổ cắm này để thực thi các lệnh docker theo mặc định. Bạn cũng có thể ghi đè các cài đặt này.

Có thể có nhiều lý do khác nhau tại sao bạn có thể cần phải gắn ổ cắm Docker bên trong một container. Giống như tung ra các container mới từ bên trong một container khác. Hoặc cho mục đích khám phá và ghi nhật ký dịch vụ tự động. Điều này làm tăng bề mặt tấn công, do đó bạn nên cẩn thận nếu bạn gắn ổ cắm docker bên trong một container có mã đáng tin cậy đang chạy bên trong container đó nếu không bạn có thể đơn giản thỏa hiệp máy chủ đang chạy docker daemon, vì Docker mặc định khởi chạy tất cả các container dưới dạng root.

Docker socket có một nhóm docker trong hầu hết các cài đặt để người dùng trong nhóm đó có thể chạy các lệnh docker với socket docker mà không có quyền root nhưng các container docker thực tế vẫn có quyền root vì docker daemon chạy như root một cách hiệu quả (nó cần quyền root để truy cập không gian tên và cgroups) .

Tôi hy vọng nó trả lời câu hỏi của bạn.

Thông tin thêm: https://docs.docker.com/engine/reference/commandline/dockerd/#examples


1
Liên kết bị hỏng. Có lẽ thông tin tương tự với thông tin dự kiến ​​là đây: docs.docker.com/engine/admin
Borja Bolilla

7
Ngoài các cảnh báo @boynux đã cung cấp cho bạn có thể tìm thêm thông tin trong bài viết Thực hành tốt nhất về bảo mật Docker . Về vấn đề này, họ nói: "Gắn /var/run/docker.sockbên trong container là một cách phổ biến nhưng rất nguy hiểm. Kẻ tấn công có thể thực thi bất kỳ lệnh nào mà dịch vụ docker có thể chạy, thường cung cấp quyền truy cập vào toàn bộ hệ thống máy chủ khi dịch vụ docker chạy như root. "
Arnold Schrijver

36

Tôi biết nó hơi muộn nhưng tôi hy vọng câu trả lời của tôi sẽ cung cấp nhiều thông tin chuyên sâu

Hãy để tôi nói chuyện đầu tiên về Unix Sockets

Thuật ngữ Sockets thường dùng để chỉ IP Sockets. Đây là những cái được liên kết với một cổng (và địa chỉ), chúng tôi gửi yêu cầu TCP đến và nhận phản hồi từ đó.

Một loại Ổ cắm khác là Ổ cắm Unix, các ổ cắm này được sử dụng cho IPC (Giao tiếp liên tiến trình). Họ cũng được gọi là Unix Domain Sockets ( UDS ). Ổ cắm Unix sử dụng hệ thống tệp cục bộ để liên lạc, trong khi Ổ cắm IP sử dụng mạng.

Trình nền Docker có thể lắng nghe các yêu cầu API của Docker Engine thông qua ba loại Ổ cắm khác nhau : unix, tcp, and fd.

Theo mặc định, ổ cắm tên miền unix (hoặc ổ cắm IPC) được tạo tại /var/run/docker.sock

Hãy cho chúng tôi xem một số ví dụ trực tiếp :

Docker Server sử dụng ổ cắm này để nghe API REST và khách hàng sử dụng ổ cắm để gửi yêu cầu API đến máy chủ.

curl có thể nói chuyện với Unix Socket thông qua --unix-socketcờ. Vì API máy chủ Docker được hiển thị dưới dạng REST, chúng tôi cần gửi các lệnh qua HTTP. Ngoài ra, vì máy chủ này là cục bộ (hãy nhớ, hệ thống tệp), chúng tôi có thể chuyển bất kỳ tên máy chủ nào trong URL (hoặc dính vào localhost, điều đó cũng sẽ hoạt động tốt!). Máy chủ không quan tâm đến tên máy chủ, chỉ là đường dẫn.

curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq

 [
  {
    "Containers": -1,
    "Created": 1525888860,
    "Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
    "Labels": null,
    "ParentId": "",
    "RepoDigests": [
      "postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
    ],
    "RepoTags": null,
    "SharedSize": -1,
    "Size": 39507096,
    "VirtualSize": 39507096
  }
]

Một số lệnh :

Bạn có thể làm rất nhiều thứ với docker.sock

kiểm tra bài viết đẹp này


6

về cơ bản nó phơi bày daemon docker máy chủ vào container. vì vậy bạn có thể gọi api / client docker từ container của bạn, để bắt đầu / dừng / xây dựng hình ảnh / container như gọi trực tiếp các lệnh đó trên máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.