Mengapa saya mendapatkan "Tidak dapat terhubung ke daemon Docker" ketika daemon sedang berjalan?

29

Layanan Docker jelas berjalan:

$ 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

Namun, Docker sendiri menolak untuk berbicara dengannya:

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

Saya menjalankan konfigurasi Docker default , yaitu, saya belum mengubah /etcfile apa pun yang berkaitan dengan layanan ini.

Apa yang bisa menjadi masalah di sini?

l0b0
sumber

Jawaban:

36

Anda perlu menambahkan diri Anda ke dockergrup dan mengaktifkan grup (dengan logout dan masuk lagi atau berjalan newgrp docker) untuk menjalankan dockerperintah. Pesan kesalahan itu hanya menyesatkan.

l0b0
sumber
1
Tidak terlalu menyesatkan. Itu tidak dapat terhubung ke daemon buruh pelabuhan. "Apakah dasmon berjalan?" hanyalah tebakan.
Bratchley
2
sudo gpasswd -a alex docker
Alex Punnen
1
sudo gpasswd -a $ USER docker # Dapat digunakan untuk semua nama pengguna
priomsrb
Saya melakukan ini dan itu masih tidak berhasil. Menjalankan sudo systemctl start dockermemperbaikinya, dasmon benar-benar tidak berjalan ...
nakamin
32

Pertanyaan ini sudah dijawab, tetapi inilah informasi tambahan.

Tidak masalah jika Anda menggunakan Arch atau distribusi lain seperti Fedora atau Ubuntu, Docker menggunakan file socket untuk berkomunikasi. Ketika Anda menjalankan dockerperintah, ia menggunakan soket ini untuk berbicara dengan daemon Docker. Tentu saja, daemon harus berjalan (dan ini sering dinonaktifkan secara default), tetapi jika pengguna Anda tidak dapat mengakses soket, daemon itu juga tidak dapat berkomunikasi dengan daemon.

Anda pertama-tama akan menginstal Docker dari repositori distribusi. Beberapa orang mengunduh skrip instalasi dan mengirimkannya ke shell ( curl ... | sh), tetapi disarankan untuk menginstalnya dari repositori sehingga dapat diperbarui dengan mudah.

Lengkungan:

# pacman -S docker

Fedora:

# dnf install docker

Seperti disebutkan di atas, daemon mungkin dinonaktifkan secara default. Jika Anda ingin menggunakan Docker, daemon harus dijalankan.

Aktifkan (jadi akan dimulai saat boot):

# systemctl enable docker

Mulai sekarang (atau reboot):

# systemctl start docker

Sekarang, secara default (jika grup buruh pelabuhan tidak ada), soket Docker dimiliki oleh root:

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

Inilah sebabnya mengapa pengguna biasa tidak dapat berbicara dengan daemon buruh pelabuhan. Pengguna biasa tidak memiliki izin yang memadai untuk mengakses soket. Itu tidak dapat mencapai daemon, jadi ia menganggap itu tidak berjalan dan menunjukkan kesalahan ini:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Inilah sebabnya mengapa banyak orang memulai semua perintah Docker sebagai root, menggunakan sudo. Tetapi seperti yang dijelaskan dalam jawaban lain, Docker memiliki mekanisme sendiri untuk itu, jadi menggunakan sudo tidak diperlukan.

Idealnya, grup yang dipanggil dockerdibuat saat memasang Docker. Namun, jika grup itu tidak ada ketika daemon dimulai, file socket dimiliki oleh root.

Dalam beberapa kasus, grup itu dulunya memiliki nama yang berbeda, seperti dockerrootpada Fedora . Periksa grep docker /etc/groupuntuk melihat apakah ada grup seperti itu di sistem Anda. Jika Anda sudah menggunakan grup itu (pengguna Anda ada di dalamnya), Anda perlu mengonfigurasi Docker untuk menggunakannya:

Di /etc/sysconfig/docker, tambahkan -G dockerroot(perhatikan: ini merupakan solusi, bukan solusi terbaik):

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

Setelah memulai ulang daemon, pengguna Anda dapat mengakses soket:

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

Kalau tidak, cara resmi adalah menggunakan grup yang dipanggil docker. Jika ada, Docker akan menggunakannya secara otomatis, yaitu, mengatur grup soket ke grup itu. Jika tidak ada, yang perlu Anda lakukan hanyalah membuatnya dan memulai ulang daemon:

# groupadd docker
# systemctl restart docker

File soket akan dimiliki oleh grup itu:

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

Pengguna Anda harus dalam dockergrup untuk dapat mengakses soket:

# usermod -aG docker (user)

Anda mungkin harus keluar dan masuk lagi (atau su - (user)), jalankan iduntuk melihat apakah Anda berada di grup.

Anda kemudian dapat menggunakan Docker tanpa sudo / root:

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

Akhirnya, sebuah kata peringatan. Hanya pengguna tepercaya yang boleh mengendalikan daemon Docker Anda . Lihat https://docs.docker.com/engine/security/security/ .
(Tapi tentu saja, hal yang sama berlaku untuk sudo - hanya pengguna tepercaya yang boleh ada di wheelgrup.)

basic6
sumber
1
Ini sepertinya tidak menjawab pertanyaan awal.
l0b0
4
@ l0b0: Ya, saya ingin menjelaskan mengapa ini terjadi, berharap ini akan bermanfaat bagi seseorang. Perintah usermod yang menambahkan pengguna ke grup disembunyikan di bagian tengah jawaban. Jika Anda tidak menemukan jawaban ini berguna, beri tahu saya agar saya dapat menghapusnya.
basic6
4
Ya, itu menjawab dan menjelaskan solusi untuk Arch.
kodeart
Saya telah melakukan semua ini, dan saya masih menghadapi masalah yang disebutkan oleh OP. Tidak ada langkah terkait izin yang menyelesaikan masalah.
mopsyd
3

sudo usermod-aG docker [nama pengguna]

lalu keluar lalu masuk kembali

pengguna2167582
sumber
1

Setelah melakukan riset untuk memecahkan masalah ini pada sistem Linux saya, saya pikir saya akan menulis jawaban ini. Inilah yang saya lakukan untuk memperbaiki masalah.

Pada Fedora 22

Menginstal Docker:

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

Setelah menginstal Docker:

Seorang pengguna perlu ditambahkan ke grup buruh pelabuhan.

$> sudo usermod -aG docker

Daemon buruh pelabuhan harus dimulai

$> sudo service docker start

Anda dapat mengatur daemon untuk memulai saat boot

$> sudo chkconfig docker on

Anda dapat memverifikasi layanan buruh pelabuhan sedang berjalan

$> service docker status

Dan satu pemeriksaan terakhir terakhir

$> docker run hello-world
Ronald Weidner
sumber
Memberi +1 untuk contoh lengkap, meskipun banyak dari perintah ini tidak berlaku untuk situasi saya (menginstal menggunakan pacman, menggunakan systemctlbukan service+ chkconfig).
l0b0
1

Jika Anda menggunakan varian Fedora 23 atau Redhat, edit /etc/sysconfig/dockerdan modifikasi berikut ini

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

Mulai ulang buruh pelabuhan.

Pastikan Anda menambahkan grup ini ke sistem dan menambahkan diri Anda ke grup.

Stuart James
sumber
1

Jika Anda memulai mesin buruh pelabuhan dengan: sudo service docker start

Anda tidak dapat terhubung dengan pengguna normal bahkan jika Anda telah menambahkan diri Anda ke grup 'buruh pelabuhan'.

Anda cukup menghentikannya dengan: sudo service docker stop

dan mulai sebagai pengguna biasa: layanan docker mulai

Raymond
sumber
Saya tidak perlu menambahkan pengguna docker groupsampai sekarang. sudo service startbekerja untukku. Namun, akan mengamati jika ada sesuatu yang baru.
stupidnetizen
0

Saya juga punya masalah yang sama. Masalahnya adalah dalam soket yang dialokasikan untuk docker-daemon dan docker-client.

  1. Pertama, izin tidak diatur untuk buruh pelabuhan-klien di docker. Kaus kaki Anda dapat mengaturnya menggunakan sudo usermod -aG docker $USER

  2. Kemudian periksa file bash Anda di mana buruh pelabuhan-klien berjalan. Bagi saya itu diatur ke 0.0.0.0:23.275, sementara docker-daemon berjalan pada soket unix. (Sudah diatur dalam file konfigurasi dockerd).

  3. Cukup komentari baris yang menyinggung dan itu akan berfungsi dengan baik.

  4. Tetapi jika Anda ingin membuatnya bekerja pada port TCP bukan soket unix, kemudian ubah file konfigurasi dockerd, atur ke 0.0.0.0.2375, dan pertahankan baris dalam bash seperti jika ada atau atur ke 0.0. 0,0: 2375.

Nilesh Kande
sumber
0

Ini adalah langkah-langkah yang saya ikuti untuk memperbaiki yang berikut ini

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Tambahkan diri Anda ke grup buruh pelabuhan

    usermod -aG docker $USER

  2. Perbaiki izin pada docker socker dan perintah.

    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. Tambahkan variabel ke lingkungan konfigurasi untuk perintah buruh pelabuhan

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

  4. Rest Docker

    sudo systemctl restart docker

nelaaro
sumber