Arka plan programı çalışırken neden “Docker arka planına bağlanılamıyor” alıyorum?


29

Docker hizmeti açıkça çalışıyor:

$ systemctl status docker.service 
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2015-12-28 19:20:50 GMT; 3 days ago
     Docs: https://docs.docker.com
 Main PID: 1015 (docker)
   CGroup: /system.slice/docker.service
           └─1015 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs
$ ps wuf -u root | grep $(which docker)
root      1015  0.0  0.3 477048 12432 ?        Ssl   2015   2:26 /usr/bin/docker daemon -H fd:// --exec-opt native.cgroupdriver=cgroupfs

Ancak, Docker kendisi ile konuşmayı reddediyor:

$ docker info
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Varsayılan Docker yapılandırmasını çalıştırıyorum , yani /etcbu hizmetle ilgili hiçbir dosyayı değiştirmedim .

burdaki problem ne olabilir?

Yanıtlar:


36

Sen gerek eklenin dockergrubunda ve (çıkış yaptıktan ve tekrar ya çalıştırarak grubunu aktive newgrp dockerçalıştırmak için) dockerkomutları. Hata mesajı sadece yanıltıcıdır.


1
Gerçekten yanıltıcı değil. Bu olamazdı liman işçisi cini bağlanın. "Daemon çalışıyor mu?" sadece bir tahmindi.
Bratchley

2
sudo gpasswd -a alex liman işçisi
Alex Punnen

1
sudo gpasswd -a $ USER docker # Herhangi bir kullanıcı adı için çalışır
priomsrb

Bunu yaptım ve hala işe yaramadı. Koşmak sudo systemctl start dockero
tamir

32

Bu soru zaten cevaplandı, ancak işte size ek bir bilgi parçası.

Arch'ta veya Fedora veya Ubuntu gibi başka bir dağıtımda olsanız da, Docker iletişim kurmak için bir soket dosyası kullanır. dockerKomutları çalıştırdığınızda , Docker daemon ile konuşmak için bu soketi kullanır. Elbette, arka plan programı çalışıyor olmalı (ve genellikle varsayılan olarak devre dışıdır), ancak kullanıcı sokete erişemiyorsa, arka planınızla da iletişim kuramaz.

Docker'ı ilk önce dağıtım havuzundan kurardınız. Bazı insanlar bir yükleme betiği indirip bir shell'e ( curl ... | sh) aktarır , ancak kolayca güncelleştirilebilmesi için depodan yüklemeniz önerilir.

Arch:

# pacman -S docker

Fedora:

# dnf install docker

Yukarıda belirtildiği gibi, arka plan programı varsayılan olarak devre dışı bırakılabilir. Docker'ı kullanmak istiyorsanız, arka plan programı çalışıyor olmalıdır.

Etkinleştir (açılışta başlatılacak):

# systemctl enable docker

Şimdi başlat (veya yeniden başlat):

# systemctl start docker

Şimdi, varsayılan olarak (docker grubu yoksa), Docker soketi root'a aittir:

# ls -la /var/run/docker.sock
srw-rw---- 1 root root 0 Apr 28 17:22 /var/run/docker.sock

Bu nedenle düzenli bir kullanıcı liman işçisi arka plan programı ile konuşamıyor. Normal bir kullanıcının sokete erişmek için yeterli izni yok. Artalanda ulaşamadığı için çalışmadığını ve şu hatayı gösterdiğini varsayar:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Bu yüzden birçok insan tüm Docker komutlarını root olarak başlatıyor sudo. Ancak diğer cevabında açıklandığı gibi, Docker'ın bunun için kendi mekanizması var, bu yüzden sudo kullanmak gerekli değil.

İdeal olarak, dockerDocker'ı yüklerken adlı bir grup oluşturulur. Ancak, bu grup arka plan programı başlatıldığında mevcut değilse, soket dosyası root'a aittir.

Bazı durumlarda, bu grubun dockerrootFedora'daki gibi farklı bir adı vardı . grep docker /etc/groupSisteminizde böyle bir grup olup olmadığını kontrol edin . Zaten bu grubu kullanıyorsanız (kullanıcınız içinde), Docker’ı kullanmak için yapılandırmanız gerekir:

İçinde /etc/sysconfig/dockerekle -G dockerroot(not: bu bir çözüm, en iyi çözüm değil):

OPTIONS='--selinux-enabled -G dockerroot'

Daemon'u yeniden başlattıktan sonra, kullanıcı sokete erişebilecek:

# systemctl restart docker
# ls -la /var/run/docker.sock
srw-rw---- 1 root dockerroot 0 Apr 28 17:32 /var/run/docker.sock

Aksi taktirde, resmi yol denilen grubu kullanmak olacaktır docker. Varsa, Docker otomatik olarak kullanır, yani soketin grubunu o gruba ayarlar. Eğer yoksa, yapmanız gereken tek şey onu oluşturmak ve arka plan planını yeniden başlatmak:

# groupadd docker
# systemctl restart docker

Soket dosyası bu gruba ait olacaktır:

# srw-rw---- 1 root docker 0 Apr 28 17:42 /var/run/docker.sock

dockerSokete erişebilmek için kullanıcı grubun içinde olmalıdır :

# usermod -aG docker (user)

Gruptan çıkıp çıkmadığınızı görmek için çıkış yapmanız ve tekrar giriş yapmanız (veya su - (user)) yapmanız gerekebilir id.

Daha sonra Docker’ı sudo / root kullanmadan kullanabilirsiniz:

$ docker version --format '{{.Server.Version}}'
1.9.1

Sonunda, bir uyarı kelimesi. Docker daemon'unuzu denetlemenize yalnızca güvenilir kullanıcıların izin vermesi gerekir . Https://docs.docker.com/engine/security/security/ adresine bakın .
(Ama elbette, aynı sudo için de geçerlidir - yalnızca güvenilen kullanıcılar wheelgrupta olmalıdır .)


1
Bu orijinal soruya cevap vermiyor gibi görünüyor.
lbb0

4
@ l0b0: Bunun neden olduğunu açıklamak istedim, birisinin yararına olacağını umuyordum. Kullanıcıyı gruba ekleyen usermod komutu, cevabın ortasına gizlenir. Bu cevabı yararlı bulmazsanız, silebilmem için bana bildirin.
basic6

4
Evet, cevaplıyor ve Arch için çözümü açıklıyor.
kodeart

Bunların hepsini yaptım ve hala OP tarafından belirtilen sorunla karşılaşıyorum. İzinle ilgili adımların hiçbiri sorunu çözmedi.
mopsyd

3

sudo usermod -aG yerleştirici [kullanıcı adı]

sonra çıkış yapıp tekrar giriş yap


1

Linux sistemimde bu sorunu çözmek için biraz araştırma yaptıktan sonra bu cevabı yazacağımı düşündüm. İşte sorunu çözmek için yaptığım şey.

Fedora 22'de

Docker'ı yükleme:

$> curl -fsSL https://get.docker.com/ | sh

Docker'ı yükledikten sonra:

Liman işçisi grubuna bir kullanıcı eklenmeli.

$> sudo usermod -aG docker

Liman işçisi arka planın başlatılması gerekiyor

$> sudo service docker start

Daemon'u açılışta başlayacak şekilde ayarlayabilirsiniz

$> sudo chkconfig docker on

Liman işçisi hizmetinin çalıştığını doğrulayabilirsiniz.

$> service docker status

Ve son bir son kontrol

$> docker run hello-world

Tam bir örnek için +1, bu komutların çoğu benim durumum için geçerli olmasa da ( + yerine pacman, kullanarak yükleme ). systemctlservicechkconfig
lbb0

1

Fedora 23 veya Redhat variant kullanıyorsanız /etc/sysconfig/docker, aşağıdakileri düzenleyin ve değiştirin.

OPTIONS='--selinux-enabled --log-driver=journald -G yourdockergroup'

Docker'ı yeniden başlatın.

Bu grubu sisteme eklediğinizden ve kendinizi gruba eklediğinizden emin olun.



1

Liman motorunuzu başlattıysanız: sudo service docker start

Kendinizi 'docker' grubuna eklemiş olsanız bile normal kullanıcıyla bağlantı kuramazsınız.

Basitçe şunu durdurabilirsiniz: sudo service docker stop

ve normal bir kullanıcı olarak başlatın: servis liman başlangıç


Şimdiye docker groupkadar kullanıcı eklemek zorunda değildim . sudo service startbenim için çalıştı. Ancak, yeni bir şey olup olmadığını gözlemleyecektir.
stupidnetizen

0

Ben de aynı sorunu yaşadım. Sorun docker-daemon'a ve docker-istemciye tahsis edilmiş soketlerdi.

  1. İlk olarak, docker.sock üzerindeki docker istemcisi için izin ayarlanmadı sudo usermod -aG docker $USER

  2. Ardından docker istemcisinin çalıştığı bash dosyanızı kontrol edin. Benim için 0.0.0.0:2375 olarak ayarlandı, docker-daemon unix soketinde çalışıyordu. (Dockerd yapılandırma dosyasında ayarlandı).

  3. Sadece rahatsız edici çizgiyi yorumlayın, iyi sonuç verecektir.

  4. Ancak, unix soketi yerine TCP portunda çalışmasını istiyorsanız, dockerd'ın yapılandırma dosyasını değiştirin, 0.0.0.0.2375 olarak ayarlayın ve satırı mevcut olduğu gibi bash olarak ayarlayın veya 0.0 olarak ayarlayın. 0.0: 2375.


0

Bunlar, aşağıdakileri düzeltmek için izlediğim adımlar.

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Kendinizi liman işçisi grubuna ekleyin

    usermod -aG docker $USER

  2. Liman işçisi ve komutanındaki izinleri düzelt.

    sudo chgrp docker /usr/bin/docker
    sudo chgrp docker /var/run/docker.sock

    $ ll $(which docker) -rwxr-xr-x 1 root docker 18991768 08.07.2017 22:57 /usr/bin/docker*

    $ ll /var/run/docker.sock srw-rw---- 1 root docker 0 23.07.2017 10:21 /var/run/docker.sock

  3. Docker komutu için config ortamına değişkenler ekleyin

    export DOCKER_HOST=unix:///var/run/docker.sock

  4. Dinlenme Docker

    sudo systemctl restart docker

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.