Cách sửa lỗi docker: Có sự cho phép bị từ chối


303

Tôi đã cài đặt Docker trong máy của mình, nơi tôi có hệ điều hành Ubuntu. Sau khi tôi cài đặt docker, khi tôi chạy

sudo docker run hello-world

Tất cả đều ổn, nhưng tôi muốn ẩn từ sudođể rút ngắn lệnh hơn.

Nếu tôi viết lệnh mà không có từ sudo

docker run hello-world

Hiển thị như sau:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.35/containers/create: dial unix /var/run/docker.sock: connect: permission denied.See 'docker run --help'.

Nó đã xảy ra tương tự khi tôi cố gắng thực hiện

docker-compose up

Làm thế nào tôi có thể giải quyết điều này?



Câu trả lời:


439

Nếu bạn muốn chạy docker với tư cách là người dùng không root thì bạn cần thêm nó vào nhóm docker.

  1. Tạo nhóm docker nếu nó không tồn tại
$ sudo groupadd docker
  1. Thêm người dùng của bạn vào nhóm docker.
$ sudo usermod -aG docker $USER
  1. Chạy lệnh sau hoặc Đăng xuất và đăng nhập lại và chạy (điều đó không hoạt động bạn có thể cần phải khởi động lại máy trước)
$ newgrp docker
  1. Kiểm tra xem docker có thể chạy mà không cần root
$ docker run hello-world

Lấy từ tài liệu chính thức của docker: Manage-docker-as-a-non-root-user


70
Tôi vẫn gặp vấn đề này sau khi thực hiện cả ba bước "(
Anand

78
Tôi đã phải khởi động lại trên Ubuntu 18 để nó hoạt động - chỉ cần đăng xuất và đăng nhập lại không hoạt động.
heez

26
@heez có thể không cần khởi động lại, khởi động lại docker là đủ cho tôi. sudo systemctl restart docker
Rigs

5
Xin lưu ý rằng dockervề cơ bản trong nhóm cấp quyền truy cập root , mà không thực thi chính sách sudo thường xuyên & kiểm toán. Xem vấn đề GitHub # 9976 để biết chi tiết và thảo luận.
raehik

13
Khởi động lại docker không hiệu quả với tôi, chỉ khởi động lại mới làm được (Ubuntu 18.04)
Joakim Tall

360

Sau khi nâng cấp, tôi đã bị từ chối. Thực hiện các bước của các bước cài đặt bài đăng 'mkb' không thay đổi bất cứ điều gì vì người dùng của tôi đã ở trong nhóm 'docker'; Tôi thử lại - nó hai lần bất kỳ cách nào mà không thành công.

Sau một giờ tìm kiếm, giải pháp cuối cùng này đã có hiệu quả:

sudo chmod 666 /var/run/docker.sock

Giải pháp đến từ Olshansk .

Có vẻ như bản nâng cấp đã tạo lại ổ cắm mà không có đủ quyền cho nhóm 'docker'.

Các vấn đề

Lỗ bảo mật mở chmod cứng này và sau mỗi lần khởi động lại, lỗi này bắt đầu lại nhiều lần và bạn phải thực hiện lại lệnh trên mỗi lần. Tôi muốn một giải pháp một lần và mãi mãi. Cho rằng bạn có hai vấn đề:

  • 1) Vấn đề vớiSystemD : Ổ cắm sẽ chỉ được tạo với chủ sở hữu 'root' và nhóm 'root'.

    Bạn có thể kiểm tra vấn đề đầu tiên này bằng lệnh này:

    ls -l /lib/systemd/system/docker.socket
    

    Nếu mọi thứ đều tốt, bạn sẽ thấy ' root/docker' không ' root/root'.

  • 2) Sự cố với Đăng nhập đồ họa : /superuser/1348196/why-my-linux-account-only-belongs-to-one-group

    Bạn có thể kiểm tra vấn đề thứ hai này bằng lệnh này:

    groups
    

    Nếu mọi thứ đều chính xác, bạn sẽ thấy nhóm docker trong danh sách. Nếu không thử lệnh

    sudo su $USER  -c groups
    

    Nếu bạn thấy thì nhóm docker là do lỗi.

Các giải pháp

Nếu bạn quản lý để có một cách giải quyết cho đăng nhập đồ họa, điều này sẽ thực hiện công việc:

sudo chgrp docker /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Nhưng nếu bạn không thể quản lý lỗi này, một giải pháp không tồi có thể là:

sudo chgrp $USER /lib/systemd/system/docker.socket
sudo chmod g+w /lib/systemd/system/docker.socket

Điều này hoạt động vì bạn đang ở trong một môi trường đồ họa và có lẽ là người dùng duy nhất trên máy tính của bạn. Trong cả hai trường hợp, bạn cần khởi động lại (hoặc một sudo chmod 666 /var/run/docker.sock)


2
nếu docker đã được cài đặt theo doc trên docs.docker.com/install thì bạn không bao giờ cần phải xử lý bất kỳ lệnh nào như vậy
Scott Stensland

4
@Scott Stensland Tôi đã cài đặt docker nhiều lần 'theo tài liệu'. Tôi nghĩ vấn đề đến từ một tương tác xấu với một gói không xác định khác.
Galigator

1
Trong docker-in-docker, tôi đã cài đặt không chính xác /var/run/docker.sock từ máy chủ mà không có :rokết thúc ... ngay khi tôi nói thêm rằng tôi rất tốt để đi
jakebrinkmann

2
Tôi sử dụng Ubuntu 18 trên EC2 - AWS và hoàn toàn hoạt động. Tất cả những thứ khác (sudo usermod -aG docker $ USER và những thứ khác) không hoạt động
cherah30

1
Cảm ơn, nó đã sửa trong Ubuntu 18.04 LTS. nghỉ ngơi và thêm vào nhóm không
Deepansh Parmani

32
  1. Thêm nhóm docker
$ sudo groupadd docker
  1. Thêm người dùng hiện tại của bạn vào nhóm docker
$ sudo usermod -aG docker $USER
  1. Chuyển phiên sang nhóm docker
$ newgrp - docker
  1. Chạy một ví dụ để kiểm tra
$ docker run hello-world

Các newgrplệnh nhắc nhở cho một mật khẩu và không chấp nhận mật khẩu của tôi sử dụng. Thay vào đó su - $USERlàm việc để tránh đăng xuất / đăng nhập.
bluenote10 ngày

18
  1. Thêm người dùng hiện tại vào dockernhóm
sudo usermod -aG docker $USER
  1. Thay đổi quyền của ổ cắm docker để có thể kết nối với daemon docker /var/run/docker.sock
sudo chmod 666 /var/run/docker.sock

15

Tôi giải quyết lỗi này bằng lệnh:

$ sudo chmod 666 /var/run/docker.sock

9

Bạn luôn có thể thử Manage Docker as a non-root userđoạn văn trong https://docs.docker.com/install/linux/linux-postinstall/ docs.

Sau khi làm điều này cũng nếu vấn đề vẫn còn thì bạn có thể chạy lệnh sau để giải quyết nó:

sudo chmod 666 /var/run/docker.sock

2
Làm cho ổ cắm docker có thể đọc hoặc ghi được cho mọi người (với chmod 666) là một thảm họa bảo mật ... Điều này không bao giờ nên được khuyến nghị.
Aayla Secura

6

Đã bị từ chối trong khi cố gắng kết nối với ổ cắm Docker daemon tại unix: ///var/run/docker.sock: Nhận http: //%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json : quay số unix /var/run/docker.sock: kết nối: quyền bị từ chối

sudo chmod 666 /var/run/docker.sock

Điều này khắc phục vấn đề của tôi.


2

Để khắc phục sự cố đó, tôi đã tìm kiếm nơi cài đặt docker và docker-compose của tôi. Trong trường hợp của tôi, dockerđã được cài đặt /usr/bin/dockerdocker-composeđược cài đặt trong /usr/local/bin/docker-composeđường dẫn. Sau đó, tôi viết điều này trong thiết bị đầu cuối của tôi:

Để cập bến:

sudo chmod +x /usr/bin/docker

Tới docker-compose:

sudo chmod +x /usr/local/bin/docker-compose

Bây giờ tôi không cần viết vào lệnh của tôi docker từ sudo

/ ****** / 4/4/4/4/4/4/4 ****** / TÌM HIỂU

LRI

Giải pháp tốt nhất cho vấn đề này được bình luận bởi @mkasberg. Tôi trích dẫn bình luận:

That might work, you might run into issues down the road. Also, it's a security vulnerability. You'd be better off just adding yourself to the docker group, as the docs say. sudo groupadd docker, sudo usermod -aG docker $USER. Docs: https://docs.docker.com/install/linux/linux-postinstall/

Cảm ơn rất nhiều!


2
Điều đó có thể làm việc, bạn có thể gặp vấn đề trên đường. Ngoài ra, đó là một lỗ hổng bảo mật. Bạn nên tốt hơn là chỉ cần thêm bản thân vào dockernhóm, như các tài liệu nói. sudo groupadd docker, sudo usermod -aG docker $USER.
mkasberg

Này @mkasberg! Cám ơn bạn đã góp ý! Tôi đã nghiền một lỗi để trích dẫn giải pháp của bạn. Cảm ơn rất nhiều!
Carlos Andres

1

lightdm và kwallet tàu với một lỗi dường như không vượt qua các nhóm bổ sung khi đăng nhập. Để giải quyết điều này, tôi cũng, bên cạnh sudo usermod -aG docker $USER, đã phải bình luận ra

auth optional pam_kwallet.so
auth optional pam_kwallet5.so

đến

#auth optional pam_kwallet.so
#auth optional pam_kwallet5.so

trong /etc/pam.d/lightdm trước khi khởi động lại , để nhóm docker thực sự có hiệu lực.

lỗi: https://bugs.launchpad.net/lightdm/+orms/1781418 và tại đây: https://ormszilla.redhat.com/show_orms.cgi?id=1581495


1

sử dụng lệnh này

sudo usermod -aG docker $USER

Sau đó khởi động lại máy tính của bạn, điều này làm việc cho tôi.


1

Nghiêm túc nhé các bạn. Không thêm Docker trong các nhóm của bạn hoặc sửa đổi vị trí của socket (không có Selinux cứng), đó là một cách đơn giản để tạo một root prive. Chỉ cần thêm một bí danh trong .bashrc của bạn, nó đơn giản và an toàn hơn như: alias dc = 'sudo docker'.


1

bạn có thể làm theo các bước sau và điều này sẽ làm việc cho bạn:

  1. tạo một nhóm docker sudo groupadd docker
  2. thêm người dùng của bạn vào nhóm này sudo usermod -aG docker $USER
  3. liệt kê các nhóm để đảm bảo rằng nhóm docker được tạo thành công bằng cách chạy lệnh này groups
  4. cũng chạy lệnh sau để thay đổi phiên cho nhóm docker newgrp docker
  5. thay đổi quyền sở hữu nhóm cho tập tin docker.socksudo chown root:docker /var/run/docker.sock
  6. thay đổi quyền sở hữu cho thư mục .docker sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
  7. cuối cùng sudo chmod g+rwx "$HOME/.docker" -R

Sau bài kiểm tra đó bạn có thể chạy docker ps -a


Tôi muốn một câu trả lời không yêu cầu khởi động lại. Đây là câu trả lời duy nhất cung cấp rằng. "Bí quyết" là chowntập tin docker.sock.
Potherca

1

Sau khi bạn cài đặt docker, hãy tạo nhóm 'docker' và thêm người dùng vào nó, chỉnh sửa tệp đơn vị dịch vụ docker:

sudo nano /usr/lib/systemd/system/docker.service

Thêm hai dòng vào phần [Dịch vụ]:

SupplementaryGroups=docker    
ExecStartPost=/bin/chmod 666 /var/run/docker.sock

Lưu tệp (Ctrl-X, y, Enter)

Chạy và kích hoạt dịch vụ Docker:

sudo systemctl daemon-reload
sudo systemctl start docker
sudo systemctl enable docker

0

Sau khi cài đặt Docker trên Centos. Trong khi chạy lệnh dưới tôi đã nhận được lỗi dưới đây.

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.soc k/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

Thay đổi nhóm và quyền cho docker.socket

[centos@aiops-dev-cassandra3 ~]$ ls -l /lib/systemd/system/docker.socket
-rw-r--r--. 1 root root 197 Nov 13 07:25 /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chgrp docker /lib/systemd/system/docker.socket
[centos@aiops-dev-cassandra3 ~]$ sudo chmod 666 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$ ls -lrth /var/run/docker.sock
srw-rw-rw-. 1 root docker 0 Nov 20 11:59 /var/run/docker.sock
[centos@aiops-dev-cassandra3 ~]$

Xác minh bằng cách sử dụng lệnh docker bên dưới

[centos@aiops-dev-cassandra3 ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

[centos@aiops-dev-cassandra3 ~]$

-4

sudo chmod 666 /var/run/docker.sock

điều này đã giúp tôi trong khi tôi gặp lỗi ngay cả khi đăng nhập vào docker Nhưng bây giờ nó hoạt động hoàn toàn tốt trong hệ thống của tôi.


1
Nó rất không an toàn để sử dụng phương pháp này. Xem lại hướng dẫn sau khi cài đặt được cung cấp trên các bình luận trong câu hỏi chính.
Alejandro Visiedo García
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.