Docker 컨테이너 내부의 루트 비밀번호


265

USER 명령을 사용하여 빌드 된 Docker 이미지를 루트가 아닌 사용자를 사용하고 dev있습니다. 컨테이너 내에서 "dev"이지만 /etc/hosts파일 을 편집하고 싶습니다 .

그래서 나는 뿌리가되어야합니다. su 명령을 시도하고 있지만 루트 암호를 입력하라는 메시지가 표시됩니다.

Docker 컨테이너 내부의 기본 루트 사용자 비밀번호는 무엇입니까?


11
그냥 루트로 실행하십시오 : docker exec -u 0 -it mycontainer bash. ( H6의 답변 참조 )
Sławomir Lenart

답변:


494

-u옵션 을 사용할 때 제공된 기본 사용자 대신 루트 사용자 (ID = 0)를 사용하여 Docker 컨테이너에 로그인 할 수 있습니다 . 예 :

docker exec -u 0 -it mycontainer bash

루트 (id = 0)는 컨테이너 내의 기본 사용자입니다. 이미지 개발자는 추가 사용자를 만들 수 있습니다. 해당 사용자는 이름으로 액세스 할 수 있습니다. 숫자 ID를 전달할 때 사용자는 컨테이너에 없어도됩니다.

Docker 설명서에서


5
위의 쉼표를 입력 할 때 mycontainer가 필요하고 실행 중임을 지정하는 것이 좋습니다. 하나는 mycontainer와 다른 하나는이 명령에 사용되는 두 가지 터미널을 사용하여 작동합니다. 그렇지 않으면 mycontainer가 분리 된 상태로 실행되고 있어야합니다.
nicolimo86

6
이미지 사용docker run -u 0 -it mycontainer bash
Pavel 'PK'Kaminsky

2
이것은 정답 일 것입니다
D Pinto

1
@ High6, "Docker 이미지에 로그인 할 수 있습니다 ..."라고 말하면 "Docker 컨테이너에 로그인 할 수 있습니다"라는 뜻 입니다.
lmiguelvargasf 2016 년

이것이 항상 가능합니까? 아니면 이것을 막을 수 있습니까?
샘 토마스

82

결국 Docker 이미지를 다시 작성하기로 결정하여 내가 아는 것으로 루트 암호를 변경했습니다.

RUN echo 'root:Docker!' | chpasswd

또는

RUN echo 'Docker!' | passwd --stdin root 

5
나는 이것을 시도했지만 CentOS 6 기반 도커에서는 작동하지 않습니다. 이 명령은 CentOS 기반 도커에서 작동합니까?
Dragan Nikolic

28

몇 가지 방법이 있습니다.

  1. Docker를 실행하여 USER 설정을 재정의하려면

    docker exec -u 0 -it containerName bash
    

또는

docker exec -u root -it --workdir / <containerName> bash
  1. Docker 파일에서 이미지를 빌드하는 동안 필요한 파일 권한 등을 만드십시오.

  2. Linux 패키지에서 모든 패키지를 사용할 수있는 chpasswd경우 USER 유틸리티 앞의 dockerfile에서



23

아래 명령으로 작동시킬 수 있습니다.

root@gitnew:# docker exec -it --user $(username) $(containername) /bin/bash

18

컨테이너에서 권한이없는 사용자로 실행 중이기 때문에 루트로 전환 할 수 없다는이 문제가있었습니다.

그러나 이전 답변에서 제안한대로 새 이미지를 다시 만들고 싶지 않았습니다.

대신 'nsenter'를 사용하여 루트로 컨테이너에 액세스 할 수 있음을 발견했습니다. https://github.com/jpetazzo/nsenter

먼저 호스트에서 컨테이너의 PID를 결정하십시오.

docker inspect --format {{.State.Pid}} <container_name_or_ID>

그런 다음 nsenter를 사용하여 루트로 컨테이너를 입력하십시오.

nsenter --target <PID> --mount --uts --ipc --net --pid

1
boot2docker를 사용하여 다음을 사용해야했습니다.sudo nsenter --target <PID> --mount --uts --ipc --net --pid
peater

예, 좋은 지적입니다. 도커 명령을 실행하려면 일반적으로 루트 권한이 필요하며 nsenter가 동일하다고 생각합니다. 나는 내 대답에서 이것을 완전히 명확하게하지 않았다.
Richard Corfield 2016 년

4
이 답변이 작성되었으므로 docker는 기본적으로 nsenter와 동일하지만 더 쉽고 깔끔하게 exec 명령을 추가했습니다. 검색을 통해이 질문을 찾는 사람들을위한 데이터 포인트 일뿐입니다. 명령은 "docker exec -it <containername> <command>"입니다 (명령은 보통 / bin / bash이지만 원하는대로 수행 할 수 있습니다).
Kevin Keane

또한 docker는 호스트 (및 resolv.conf)에 대한 특별한 치료법을 가지고 있습니다. 수동으로 편집해서는 안됩니다. docker는 연결된 컨테이너 등을 반영하기 위해 모든 시작에서 / etc / hosts를 다시 만듭니다.
Kevin Keane


9

실행중인 컨테이너의 쉘을 가져오고 루트 비밀번호를 변경하십시오.

docker exec -it <MyContainer> bash

root@MyContainer:/# passwd
Enter new UNIX password:
Retype new UNIX password:

9

실행중인 컨테이너에서 루트 비밀번호를 만들거나 변경하려면

docker exec -itu root {containerName} passwd

5

비밀번호는 'ubuntu'사용자의 경우 'ubuntu'입니다 (적어도 우분투의 경우 docker : 14.04.03).

NB : 컨테이너를 시작한 후에 'ubuntu'가 생성되므로, 이렇게하면 :

 docker run -i -t --entrypoint /bin/bash  ubuntu     

루트 프롬프트가 바로 나타납니다. 여기에서 root의 비밀번호 변경을 강제로 수행하고 컨테이너를 커밋하고 선택적으로 다음과 같이 ubuntu : latest에 -f를 사용하여 태그를 지정할 수 있습니다.

root@ec384466fbbb:~# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@ec384466fbbb:~# exit

% docker commit ec3844
5d3c03e7d6d861ce519fe33b184cd477b8ad03247ffe19b2a57d3f0992d71bca

docker tag -f 5d3c ubuntu:latest

ubuntu : latest에 대한 최종 종속성을 다시 작성해야합니다.


3

--add-host NAME:IP컨테이너를 시작할 때 docker run에 인수를 제공하는 것이 더 나은 해결책이라고 제안합니다 . /etc/hosts/루트가 될 필요없이 파일을 업데이트합니다 .

그렇지 않으면에 플래그를 USER지정 하여 설정을 무시할 수 있습니다 . 그러나 실행중인 컨테이너에서 실제로 변경하지 않아야하기 때문에 이것에 대해 조언 할 것입니다. 대신 Dockerfile에서 변경하고 새 이미지를 만드십시오.-u USERdocker run


컨테이너가 실행되는 동안 호스트 파일에 항목을 추가해야합니다.
illa

새 패키지도 설치해야하지만 루트가 아니기 때문에 설치할 수 없습니다.
illa

1
-u플래그를 사용하여 사용자를 변경할 수 있습니다 . 컨테이너 내부에서 할 수 있다고 생각하지 않습니다.
Adrian Mouat


2

컨테이너를 시작하면 루트가되지만 루트의 비밀번호가 무엇인지 알 수 없습니다. 알고있는 것으로 설정하려면 간단히 "passwd root"를 사용하십시오. 컨테이너를 스냅 샷 / 커밋하여 작업을 저장합니다.


1

기본적으로 도커 컨테이너는 root 사용자 .

여전히 컨테이너를 사용하는 경우 exit명령을 사용 하여root 하여 컨테이너를 다시 실행하는 대신 (기본 사용자) 사용자로 .

예 -

[dev@6c4c86bccf93 ~]$ ls
[dev@6c4c86bccf93 ~]$ other-commands..
[dev@6c4c86bccf93 ~]$ exit
[root@6c4c86bccf93 /]# ls

0

루트 액세스 권한을 얻으려면 다음 명령을 시도하십시오

$ sudo -i 

컨테이너 설정에 sudo 액세스 권한이있는 계정이 없으면 작동하지 않을 수 있습니다. 이것은 비정상적인 상황이며 루트가 아닌 사용자가 컨테이너를 실행하는 지점을 중단합니다.
요시야

누구든지 Docker 설치의 DEFAULT su 암호를 알고 있습니까? 나는 고도를 달리려고했고 한 세트가 있습니다.
Patrick Burwell

도커 이미지를 내보내고 WSL2로 가져온 후에 WSL2에서 작동했습니다. 여기에서 passwd를 수행하여 root의 비밀번호를 설정하십시오. 비 루트 사용자로 다시 종료하고 sudo su 또는 su를 시도하십시오. 이제 작동합니다.
WSLUser

0

경우에 따라 사용자와 같은 작업을 수행 할 수 있어야합니다 sudo(예 : 컨테이너에서 실행중인 응용 프로그램이 사용자에게 셸을 제공함). Dockerfile에 간단히 추가하십시오.

RUN apt-get update         # If necessary
RUN apt-get install sudo   # If your base image does not contain sudo.
RUN useradd -m -N -s /bin/bash -u 1000 -p '$1$miTOHCYy$K.c4Yw.edukWJ7z9rbpTZ0' user && \
    usermod -aG sudo user  # Grant sudo to the user
USER user

이제 기본 이미지 사용자 에서 라인 3에 설정된 비밀번호 user를 사용할 수 있습니다 sudo.

useradd 여기 또는 여기에 비밀번호 해시를 생성하는 방법을 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.