Tại sao tôi nhận được không thể kết nối với Docker daemon khi trình nền đang chạy?


29

Dịch vụ Docker đang chạy rõ ràng:

$ 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

Tuy nhiên, Docker tự từ chối nói chuyện với nó:

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

Tôi đang chạy cấu hình Docker mặc định , nghĩa là tôi chưa thay đổi bất kỳ /etctệp nào liên quan đến dịch vụ này.

Vấn đề ở đây là gì?

Câu trả lời:


36

Bạn cần thêm chính mình vào dockernhóm và kích hoạt nhóm (bằng cách đăng xuất và đăng nhập lại hoặc chạy newgrp docker) để chạy dockercác lệnh. Thông báo lỗi chỉ đơn giản là sai lệch.


1
Không thực sự sai lệch. Nó không thể kết nối với daemon docker. "là daemon đang chạy?" chỉ là một phỏng đoán.
Bratchley

2
sudo gpasswd -a alex
docker

1
sudo gpasswd -a $ Docker # Hoạt động cho bất kỳ tên người dùng nào
promsrb

Tôi đã làm điều này và nó vẫn không hoạt động. Chạy đã sudo systemctl start dockersửa nó, daemon thực sự không chạy ...
nakamin

32

Câu hỏi này đã được trả lời, nhưng đây là một phần thông tin bổ sung.

Bất kể bạn đang ở trên Arch hay một bản phân phối khác như Fedora hay Ubuntu, Docker sử dụng tệp ổ cắm để liên lạc. Khi bạn chạy dockercác lệnh, nó sử dụng ổ cắm này để nói chuyện với daemon Docker. Tất nhiên, trình nền phải chạy (và nó thường bị tắt theo mặc định), nhưng nếu người dùng của bạn không thể truy cập vào ổ cắm, thì nó cũng không thể giao tiếp với trình nền.

Trước tiên bạn sẽ cài đặt Docker từ kho lưu trữ của bản phân phối. Một số người tải xuống tập lệnh cài đặt và chuyển nó sang shell ( curl ... | sh), nhưng bạn nên cài đặt tập lệnh từ kho lưu trữ để có thể cập nhật dễ dàng.

Vòm:

# pacman -S docker

Fedora:

# dnf install docker

Như đã đề cập ở trên, daemon có thể bị tắt theo mặc định. Nếu bạn muốn sử dụng Docker, daemon phải được chạy.

Kích hoạt nó (vì vậy nó sẽ được bắt đầu khi khởi động):

# systemctl enable docker

Bắt đầu ngay bây giờ (hoặc khởi động lại):

# systemctl start docker

Bây giờ, theo mặc định (nếu thiếu nhóm docker), ổ cắm Docker được sở hữu bởi root:

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

Đây là lý do tại sao một người dùng thông thường không thể nói chuyện với daemon docker. Một người dùng thông thường không có đủ quyền truy cập vào ổ cắm. Nó không thể truy cập daemon, vì vậy nó giả sử nó không chạy và hiển thị lỗi này:Cannot connect to the Docker daemon. Is the docker daemon running on this host?

Đây là lý do tại sao nhiều người chỉ cần bắt đầu tất cả các lệnh Docker là root, sử dụng sudo. Nhưng như được mô tả trong câu trả lời khác, Docker có cơ chế riêng cho điều đó, vì vậy sử dụng sudo là không cần thiết.

Lý tưởng nhất, một nhóm được gọi dockerđược tạo khi cài đặt Docker. Tuy nhiên, nếu nhóm đó không tồn tại khi daemon được khởi động, tệp socket được sở hữu bởi root.

Trong một số trường hợp, nhóm đó từng có một tên khác, như dockerroottrên Fedora . Kiểm tra grep docker /etc/groupxem nếu có một nhóm như vậy trên hệ thống của bạn. Nếu bạn đã sử dụng nhóm đó (người dùng của bạn nằm trong nhóm đó), bạn sẽ cần định cấu hình Docker để sử dụng nhóm đó:

Trong /etc/sysconfig/docker, thêm -G dockerroot(lưu ý: đó là một cách giải quyết, không phải là giải pháp tốt nhất):

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

Sau khi khởi động lại daemon, người dùng của bạn sẽ có thể truy cập vào ổ cắm:

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

Nếu không, cách chính thức sẽ là sử dụng nhóm được gọi docker. Nếu nó tồn tại, Docker sẽ tự động sử dụng nó, tức là đặt nhóm của socket thành nhóm đó. Nếu nó không tồn tại, tất cả những gì bạn cần làm là tạo nó và khởi động lại daemon:

# groupadd docker
# systemctl restart docker

Tệp ổ cắm sẽ được sở hữu bởi nhóm đó:

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

Người dùng của bạn phải ở trong dockernhóm để có thể truy cập ổ cắm:

# usermod -aG docker (user)

Bạn có thể phải đăng xuất và đăng nhập lại (hoặc su - (user)), chạy idđể xem bạn có thuộc nhóm không.

Sau đó, bạn có thể sử dụng Docker mà không cần sudo / root:

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

Cuối cùng, một lời cảnh báo. Chỉ người dùng đáng tin cậy mới được phép kiểm soát trình nền Docker của bạn . Xem https://docs.docker.com/engine/security/security/ .
(Nhưng tất nhiên, điều tương tự cũng đúng với sudo - chỉ những người dùng đáng tin cậy mới nên ở trong wheelnhóm.)


1
Điều này dường như không trả lời câu hỏi ban đầu.
l0b0

4
@ l0b0: Chà, tôi muốn giải thích tại sao điều này xảy ra, hy vọng nó sẽ hữu ích cho ai đó. Lệnh usermod thêm người dùng vào nhóm được ẩn trong phần giữa của câu trả lời. Nếu bạn không thấy câu trả lời này hữu ích, hãy cho tôi biết để tôi có thể xóa nó.
basic6

4
Vâng, nó trả lời và giải thích giải pháp cho Arch.
kodeart

Tôi đã làm tất cả những điều này, và tôi vẫn gặp phải vấn đề được đề cập bởi OP. Không có bước nào liên quan đến sự cho phép đã giải quyết vấn đề.
mopsyd


1

Sau khi thực hiện một số nghiên cứu để giải quyết vấn đề này trên hệ thống Linux của tôi, tôi nghĩ rằng mình sẽ viết câu trả lời này. Đây là những gì tôi đã làm để khắc phục vấn đề.

Trên Fedora 22

Cài đặt Docker:

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

Sau khi cài đặt Docker:

Một người dùng cần phải được thêm vào nhóm docker.

$> sudo usermod -aG docker

Trình nền docker cần được bắt đầu

$> sudo service docker start

Bạn có thể thiết lập daemon để bắt đầu khi khởi động

$> sudo chkconfig docker on

Bạn có thể xác minh dịch vụ docker đang chạy

$> service docker status

Và một kiểm tra cuối cùng

$> docker run hello-world

+1 cho một ví dụ hoàn chỉnh, mặc dù nhiều lệnh trong số này không áp dụng được cho tình huống của tôi (cài đặt bằng cách sử dụng pacman, sử dụng systemctlthay vì service+ chkconfig).
l0b0

1

Nếu bạn đang sử dụng biến thể Fedora 23 hoặc Redhat chỉnh sửa /etc/sysconfig/dockervà sửa đổi các điều sau đây

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

Khởi động lại docker.

Hãy chắc chắn rằng bạn thêm nhóm này vào hệ thống và thêm chính mình vào nhóm.



1

Nếu bạn đã khởi động công cụ docker của mình với: sudo dịch vụ docker bắt đầu

bạn không thể kết nối với người dùng bình thường ngay cả khi bạn đã thêm chính mình vào nhóm 'docker'.

Bạn chỉ có thể dừng nó với: dừng dịch vụ sudo

và khởi động nó như một người dùng bình thường: docker dịch vụ bắt đầu


Tôi không phải thêm người dùng cho docker groupđến bây giờ. sudo service startđã làm cho tôi. HOwever, sẽ quan sát nếu có cái gì đó mới.
crazynetizen

0

Tôi cũng có vấn đề tương tự. Vấn đề là ở các socket được phân bổ cho docker-daemon và docker-client.

  1. Đầu tiên, quyền không được đặt cho docker-client trên docker.sock Bạn có thể đặt nó bằng cách sử dụng sudo usermod -aG docker $USER

  2. Sau đó kiểm tra tệp bash của bạn nơi docker-client đang chạy. Đối với tôi, nó được đặt thành 0.0.0.0:2375, trong khi docker-daemon đang chạy trên ổ cắm unix. (Nó được đặt trong tệp cấu hình của dockerd).

  3. Chỉ cần bình luận ra dòng vi phạm và nó sẽ hoạt động tốt.

  4. Nhưng nếu bạn muốn làm cho nó hoạt động trên cổng TCP thay vì ổ cắm unix, thì hãy thay đổi tệp cấu hình của dockerd, đặt nó thành 0.0.0.0.2375 và giữ dòng trong bash như hiện tại hoặc đặt thành 0,0. 0,0: 2375.


0

Đây là các bước tôi làm theo để sửa lỗi sau

$ docker info
Cannot connect to the Docker daemon at 
tcp://localhost:2375/usr/lib/systemd/system/docker.socket. Is the docker daemon running?
  1. Thêm bản thân của bạn vào nhóm docker

    usermod -aG docker $USER

  2. Sửa quyền trên docker socker và lệnh.

    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. Thêm biến vào môi trường cấu hình cho lệnh docker

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

  4. Phần còn lại Docker

    sudo systemctl restart docker

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.