Adakah yang bisa menjelaskan docker.sock

130

Saya mencoba untuk memahami alasan sebenarnya untuk pemasangan docker.sockdi docker-compose.ymlberkas. Apakah ini untuk penemuan otomatis?

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

Jawaban:

130

docker.sockadalah soket UNIX yang didengarkan daemon Docker. Ini adalah titik masuk utama untuk API Docker. Ini juga bisa berupa soket TCP tetapi secara default untuk alasan keamanan Docker default untuk menggunakan soket UNIX.

Klien cli Docker menggunakan socket ini untuk menjalankan perintah docker secara default. Anda dapat mengganti pengaturan ini juga.

Mungkin ada alasan berbeda mengapa Anda mungkin perlu memasang soket Docker di dalam sebuah wadah. Seperti meluncurkan wadah baru dari dalam wadah lain. Atau untuk penemuan layanan otomatis dan tujuan Logging. Ini meningkatkan serangan permukaan sehingga Anda harus berhati-hati jika Anda memasang socket buruh pelabuhan di dalam wadah ada kode tepercaya berjalan di dalam wadah itu jika tidak, Anda dapat dengan mudah kompromi host Anda yang menjalankan daemon docker, karena Docker secara default meluncurkan semua wadah sebagai root.

Soket docker memiliki grup docker di sebagian besar instalasi sehingga pengguna dalam grup tersebut dapat menjalankan perintah docker terhadap socket docker tanpa izin root tetapi kontainer buruh pelabuhan yang sebenarnya masih mendapatkan izin root karena daemon docker berjalan sebagai root secara efektif (perlu izin root untuk mengakses namespace dan cgroups) .

Saya harap ini menjawab pertanyaan Anda.

Info lebih lanjut: https://docs.docker.com/engine/reference/commandline/dockerd/#examples

Boynux
sumber
1
Tautan rusak. Mungkin informasi yang mirip dengan yang diharapkan adalah ini: docs.docker.com/engine/admin
Borja Bolilla
7
Selain peringatan yang diberikan @boynux, Anda dapat menemukan informasi lebih lanjut di artikel Praktik Terbaik Docker . Yang satu ini mereka katakan: "Pemasangan /var/run/docker.sockdi dalam wadah adalah praktik umum, namun sangat berbahaya. Penyerang dapat menjalankan perintah apa pun yang dapat dijalankan layanan buruh pelabuhan, yang umumnya menyediakan akses ke seluruh sistem host karena layanan buruh pelabuhan berjalan sebagai root. "
Arnold Schrijver
36

Saya tahu ini agak terlambat tetapi saya berharap jawaban saya akan memberikan begitu banyak wawasan

Biarkan saya bicara lebih dulu tentang Unix Sockets

Istilah Soket biasanya mengacu pada Soket IP. Ini adalah orang-orang yang terikat pada port (dan alamat), kami mengirim permintaan TCP, dan mendapat tanggapan dari.

Jenis lain dari Socket adalah Unix Socket, soket ini digunakan untuk IPC (Interprocess Communication). Mereka juga disebut Unix Domain Sockets ( UDS ). Unix Sockets menggunakan sistem file lokal untuk komunikasi, sedangkan IP Sockets menggunakan jaringan.

The Docker daemon dapat mendengarkan permintaan API Docker Mesin melalui tiga jenis Socket: unix, tcp, and fd.

Secara default, soket domain unix (atau soket IPC) dibuat di /var/run/docker.sock

Mari kita lihat beberapa contoh langsung :

Docker Server menggunakan soket ini untuk mendengarkan REST API, dan klien menggunakan soket untuk mengirim permintaan API ke server.

curl dapat berbicara dengan Unix Socket melalui --unix-socketflag. Karena Docker Server API diekspos sebagai REST, kami harus mengirim perintah melalui HTTP. Juga, karena server ini bersifat lokal (ingat, sistem file), kami dapat memberikan nama host apa saja di URL (atau menempel pada localhost, itu juga akan berfungsi dengan baik!). Server tidak peduli dengan nama host, hanya jalannya.

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
  }
]

Beberapa perintah :

Anda dapat melakukan banyak hal dengan docker.sock

lihat artikel yang indah ini

Narendranath Reddy
sumber
6

pada dasarnya memperlihatkan daemon buruh pelabuhan tuan rumah ke wadah. sehingga Anda dapat memohon api / klien buruh pelabuhan dari wadah Anda, untuk memulai / menghentikan / membuat gambar / wadah seperti secara langsung memanggil perintah-perintah itu di host.

lwpro2
sumber