แก้ปัญหาการอนุญาตสำหรับนักเทียบท่าใน Ubuntu ได้อย่างไร?


35

ผมได้ติดตั้งนักเทียบท่าตามที่อธิบายไว้ที่นี่ ผมใช้อูบุนตู Trusty 14.04 (LTS) (64 บิต) ทุกอย่างในระหว่างการติดตั้งเป็นไปด้วยดี คำสั่งยัง$ sudo docker run -i -t ubuntu /bin/bashสมบูรณ์ด้วยดี (หลังจากฉันพิมพ์ "exit" ในคอนโซลที่เปิด แต่เมื่อฉันพยายามทำอย่างอื่นฉันจะได้รับ "สิทธิ์ถูกปฏิเสธ" ตัวอย่างเช่น:

`$ sudo docker run -d -P training/webapp python app.py`

reuslts ใน Post http:///var/run/docker.sock/v1.12/containers/create: dial unix /var/run/docker.sock: permission denied

` docker info`

reuslts ใน Get http:///var/run/docker.sock/v1.12/info: dial unix /var/run/docker.sock: permission denied

วิธีแก้ปัญหานี้ ฉัน googled เกี่ยวกับปัญหา แต่ฉันไม่สามารถหาวิธีแก้ปัญหาสำหรับกรณีของฉัน

คำตอบ:


50

เพิ่มกลุ่มนักเทียบท่าหากยังไม่มีอยู่

$ sudo groupadd docker

เพิ่มผู้ใช้ที่เชื่อมต่อ${USER}กับกลุ่มนักเทียบท่า เปลี่ยนชื่อผู้ใช้เพื่อให้ตรงกับผู้ใช้ที่คุณต้องการ

$ sudo gpasswd -a ${USER} docker

รีสตาร์ท Docker daemon:

$ sudo service docker restart # Or docker.io for older versions
# 18.04+ with snap:
$ sudo systemctl restart snap.docker.dockerd

คุณควรออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่ออัพเดทการอนุญาตของกลุ่ม เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถสลับไปที่ subshell ได้ดังนี้ หรือใช้เทคนิคอื่น ๆ ที่กล่าวถึงในคำถามนี้ :

su - $USER

14
ฉันต้องรีบูทเพื่อให้สิ่งนี้มีผล
obsoleter

8
ไม่ต้องรีบู๊ตเพียงออกจากระบบและลงชื่อเข้าใช้
Ajay Gautam

2
ออกจากระบบมันแม้ว่าจะexec $SHELLไม่ได้ ฉันสนใจที่จะทราบว่ากลไกการออกจากระบบสามารถแก้ไขปัญหาได้อย่างไร นี่ไม่ใช่หน้าต่าง!
Darth Egregious

1
ใน Fedora อันดับแรกคุณต้องแก้ไข/etc/selinux/configและใส่SELINUX=disabledจากนั้นรีบูต Linux
Junior M

1
คำอธิบายที่ดี! คุณเก่งที่สุด! :)
ฟรานซิสโรดริเก

5

หากคุณใช้งาน CentOS หรือ RedHat คุณอาจต้องปิดการใช้งาน SELinux ก่อนโดยเรียกใช้:

setenforce 0

Eiter รีสตาร์ทหลังจากนั้นก็จะ reenable SELinux setenforce 1หรือเรียกใช้


4

ฉันมีปัญหาเดียวกันเนื่องจาก selinux คุณสามารถตรวจสอบว่า selinux เป็นผู้กระทำผิดโดย:

  1. ปิดการใช้งาน selinux: setenforce 0
  2. ลองใหม่

หากการปิดใช้งาน selinux แก้ปัญหาของคุณได้ก็ไม่มีเหตุผลที่จะปล่อยให้ปิดการใช้งาน:

  1. เปิดใช้งาน selinux: setenforce 1
  2. อนุญาตการเชื่อมต่อซ็อกเก็ตในการกำหนดค่า selinux: setsebool docker_connect_any true
  3. เรียกใช้คอนเทนเนอร์นักเทียบท่าของคุณด้วย--priviledgedตัวเลือก

3

ฉันสมมติว่าชื่อผู้ใช้ของคุณอยู่ในกลุ่มนักเทียบท่าอยู่แล้ว เพื่อตรวจสอบนี้ออกคำสั่งด้านล่าง

id -nG

หากไม่ต้องการเพิ่มผู้ใช้ของคุณในกลุ่มนักเทียบท่าโดยใช้คำสั่งด้านล่าง

sudo groupadd docker
sudo usermod -aG docker $USER

เมื่อคุณรันคำสั่งsudo systemctl start dockerมันจะสร้างกระบวนการนักเทียบท่า กระบวนการตัวเทียบท่านั้นมีdockerdเธรด daemon คำสั่งยังสร้างdocker.sockซ็อกเก็ต Unix ที่เป็นค่าเริ่มต้น docker.sockซ็อกเก็ตได้ฟังอย่างต่อเนื่องโดยdockerdด้ายภูต สิ่งนี้ทำให้คุณสามารถทำ IPC ระดับเคอร์เนลด้วยdocker.pidกระบวนการ เพื่อให้สามารถใช้ซ็อกเก็ตนักเทียบท่านี้คุณต้องได้รับอนุญาตจากระดับกระบวนการ ( docker.pid) และระดับไฟล์ ( docker.sock) ที่เหมาะสม ดังนั้นการรันคำสั่งสองคำสั่งด้านล่างควรแก้ปัญหาของคุณ sudo chmod a+rwx /var/run/docker.sock # You can provide just execute permission sudo chmod a+rwx /var/run/docker.pid


1

โดยรุ่นปัจจุบันdockerเราไม่จำเป็นต้องเพิ่มกลุ่ม
มันมีอยู่โดยอัตโนมัติจากการติดตั้ง คุณสามารถตรวจสอบโดยใช้คำสั่ง:

$ sudo groupadd docker
groupadd: group 'docker' already exists

ดังนั้นเพื่อจัดการนักเทียบท่าในฐานะผู้ใช้ที่ไม่ใช่รูทเพียงแค่เพิ่มผู้ใช้ของคุณไปยังกลุ่มนักเทียบท่าจากนั้นออกจากระบบและลงชื่อเข้าใช้อีกครั้งเพื่อให้ความเป็นสมาชิกกลุ่มของคุณได้รับการประเมินอีกครั้ง:

$ sudo usermod -aG docker $USER
$ logout

เพื่อตรวจสอบเมื่อคุณกลับเข้าสู่ระบบ

$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

คุณอาจบังคับให้ใช้GROUP:dockerเป็นกลุ่มหลักใหม่ของคุณ:

$ sudo chown "$USER":"docker" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "$HOME/.docker" -R
$ sudo usermod -g docker ${USER}
$ logout

เพื่อตรวจสอบเมื่อคุณกลับเข้าสู่ระบบ

$ id
uid=1001(<user_name>) gid=999(docker) groups=999(docker),...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.