Làm thế nào tôi có thể sử dụng docker mà không sudo?


767

Trên các trang tài liệu của Docker, tất cả các lệnh ví dụ được hiển thị mà không có sudo, như thế này:

docker ps

Trên Ubuntu, nhị phân được gọi docker.io. Nó cũng không hoạt động mà không có sudo:

sudo docker.io ps

Làm cách nào tôi có thể định cấu hình Docker để tôi không cần phải thêm tiền tố vào mỗi lệnh Docker bằng sudo?


1
Đừng quên bật ufw;)
Rinzwind

2
Trên Ubuntu 14.04 cũng 'Docker' nhị phân.
anatoly techtonik

@anatolytechtonik Tôi cũng đã sử dụng 'docker' thay vì 'docker.io' trong Ubuntu 14.04 LTS
Nabin

2
Cài đặt được khuyến nghị không phải là docker trong repos ubfox mặc định; thay vào đó, hướng dẫn ở đây ( docs.docker.com/engine/installation/linux/ubuntulinux ), khuyên bạn nên sử dụng repo docker . Xóa tất cả nội dung docker hiện có và xác minh bạn đang lấy từ nguồn đúng: apt-cache policy docker-engine(url apt nên từ dockerproject.org)
michael

2
Làm thế nào về một bí danh :? Bằng cách đó, bạn vẫn sử dụng sudo, với mật khẩu bảo vệ. alias docker = "sudo docker"
Andrej Panjkov 22/03/18

Câu trả lời:


1137

Tin tốt: docker mới (phiên bản 19.03 (hiện đang thử nghiệm)) sẽ có thể chạy rootless phủ nhận các vấn đề có thể xảy ra khi sử dụng người dùng root. Không còn gây rối với quyền nâng cao, root và bất cứ điều gì có thể mở máy của bạn khi bạn không muốn.

Video về điều này từ [DockerCon 2019] Làm cứng daemon Docker với chế độ Rootless

Một vài Caveats đến chế độ Docker không root

Các kỹ sư của Docker cho biết chế độ không root có thể được coi là sự thay thế cho bộ tính năng động cơ Docker hoàn chỉnh. Một số hạn chế đối với chế độ không root bao gồm:

  • kiểm soát tài nguyên cgroups, hồ sơ bảo mật apparmor, điểm kiểm tra / khôi phục, mạng lớp phủ, vv không hoạt động trên chế độ không root.
  • Các cổng tiếp xúc từ các container hiện yêu cầu quá trình trợ giúp xã hội thủ công.
  • Chỉ các bản phân phối dựa trên Ubuntu mới hỗ trợ các hệ thống tệp lớp phủ ở chế độ không root.
  • Chế độ không cần root hiện chỉ được cung cấp cho các bản dựng hàng đêm có thể không ổn định như bạn đã quen.

Kể từ docker 19.3, điều này đã lỗi thời (và nguy hiểm hơn mức cần thiết):

Các nhãn hiệu Docker có này để nói về nó:

Cho phép truy cập không root

Trình nền của docker luôn chạy như người dùng root và kể từ phiên bản Docker 0.5.2, trình nền của docker liên kết với một ổ cắm Unix thay vì cổng TCP. Theo mặc định, ổ cắm Unix được sở hữu bởi người dùng root và do đó, theo mặc định, bạn có thể truy cập nó bằng sudo.

Bắt đầu từ phiên bản 0.5.3, nếu bạn (hoặc trình cài đặt Docker của bạn) tạo một nhóm Unix có tên là docker và thêm người dùng vào nó, thì trình nền của docker sẽ làm cho quyền sở hữu ổ cắm Unix được đọc / ghi bởi nhóm docker khi trình nền bắt đầu . Trình nền của docker phải luôn luôn chạy như người dùng root, nhưng nếu bạn chạy ứng dụng khách docker với tư cách là người dùng trong nhóm docker thì bạn không cần thêm sudo vào tất cả các lệnh của máy khách. Kể từ 0.9.0, bạn có thể chỉ định rằng một nhóm không phải là docker nên sở hữu ổ cắm Unix với tùy chọn -G.

Cảnh báo: Nhóm docker (hoặc nhóm được chỉ định bằng -G) tương đương với root; xem chi tiết Docker Daemon Attack Surface và blogpost này về Tại sao chúng tôi không cho phép người dùng không root chạy Docker trong CentOS, Fedora hoặc RHEL (cảm ơn michael-n).

Trong bản phát hành gần đây của chế độ rootless thử nghiệm trên GitHub , các kỹ sư đề cập đến chế độ rootless cho phép chạy dockerd như một người dùng không có quyền, sử dụng user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Người dùng cần chạy dockerd-rootless.sh thay vì dockerd.

$ dockerd-rootless.sh --experimental

Vì chế độ Rootless là thử nghiệm, người dùng cần phải luôn chạy dockerd-rootless.sh với chương trìnhexexperimental.


Điều quan trọng cần đọc: các bước sau khi cài đặt cho Linux (nó cũng liên kết với các chi tiết Docker Daemon Attack Surface ).

Quản lý Docker với tư cách là người dùng không root

Trình nền của docker liên kết với một ổ cắm Unix thay vì cổng TCP. Theo mặc định, ổ cắm Unix được sở hữu bởi người dùng root và những người dùng khác chỉ có thể truy cập nó bằng sudo. Trình nền docker luôn chạy như người dùng root.

Nếu bạn không muốn sử dụng sudo khi bạn sử dụng lệnh docker, hãy tạo một nhóm Unix có tên là docker và thêm người dùng vào nó. Khi trình nền của docker khởi động, nó làm cho quyền sở hữu của ổ cắm Unix được đọc / ghi bởi nhóm docker.


  • Thêm nhóm docker nếu nó chưa tồn tại:

    sudo groupadd docker
    
  • Thêm người dùng được kết nối "$ USER" vào nhóm docker. Thay đổi tên người dùng để khớp với người dùng ưa thích của bạn nếu bạn không muốn sử dụng người dùng hiện tại của mình:

    sudo gpasswd -a $USER docker
    
  • Hoặc thực hiện newgrp dockerhoặc đăng xuất / đăng nhập để kích hoạt các thay đổi cho các nhóm.

  • Bạn có thể dùng

    docker run hello-world
    

    để kiểm tra xem bạn có thể chạy docker mà không cần sudo không.


3
Vâng, nhưng mọi quy trình đặc quyền đều mở ra tiềm năng khai thác. Là docker hook mà đi sâu vào hệ điều hành để thực sự bắt buộc mức độ đặc quyền đó?
mờ

3
newgrp dockerkhông làm việc cho tôi, tôi đã phải đăng xuất.
lolmaus - Andrey Mikhaylov

43
Thật đáng để chỉ ra rằng điều này mang lại cho người dùng quyền truy cập root không bị hạn chế, không được bảo vệ bằng mật khẩu . Xem chi tiết về lỗ hổng ở đây
Chris Foster

2
bạn KHÔNG cần phải khởi động lại trình nền docker để thay đổi này diễn ra !! chỉ cần có người dùng mà bạn vừa thêm đăng xuất rồi quay lại
Tommy

4
nếu bạn sử dụng docker login, bạn có thể thấy rằng .dockerthư mục được tạo trong thư mục nhà của bạn, thuộc về root. do đó bạn sẽ gặp cảnh báo này khi chạy các lệnh docker : WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Tôi đã tạo .dockerthư mục người dùng của mình có thể truy cập mà không cần sudo như vậy : sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. những chgrpkhông có vẻ để giúp mặc dù, vì vậy có lẽ tôi chỉ nên giới thiệu các bước chown.
Birchlabs

202

Để chạy lệnh docker mà không có sudo, bạn cần thêm người dùng của mình (người có quyền root) vào nhóm docker. Đối với lệnh này, hãy chạy lệnh sau:

 sudo usermod -aG docker $USER

Bây giờ, có người dùng đăng xuất sau đó đăng nhập lại. Giải pháp này được giải thích tốt ở đây với quá trình cài đặt thích hợp.


14
sau khi thêm người dùng vào nhóm, hãy chạy lệnh này: sg group_name -c "bash"
madjardi

4
bạn không cần phải khởi động lại hệ điều hành để thay đổi này diễn ra! Điều đó sẽ đánh bom tất cả các container đang chạy! Chỉ cần có người dùng mà bạn vừa thêm đăng xuất rồi đăng nhập.
Tommy

5
Lệnh đó khác với "sudo gpasswd -a $ {USER} docker" trong câu trả lời khác như thế nào? Nếu có ...
Ashley Aitken

9
Bạn có thể vui lòng thêm cảnh báo được đưa ra bởi các tài liệu: "Nhóm docker [...] tương đương với root", vì vậy mọi người có cơ hội nghĩ về nó
Murmel

2
Hiệu ứng tương tự như câu trả lời được chấp nhận 2 năm tuổi, nhưng không có cảnh báo về các rủi ro bảo mật
Gert van den Berg

57

Cơ chế mà việc thêm người dùng vào nhóm dockercấp quyền để chạy docker là để có quyền truy cập vào ổ cắm của docker tại /var/run/docker.sock. Nếu hệ thống tập tin chứa /var/runđược gắn với ACL được bật, điều này cũng có thể đạt được thông qua ACL.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Tôi chỉ bao gồm điều này cho sự hoàn chỉnh.

Nói chung, tôi khuyên bạn nên tránh ACL bất cứ khi nào có sẵn một lựa chọn thay thế tốt dựa trên các nhóm: Sẽ tốt hơn nếu các đặc quyền trong hệ thống có thể được hiểu bằng cách chỉ xem xét tư cách thành viên nhóm. Phải quét hệ thống tệp để tìm các mục ACL để hiểu các đặc quyền của hệ thống là một gánh nặng thêm cho kiểm toán bảo mật.

Cảnh báo 1 : Điều này có sự roottương đương với việc thêm usernamevào dockernhóm. Bạn vẫn có thể bắt đầu một container theo cách có rootquyền truy cập vào hệ thống tập tin máy chủ.

Cảnh báo 2 : ACL khó kiểm tra bảo mật hơn đáng kể so với bảo mật dựa trên nhóm. Có thể tránh ACL nếu có thể khi bạn có thể sử dụng các nhóm thay vào đó, ít nhất là trong các môi trường liên quan đến kiểm toán.


5
Nó hoạt động vào ngày 16.04
edib

Đây là những gì tôi cần, các câu trả lời khác, yêu cầu người dùng phải có quyền root. Cảm ơn làm nhiều!
Mrinal Saurabh

1
Cách tốt hơn nhiều imo. Docker nhóm là tương đương gốc và đó luôn là một dấu hiệu nguy hiểm. Và tôi không thấy bất kỳ bất lợi nào khi sở hữu một tập tin này.
Xerus

5
@Xerus nếu tôi hiểu chính xác, bất cứ ai có thể ghi vào ổ cắm này cũng có thể nhận được các đặc quyền tương đương với root . Vì vậy, cho phép ai đó truy cập vào ổ cắm này thông qua ACL có tác dụng bảo mật tương tự như thêm người đó vào nhóm docker.
Paŭlo Ebermann

1
Đã làm việc trên Linux Mint 19 cho tôi. Cảm ơn.
Chúng tôi là Borg
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.