docker login
docker login
레지스트리에 인증하는 명령이에요. 이미지를 풀·푸시하거나 Docker 조직 관련 기능에 접근할 때 필요한 자격 증명을 저장해요.
출처: 문서
본문
docker login은 레지스트리에 인증하는 명령이에요.
docker login [OPTIONS] [SERVER]
자격 증명이 있는 공개 또는 비공개 레지스트리 어디든 인증할 수 있어요. 이미지 풀·푸시에는 인증이 필요할 수 있어요. docker scout, docker build 같은 다른 명령도 Docker 조직 관련 구독 전용 기능이나 데이터에 접근하려면 인증이 필요할 수 있어요.
인증 자격 증명은 구성된 credential store에 저장돼요. Docker Desktop을 사용하면 자격 증명이 운영체제의 네이티브 키체인에 자동 저장돼요. Docker Desktop을 사용하지 않으면 Docker 구성 파일($HOME/.docker/config.json, Windows의 %USERPROFILE%/.docker/config.json)에서 credential store를 구성할 수 있어요. credential store를 구성하지 않으면 Docker는 config.json 파일에 base64 인코딩 형식으로 자격 증명을 저장해요. 이 방법은 credential store를 구성·사용하는 것보다 덜 안전해요.
docker login은 특정 레지스트리의 자격 증명을 처리하는 credential helpers도 지원해요.
인증 방법
사용자 이름과 액세스 토큰 또는 비밀번호로 레지스트리에 인증할 수 있어요. Docker Hub는 비밀번호를 입력하지 않고 Docker 계정에 로그인하는 웹 기반 로그인 흐름도 지원해요. Docker Hub의 경우 --username 플래그를 지정하지 않는 한 docker login 명령은 기본적으로 디바이스 코드 흐름을 사용해요. 디바이스 코드 흐름은 안전한 로그인 방식이에요. 디바이스 코드로 Docker Hub 인증을 참고해요.
Credential stores
Docker Engine은 사용자 자격 증명을 운영체제의 네이티브 키체인 같은 외부 credential store에 보관할 수 있어요. 외부 저장소를 사용하는 게 Docker 구성 파일에 자격 증명을 저장하는 것보다 더 안전해요.
credential store를 사용하려면 특정 키체인 또는 외부 저장소와 상호작용하는 외부 헬퍼 프로그램이 필요해요. Docker는 헬퍼 프로그램이 클라이언트 호스트의 $PATH에 있어야 해요.
헬퍼는 docker-credential-helpers releases page에서 다운로드할 수 있어요. 헬퍼는 다음 credential store에서 사용할 수 있어요.
- D-Bus Secret Service
- Apple macOS keychain
- Microsoft Windows Credential Manager
- pass
Docker Desktop에서는 credential store가 이미 설치·구성돼 있어요. Docker Desktop이 사용하는 credential store를 바꾸려는 게 아니라면 다음 단계를 건너뛸 수 있어요.
Credential store 구성
credential store를 사용하도록 Docker Engine에 알리려면 $HOME/.docker/config.json에 credential store를 지정해야 해요. 구성 속성 값은 사용할 프로그램의 접미사(docker-credential- 뒤의 모든 것)여야 해요. 예를 들어 docker-credential-osxkeychain을 사용하려면:
{
"credsStore": "osxkeychain"
}
현재 로그인되어 있다면 docker logout을 실행해 파일에서 자격 증명을 제거하고 docker login을 다시 실행해요.
기본 동작
기본적으로 Docker는 각 플랫폼의 네이티브 바이너리를 찾아요. macOS의 osxkeychain, Windows의 wincred, Linux의 pass예요. 특수한 경우로 Linux에서는 pass 바이너리를 찾지 못하면 secretservice 바이너리로 폴백해요. 이 바이너리들이 모두 없으면 base64 인코딩된 자격 증명을 config.json 구성 파일에 저장해요.
Credential helper 프로토콜
Credential helper는 credential helper 프로토콜을 구현하는 프로그램이나 스크립트라면 무엇이든 될 수 있어요. 이 프로토콜은 Git에서 영감을 얻었지만 공유되는 정보는 다르다는 점이 달라요.
헬퍼는 항상 명령의 첫 번째 인자를 사용해 동작을 식별해요. 그 인자에 가능한 값은 store, get, erase 세 가지뿐이에요.
store 명령은 표준 입력에서 JSON 페이로드를 받아요. 그 페이로드는 서버 주소(자격 증명 식별용), 사용자 이름, 비밀번호 또는 ID 토큰을 담아요.
{
"ServerURL": "https://index.docker.io/v1",
"Username": "david",
"Secret": "passw0rd1"
}
저장되는 비밀(secret)이 ID 토큰이면 Username은 <token>으로 설정해야 해요.
store 명령은 문제가 있을 때 Docker Engine이 표시할 오류 메시지를 STDOUT에 쓸 수 있어요.
get 명령은 표준 입력에서 문자열 페이로드를 받아요. 그 페이로드는 Docker Engine이 자격 증명이 필요한 서버 주소를 담아요. 페이로드 예시: https://index.docker.io/v1.
get 명령은 STDOUT에 JSON 페이로드를 써요. Docker는 이 페이로드에서 사용자 이름과 비밀번호를 읽어요.
{
"Username": "david",
"Secret": "passw0rd1"
}
erase 명령은 STDIN에서 문자열 페이로드를 받아요. 그 페이로드는 Docker Engine이 자격 증명을 제거하려는 서버 주소를 담아요. 페이로드 예시: https://index.docker.io/v1.
erase 명령은 문제가 있을 때 Docker Engine이 표시할 오류 메시지를 STDOUT에 쓸 수 있어요.
Credential helpers
Credential helper는 credential stores와 비슷하지만, 특정 레지스트리의 자격 증명을 처리하는 지정된 프로그램으로 동작해요. 지정된 레지스트리의 자격 증명에 대한 작업에는 기본 credential store가 사용되지 않아요.
Credential helper 구성
현재 로그인되어 있다면 docker logout을 실행해 기본 store에서 자격 증명을 제거해요.
Credential helper는 credsStore와 비슷한 방식으로 지정하지만, 한 번에 여러 helper를 구성할 수 있어요. 키는 레지스트리 도메인을, 값은 사용할 프로그램의 접미사(docker-credential- 뒤의 모든 것)를 지정해요. 예를 들어:
{
"credHelpers": {
"myregistry.example.com": "secretservice",
"docker.internal.example": "pass",
}
}
지원하는 옵션은 다음과 같아요.
| 옵션 | 기본값 | 설명 |
|---|---|---|
-p, --password |
비밀번호 또는 Personal Access Token (PAT), 또는 stdin에서 읽으려면 - |
|
--password-stdin |
stdin에서 비밀번호 또는 Personal Access Token (PAT) 읽기 | |
-u, --username |
사용자 이름 |
웹 기반 로그인으로 Docker Hub 인증
기본적으로 docker login 명령은 디바이스 코드 흐름을 사용해 Docker Hub에 인증해요. 이 흐름은 비밀번호를 입력하지 않고 Docker Hub에 인증할 수 있게 해줘요. 대신 웹 브라우저에서 URL을 방문하고, 코드를 입력하고, 인증해요.
$ docker login
USING WEB-BASED LOGIN
To sign in with credentials on the command line, use 'docker login -u <username>'
Your one-time device confirmation code is: LNFR-PGCJ
Press ENTER to open your browser or submit your device code here: https://login.docker.com/activate
Waiting for authentication in the browser…
브라우저에서 코드를 입력하면 Docker Hub 웹사이트나 Docker Desktop에 현재 로그인된 계정을 사용해 Docker Hub에 인증돼요. 로그인되어 있지 않으면 디바이스 코드를 입력한 후 로그인하라는 메시지가 표시돼요.
자기 호스트 레지스트리에 인증
자기 호스트 레지스트리에 인증하려면 서버 이름을 추가로 지정하면 돼요.
$ docker login registry.example.com
기본적으로 docker login 명령은 레지스트리가 포트 443 또는 80에서 수신한다고 가정해요. 레지스트리가 다른 포트에서 수신한다면 서버 이름에 포트 번호를 추가해 지정할 수 있어요.
$ docker login registry.example.com:1337
Note
레지스트리 주소에는 URL 경로 구성 요소를 포함하지 말고 호스트 이름과 (선택) 포트만 포함해야 해요. URL 경로 구성 요소가 있는 레지스트리 주소는 오류를 일으킬 수 있어요. 예를 들어
docker login registry.example.com/foo/는 잘못됐고,docker login registry.example.com은 올바르다는 점을 기억해요.이 규칙의 예외는 Docker Hub 레지스트리로, 역사적 이유로 주소에
/v1/경로 구성 요소를 사용할 수 있어요.
사용자 이름과 비밀번호로 레지스트리에 인증
사용자 이름과 비밀번호로 레지스트리에 인증하려면 --username 또는 -u 플래그를 사용할 수 있어요. 다음 예제는 사용자 이름 moby로 Docker Hub에 인증해요. 비밀번호는 대화형으로 입력돼요.
$ docker login -u moby
STDIN으로 비밀번호 제공 (--password-stdin)
docker login 명령을 비대화형으로 실행하려면 --password-stdin 플래그로 STDIN을 통해 비밀번호를 제공할 수 있어요. STDIN을 사용하면 비밀번호가 셸의 히스토리나 로그 파일에 남는 것을 막을 수 있어요.
다음 예제는 파일에서 비밀번호를 읽어 STDIN으로 docker login 명령에 전달해요.
$ cat ~/my_password.txt | docker login --username foo --password-stdin
--password 또는 -p의 값으로 -를 전달해 STDIN에서 비밀번호를 읽을 수도 있어요.
$ cat ~/my_password.txt | docker login --username foo --password -