ทำไมฉันถึงได้รับ“ ไม่สามารถเชื่อมต่อกับดีมอนภูต” เมื่อ daemon กำลังทำงานอยู่?


29

บริการ Docker ทำงานอย่างชัดเจน:

$ 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

อย่างไรก็ตาม Docker เองปฏิเสธที่จะพูดคุยกับมัน:

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

ฉันใช้การตั้งค่าเริ่มต้นของ Dockerนั่นคือฉันยังไม่ได้เปลี่ยน/etcไฟล์ใด ๆ ที่เกี่ยวข้องกับบริการนี้

สิ่งที่อาจเป็นปัญหาที่นี่?

คำตอบ:


36

คุณต้องเพิ่มตัวเองในdockerกลุ่มและเปิดใช้งานกลุ่ม (โดยออกจากระบบและอีกครั้งหรือเรียกใช้newgrp docker) เพื่อเรียกใช้dockerคำสั่ง ข้อความแสดงข้อผิดพลาดเป็นเพียงการทำให้เข้าใจผิด


1
ไม่ได้ทำให้เข้าใจผิดจริงๆ มันไม่สามารถเชื่อมต่อกับภูตนักเทียบท่า "daemon กำลังทำงานอยู่หรือไม่" เป็นเพียงการเดา
Bratchley

2
sudo gpasswd -a alex docker
อเล็กซ์ Punnen

1
sudo gpasswd -a $ USER
docker

ฉันทำสิ่งนี้แล้ว แต่ก็ยังไม่ทำงาน เมื่อsudo systemctl start dockerซ่อมเสร็จแล้ว daemon ก็ไม่ได้ทำงาน ...
nakamin

32

ตอบคำถามนี้แล้ว แต่นี่เป็นข้อมูลเพิ่มเติม

ไม่ว่าคุณจะอยู่ใน Arch หรือการแจกจ่ายอื่นเช่น Fedora หรือ Ubuntu นั้น Docker ใช้ไฟล์ซ็อกเก็ตเพื่อสื่อสาร เมื่อคุณรันdockerคำสั่งมันจะใช้ซ็อกเก็ตนี้เพื่อพูดคุยกับ Docker daemon แน่นอนว่า daemon จะต้องทำงาน (และมักจะปิดการใช้งานตามค่าเริ่มต้น) แต่หากผู้ใช้ของคุณไม่สามารถเข้าถึงซ็อกเก็ตได้ก็จะไม่สามารถสื่อสารกับ daemon ได้เช่นกัน

คุณต้องติดตั้ง Docker จากที่เก็บของการแจกจ่ายก่อน บางคนดาวน์โหลดสคริปต์การติดตั้งและไพพ์ไปยังเชลล์ ( curl ... | sh) แต่แนะนำให้ติดตั้งจากที่เก็บเพื่อให้สามารถอัปเดตได้ง่าย

โค้ง:

# pacman -S docker

Fedora:

# dnf install docker

ตามที่กล่าวไว้ข้างต้น daemon อาจถูกปิดใช้งานโดยค่าเริ่มต้น หากคุณต้องการใช้ Docker daemon จะต้องทำงานอยู่

เปิดใช้งาน (ดังนั้นจึงจะเริ่มต้นเมื่อบูต):

# systemctl enable docker

เริ่มทันที (หรือรีบูต):

# systemctl start docker

ตอนนี้โดยค่าเริ่มต้น (หากกลุ่มนักเทียบท่าหายไป) ซ็อกเก็ตนักเทียบท่าเป็นเจ้าของโดยรูท:

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

นี่คือเหตุผลที่ผู้ใช้ทั่วไปไม่สามารถพูดคุยกับดีมอนนักเทียบท่า ผู้ใช้ทั่วไปไม่มีสิทธิ์เพียงพอในการเข้าถึงซ็อกเก็ต ไม่สามารถเข้าถึงภูตได้จึงถือว่าไม่ได้ทำงานอยู่และแสดงข้อผิดพลาดนี้:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

sudoนี่คือเหตุผลที่คนจำนวนมากเพียงแค่เริ่มต้นคำสั่งหางทั้งหมดเป็นรากใช้ แต่ตามที่อธิบายไว้ในคำตอบอื่น ๆ Docker มีกลไกของตัวเองสำหรับสิ่งนั้นดังนั้นการใช้ sudo จึงไม่จำเป็น

จะเป็นการดีที่dockerจะมีการสร้างกลุ่มที่เรียกว่าเมื่อติดตั้ง Docker อย่างไรก็ตามหากกลุ่มนั้นไม่มีอยู่เมื่อ daemon เริ่มทำงานไฟล์ซ็อกเก็ตจะเป็นของ root

ในบางกรณีกลุ่มที่ใช้ในการมีชื่อที่แตกต่างกันเช่นdockerrootใน Fedora ตรวจสอบgrep docker /etc/groupว่ามีกลุ่มดังกล่าวในระบบของคุณหรือไม่ หากคุณใช้กลุ่มนั้นอยู่แล้ว (ผู้ใช้ของคุณอยู่ในกลุ่มนั้น) คุณจะต้องกำหนดค่า Docker ให้ใช้:

ใน/etc/sysconfig/dockerเพิ่ม-G dockerroot(หมายเหตุ: เป็นการแก้ปัญหาไม่ใช่วิธีที่ดีที่สุด):

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

หลังจากรีสตาร์ท daemon ผู้ใช้ของคุณจะสามารถเข้าถึงซ็อกเก็ต:

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

dockerมิฉะนั้นวิธีที่เป็นทางการจะใช้กลุ่มที่เรียกว่า หากมีอยู่ Docker จะใช้งานโดยอัตโนมัติเช่นตั้งค่ากลุ่มซ็อกเก็ตเป็นกลุ่มนั้น หากไม่มีอยู่สิ่งที่คุณต้องทำคือสร้างและรีสตาร์ท daemon:

# groupadd docker
# systemctl restart docker

ไฟล์ซ็อกเก็ตจะเป็นของกลุ่มนั้น:

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

ผู้ใช้ของคุณต้องอยู่ในdockerกลุ่มเพื่อให้สามารถเข้าถึงซ็อกเก็ต:

# usermod -aG docker (user)

คุณอาจต้องออกจากระบบและเข้าสู่ระบบอีกครั้ง (หรือsu - (user)) เรียกใช้idเพื่อดูว่าคุณอยู่ในกลุ่ม

จากนั้นคุณสามารถใช้ Docker โดยไม่มี sudo / root:

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

ในที่สุดคำเตือน ผู้ใช้ที่เชื่อถือได้เท่านั้นที่ควรได้รับอนุญาตให้ควบคุม Docker daemon ของคุณ ดูhttps://docs.docker.com/engine/security/security/
(แต่แน่นอนเหมือนกันสำหรับ sudo - ผู้ใช้ที่เชื่อถือได้เท่านั้นควรอยู่ในwheelกลุ่ม)


1
ดูเหมือนจะไม่ตอบคำถามเดิม
l0b0

4
@ l0b0: ดีฉันต้องการอธิบายว่าทำไมสิ่งนี้จึงเกิดขึ้นหวังว่ามันจะเป็นประโยชน์กับใครบางคน คำสั่ง usermod ที่เพิ่มผู้ใช้ไปยังกลุ่มถูกซ่อนอยู่ตรงกลางของคำตอบ หากคุณไม่พบคำตอบนี้มีประโยชน์โปรดแจ้งให้เราทราบเพื่อที่ฉันจะสามารถลบได้
พื้นฐาน 6

4
ใช่มันจะตอบและอธิบายถึงวิธีแก้ปัญหาสำหรับ Arch
kodeart

ฉันทำทั้งหมดนี้แล้วและฉันยังคงประสบปัญหาที่กล่าวถึงโดย OP ขั้นตอนที่เกี่ยวข้องกับการอนุญาตไม่ได้แก้ไขปัญหา
mopsyd

3

sudo usermod -aG docker [ชื่อผู้ใช้]

จากนั้นออกจากระบบจากนั้นเข้าสู่ระบบอีกครั้ง


1

หลังจากทำวิจัยเพื่อแก้ปัญหานี้ในระบบ Linux ของฉันฉันคิดว่าฉันจะเขียนคำตอบนี้ นี่คือสิ่งที่ฉันทำเพื่อแก้ไขปัญหา

ใน Fedora 22

การติดตั้ง Docker:

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

หลังจากติดตั้ง Docker:

ต้องเพิ่มผู้ใช้ในกลุ่มนักเทียบท่า

$> sudo usermod -aG docker

ต้องเริ่มต้น docker daemon

$> sudo service docker start

คุณสามารถตั้ง daemon ให้เริ่มต้นตอนบูท

$> sudo chkconfig docker on

คุณสามารถตรวจสอบว่าบริการนักเทียบท่ากำลังทำงานอยู่

$> service docker status

และสุดท้ายการตรวจสอบสุดท้าย

$> docker run hello-world

+1 สำหรับตัวอย่างที่สมบูรณ์แม้ว่าคำสั่งเหล่านี้จะไม่สามารถใช้ได้กับสถานการณ์ของฉัน (การติดตั้งโดยpacmanใช้systemctlแทนที่จะใช้service+ chkconfig)
l0b0

1

หากคุณใช้ Fedora 23 หรือ Redhat Variant แก้ไข/etc/sysconfig/dockerและแก้ไขสิ่งต่อไปนี้

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

รีสตาร์ทตัวเทียบท่า

ตรวจสอบให้แน่ใจว่าคุณเพิ่มกลุ่มนี้ในระบบและเพิ่มตัวเองในกลุ่ม


1

คำสั่งนี้ใช้ได้สำหรับฉัน

sudo grep dwalsh /etc/sudoers

alias docker="sudo /usr/bin/docker"

ฉันพบวิธีแก้ไขปัญหาในหน้านี้หากคุณต้องการเอกสารเพิ่มเติม ทำไมเราไม่ให้ผู้ใช้ที่ไม่ใช่รูทเรียกใช้ Docker ใน CentOS, Fedora หรือ RHEL


1

หากคุณสตาร์ทเอนจิ้นนักเทียบท่าด้วย: sudo service docker start

คุณไม่สามารถเชื่อมต่อกับผู้ใช้ปกติแม้ว่าคุณจะเพิ่มตัวเองในกลุ่ม 'นักเทียบท่า'

คุณสามารถหยุดได้ด้วย: sudo service docker stop

และเริ่มเป็นผู้ใช้ปกติ: เริ่มบริการเทียบท่า


ฉันไม่ต้องเพิ่มผู้ใช้docker groupจนถึงตอนนี้ sudo service startทำงานให้ฉัน แต่จะสังเกตว่ามีอะไรใหม่
stupidnetizen

0

ฉันยังมีปัญหาเดียวกัน ปัญหาอยู่ในซ็อกเก็ตที่จัดสรรให้กับ docker-daemon และ docker-client

  1. ก่อนอื่นไม่ได้รับอนุญาตสำหรับ docker-client บน docker.sock คุณสามารถตั้งค่าได้โดยใช้ sudo usermod -aG docker $USER

  2. จากนั้นตรวจสอบไฟล์ bash ของคุณที่ซึ่ง docker-client กำลังทำงาน สำหรับฉันมันถูกตั้งค่าเป็น 0.0.0.0:2375 ในขณะที่ docker-daemon กำลังทำงานบนซ็อกเก็ตยูนิกซ์ (มันถูกตั้งค่าในไฟล์กำหนดค่าของ dockerd)

  3. เพียงแสดงความคิดเห็นในบรรทัดที่ละเมิดและมันจะทำงานได้ดี

  4. แต่ถ้าคุณต้องการให้มันทำงานบนพอร์ต TCP แทนที่จะเป็นซ็อกเก็ตยูนิกซ์ให้เปลี่ยนไฟล์กำหนดค่าของ dockerd ตั้งเป็น 0.0.0.0.2375 และเก็บบรรทัดไว้ใน bash เหมือนเดิมหรือตั้งเป็น 0.0 0.0: 2375


0

เหล่านี้คือขั้นตอนที่ฉันทำตามเพื่อแก้ไขปัญหาต่อไปนี้

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. เพิ่มตนเองของคุณไปยังกลุ่มนักเทียบท่า

    usermod -aG docker $USER

  2. แก้ไขการอนุญาตสำหรับนักเทียบท่า socker และคำสั่ง

    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. เพิ่มตัวแปรเพื่อกำหนดค่าสภาพแวดล้อมสำหรับคำสั่งนักเทียบท่า

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

  4. Rest Docker

    sudo systemctl restart docker

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.