sudo없이 어떻게 docker를 사용할 수 있습니까?


767

Docker의 설명서 페이지에서 모든 예제 명령은 다음과 같이없이 ​​표시됩니다 sudo.

docker ps

우분투에서 바이너리는이라고 불립니다 docker.io. sudo가 없으면 작동하지 않습니다.

sudo docker.io ps

모든 Docker 명령 앞에 sudo를 붙일 필요가 없도록 Docker를 구성하는 방법은 무엇입니까?


1
ufw를 활성화하는 것을 잊지 마십시오;)
Rinzwind

2
우분투 14.04 에는 'docker'바이너리도 있습니다.
anatoly techtonik

@anatolytechtonik 우분투 14.04 LTS에서 'docker.io'대신 'docker'도 사용했습니다.
Nabin

2
권장 설치는 기본 우분투 저장소의도 커가 아닙니다 . 대신 여기의 지시 사항 ( docs.docker.com/engine/installation/linux/ubuntulinux )은 docker repo를 사용하는 것이 좋습니다. 기존 도커를 모두 제거하고 올바른 소스 apt-cache policy docker-engine에서 도커를 가져 왔는지 확인하십시오. (apt url은 dockerproject.org에서 가져와야 함)
michael

2
별명은 어떻습니까? 그렇게하면 암호 보호 기능을 갖춘 sudo를 계속 사용할 수 있습니다. alias docker = "sudo docker"
Andrej Panjkov

답변:


1137

좋은 소식 : 새로운 도커 (버전 19.03 (현재 실험용))는 루트 사용자를 사용하여 발생할 수있는 문제를 무시하면서 루트없이 실행할 수 있습니다. 더 이상 높은 권한, 루트 및 원하지 않을 때 컴퓨터를 열 수있는 모든 것을 망칠 필요가 없습니다.

이에 대한 비디오 [DockerCon 2019] 루트없는 모드로 Docker 데몬 강화

루트없는 도커 모드에 대한 몇 가지주의 사항

도커 엔지니어들은 루트리스 모드는 전체 도커 엔진 기능을 대체 할 수 없다고 말합니다. 루트없는 모드에 대한 일부 제한 사항은 다음과 같습니다.

  • cgroups 리소스 제어, 의류 보안 프로필, 검사 점 / 복원, 오버레이 네트워크 등은 루트없는 모드에서 작동하지 않습니다.
  • 컨테이너에서 포트를 노출하려면 현재 수동 socat 도우미 프로세스가 필요합니다.
  • 우분투 기반 배포판 만 루트없는 모드에서 오버레이 파일 시스템을 지원합니다.
  • 루트없는 모드는 현재 익숙하지 않은 야간 빌드에만 제공됩니다.

docker 19.3 현재 이것은 더 이상 사용되지 않으며 필요 이상으로 위험합니다.

고정 표시기 설명서는 그것에 대해 말을이있다 :

비 루트 액세스 제공

docker 데몬은 항상 루트 사용자로 실행되며 Docker 버전 0.5.2부터 docker 데몬은 TCP 포트 대신 Unix 소켓에 바인딩됩니다. 기본적으로 Unix 소켓은 사용자 루트가 소유하므로 기본적으로 sudo를 사용하여 액세스 할 수 있습니다.

버전 0.5.3부터, (또는 Docker 설치 프로그램)이 docker라는 Unix 그룹을 생성하고 여기에 사용자를 추가하면, docker 데몬은 데몬이 시작될 때 docker 그룹이 Unix 소켓의 소유권을 읽고 쓸 수있게합니다. . docker 데몬은 항상 루트 사용자로 실행해야하지만 docker 그룹의 사용자로 docker 클라이언트를 실행하면 모든 클라이언트 명령에 sudo를 추가 할 필요가 없습니다. 0.9.0부터 docker 이외의 그룹이 -G 옵션을 사용하여 Unix 소켓을 소유하도록 지정할 수 있습니다.

경고 : 도커 그룹 (또는 -G로 지정된 그룹)은 루트와 동일합니다. Docker Daemon Attack Surface 세부 정보루트가 아닌 사용자가 CentOS, Fedora 또는 RHEL에서 Docker를 실행하지 못하게 하는 이유 (michael-n 덕분 에)에 대한이 블로그 게시물을 참조하십시오 .

GitHub실험적 루트없는 모드 의 최근 릴리스 에서 엔지니어는 루트없는 모드를 사용하면 user_namespaces (7), mount_namespaces (7), network_namespaces (7)를 사용하여 권한이없는 사용자로 dockerd를 실행할 수 있습니다.

사용자는 dockerd 대신 dockerd-rootless.sh를 실행해야합니다.

$ dockerd-rootless.sh --experimental

루트없는 모드는 실험적이므로 사용자는 항상 –experimental과 함께 dockerd-rootless.sh를 실행해야합니다.


읽어야 할 중요한 사항 : Linux 설치 후 단계 ( Docker Daemon Attack Surface 세부 정보 링크 )

루트가 아닌 사용자로 Docker 관리

docker 데몬은 TCP 포트 대신 Unix 소켓에 바인딩됩니다. 기본적으로 Unix 소켓은 사용자 루트가 소유하고 다른 사용자는 sudo를 통해서만 액세스 할 수 있습니다. docker 데몬은 항상 루트 사용자로 실행됩니다.

docker 명령을 사용할 때 sudo를 사용하지 않으려면 docker라는 Unix 그룹을 만들고 사용자를 추가하십시오. docker 데몬이 시작되면 docker 그룹에서 Unix 소켓의 소유권을 읽고 쓸 수 있습니다.


  • 도커 그룹이 없으면 추가하십시오.

    sudo groupadd docker
    
  • 연결된 사용자 "$ USER"를 docker 그룹에 추가하십시오. 현재 사용자를 사용하지 않으려면 원하는 사용자와 일치하도록 사용자 이름을 변경하십시오.

    sudo gpasswd -a $USER docker
    
  • newgrp docker그룹 변경 사항을 활성화하려면 a 또는 로그 아웃 / 로그인을 수행하십시오 .

  • 당신이 사용할 수있는

    docker run hello-world
    

    sudo없이 docker를 실행할 수 있는지 확인하십시오.


3
그러나 모든 특권 프로세스는 악용 가능성을 열어줍니다. 도 커가 운영 체제에 깊이 빠져 들어 해당 수준의 권한을 실제로 부여합니까?
matt

3
newgrp docker나를 위해 일하지 않았다, 나는 로그 아웃했다.
lolmaus-Andrey Mikhaylov 19

43
이것은 사용자에게 비 암호로 보호되는 루트 액세스 권한을 부여한다는 점을 지적 할 가치가 있습니다 . 취약성
Chris Foster

2
이 변경 사항을 적용하기 위해 docker 데몬을 다시 시작할 필요가 없습니다! 방금 추가 한 사용자에게 로그 아웃 한 다음 다시 로그인하십시오.
Tommy

4
을 사용 docker login하면 .docker홈 폴더에 생성 된 폴더가에 속할 수 root있습니다. 따라서 docker 명령을 실행할 때이 경고가 발생합니다 WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. 다음 .docker과 같이 sudo없이 사용자의 폴더에 액세스 할 수있게했습니다 sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. 는 chgrp하지만 도움이 보이지 않았다, 그래서 아마 난 단지 chown 시스템 단계를 추천한다.
Birchlabs

202

로 docker 명령을 실행하려면 sudo루트 권한이있는 사용자를 docker 그룹에 추가해야합니다. 이를 위해 다음 명령을 실행하십시오.

 sudo usermod -aG docker $USER

이제 사용자가 로그 아웃 한 후 다시 로그인하십시오. 이 솔루션은 올바른 설치 프로세스로 여기에 잘 설명되어 있습니다 .


14
group에 사용자를 추가 한 후 다음 명령을 실행하십시오. sg group_name -c "bash"
madjardi

4
이 변경 사항을 적용하기 위해 OS를 다시 시작할 필요는 없습니다! 그것은 모든 실행중인 컨테이너를 폭파시킬 것입니다! 방금 추가 한 사용자에게 로그 아웃 한 다음에 로그인하십시오.
Tommy

5
그 대답은 다른 답변에서 "sudo gpasswd -a $ {USER} docker"와 어떻게 다릅니 까? 만약에 ...
Ashley Aitken

9
문서에서 제공하는 경고를 추가해 주시겠습니까? "도커 그룹 [...]은 루트와 동일합니다."따라서 사람들은 그것에 대해 생각할 기회가 있습니다.
Murmel

2
2 년 전의 답변과 동일한 효과이지만 보안 위험에 대한 경고는 없습니다.
Gert van den Berg

57

사용자를 그룹에 추가하여 dockerdocker를 실행할 수있는 권한을 부여 하는 메커니즘 은에서 docker 소켓에 액세스하는 것 /var/run/docker.sock입니다. 포함 된 파일 시스템이 /var/runACL이 활성화 된 상태로 마운트 된 경우 ACL을 통해이를 달성 할 수도 있습니다.

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

나는 완전성을 위해 이것을 포함하고 있습니다.

일반적으로 그룹 기반의 적절한 대안을 사용할 수있을 때마다 ACL을 사용하지 않는 것이 좋습니다. 그룹 구성원 만보고 시스템의 권한을 이해할 수있는 것이 좋습니다. 시스템 권한을 이해하기 위해 파일 시스템에서 ACL 항목을 스캔해야하는 것은 보안 감사에 대한 추가 부담입니다.

경고 1 : 그룹에 root추가 하는 것과 동일 username합니다 docker. root호스트 파일 시스템에 액세스 할 수 있는 방식으로 컨테이너를 시작할 수 있습니다 .

경고 2 : ACL은 그룹 기반 보안보다 보안 감사에 훨씬 더 어렵습니다. 감사 관련 환경에서 그룹을 대신 사용할 수있는 경우 가능하면 ACL을 피하십시오.


5
그것은 16.04에서 근무했다
edib

이것은 내가 필요한 것입니다. 다른 대답은 사용자에게 루트 권한이 필요합니다. 고마워요!
Mrinal Saurabh

1
훨씬 더 나은 방법입니다. 그룹 도커는 루트와 동일하며 항상 위험의 징후입니다. 그리고 나는이 하나의 파일을 소유하는 데 아무런 단점이 없습니다.
Xerus

5
@Xerus 내가 올바르게 이해 하면이 소켓에 쓸 수있는 사람은 루트와 동등한 권한을 얻을 수 있습니다 . 따라서 ACL을 통해 누군가에게이 소켓에 대한 액세스 권한을 부여하면 해당 사용자를 도커 그룹에 추가하는 것과 동일한 보안 효과가 있습니다.
Paŭlo Ebermann

1
나를 위해 Linux Mint 19에서 일했습니다. 감사.
우리는 Borg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.