Docker.sock'u herkes açıklayabilir mi?


130

Ben montaj için gerçek nedenini anlamaya çalışıyorum docker.sockyılında docker-compose.ymldosyası. Otomatik keşif için mi?

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

Yanıtlar:


130

docker.sockDocker daemon'un dinlediği UNIX soketidir. Docker API için ana giriş noktasıdır. Ayrıca TCP soketi de olabilir, ancak varsayılan olarak güvenlik nedenleriyle Docker varsayılan olarak UNIX soketini kullanır.

Docker cli istemcisi, varsayılan olarak docker komutlarını yürütmek için bu soketi kullanır. Bu ayarları da geçersiz kılabilirsiniz.

Docker soketini bir konteynerin içine monte etmeniz gerekmesinin farklı nedenleri olabilir. Başka bir konteynerden yeni konteynerler başlatmak gibi. Veya otomatik servis keşfi ve Günlük kaydı amaçları için. Bu, saldırı yüzeyini artırır, bu nedenle bir konteynerin içine docker soketi takarsanız dikkatli olmalısınız, aksi takdirde Docker varsayılan olarak tüm konteynerleri root olarak başlattığından, docker daemon çalıştıran ana makinenizi tehlikeye atabilirsiniz.

Docker soketinin çoğu kurulumda bir docker grubu vardır, bu nedenle bu gruptaki kullanıcılar docker komutlarını kök izni olmadan docker soketine karşı çalıştırabilir, ancak docker daemon'u root olarak etkili bir şekilde çalıştığından (ad alanına ve cgroups'a erişmek için root iznine ihtiyaç duyduğu için gerçek docker konteynerleri hala root izni alır) .

Umarım sorunuzu cevaplar.

Daha fazla bilgi: https://docs.docker.com/engine/reference/commandline/dockerd/#examples


1
Kırık bağlantı. Muhtemelen beklenen bilgilerle benzer bilgiler şudur: docs.docker.com/engine/admin
Borja Bolilla

7
@ Boynux'un sağladığı uyarılara ek olarak, Docker Güvenliği En İyi Uygulamaları makalesinde daha fazla bilgi bulabilirsiniz . Bu konuda şöyle derler: " /var/run/docker.sockKonteynerin içine monte etmek yaygın, ancak çok tehlikeli bir uygulamadır. Bir saldırgan, docker servisinin çalıştırabileceği herhangi bir komutu çalıştırabilir, bu da genellikle docker servisi root olarak çalıştığı için tüm ana sisteme erişim sağlar. "
Arnold Schrijver

36

Biraz geç biliyorum ama umarım cevabım çok fazla fikir verir

Önce Unix Sockets hakkında konuşmama izin verin

Soketler terimi genellikle IP Soketleri anlamına gelir. Bunlar bir bağlantı noktasına (ve adrese) bağlı olanlardır, TCP isteklerini gönderiyoruz ve yanıtları alıyoruz.

Başka bir Soket türü de Unix Soketidir, bu soketler IPC (İşlemler Arası İletişim) için kullanılır . Ayrıca Unix Domain Sockets ( UDS ) olarak da adlandırılırlar . Unix Soketleri iletişim için yerel dosya sistemini kullanırken IP Soketleri ağı kullanır.

Docker daemon, Docker Engine API isteklerini üç farklı Soket türü aracılığıyla dinleyebilir: unix, tcp, and fd .

Varsayılan olarak, /var/run/docker.sock adresinde bir unix etki alanı soketi (veya IPC soketi) oluşturulur.

Bazı canlı örnekler görelim :

Docker Server, REST API'yi dinlemek için bu soketi kullanır ve istemciler, sunucuya API istekleri göndermek için soketi kullanır.

curl , --unix-socketbayrak aracılığıyla bir Unix Soketi ile konuşabilir . Docker Server API REST olarak sunulduğundan, HTTP üzerinden komutlar göndermemiz gerekir. Ayrıca, bu sunucu yerel olduğundan (dosya sistemini hatırlayın), URL'deki herhangi bir ana bilgisayar adını iletebiliriz (veya yerel ana makineye yapıştırabiliriz, bu da iyi çalışacaktır!). Sunucu, ana bilgisayar adı ile değil, sadece yol ile ilgilenir.

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

Bazı komutlar :

Docker.sock ile pek çok şey yapabilirsiniz

bu güzel makaleye göz atın


6

temelde ana bilgisayar docker daemon'unu kapsayıcıya sunar. Böylece, ana bilgisayardaki bu komutları doğrudan çağırmak gibi görüntüleri / kapsayıcıları başlatmak / durdurmak / oluşturmak için docker api / istemcisini kapsayıcınızdan çağırabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.