빠른 흐름
# Docker Hub device flow
docker login
# 사용자명 지정
docker login -u <username>
# self-hosted registry
docker login registry.example.com
docker login registry.example.com:5000
# CI나 스크립트
cat token.txt | docker login --username <user> --password-stdin
# 인증 제거
docker logout registry.example.com인증 구조
docker login은 registry별 pull/push 인증 정보를 저장한다
docker login은 Docker Hub나 private registry에 이미지를 pull/push하기 위한 인증을 설정합니다. Docker Hub는 기본적으로 device code flow를 사용할 수 있고, --username을 지정하면 사용자명 기반 로그인 흐름을 사용합니다. self-hosted registry는 서버 이름을 인자로 넘깁니다.
docker login
docker login registry.example.com
docker login registry.example.com:1337registry 주소에는 보통 hostname과 선택적 port만 씁니다. registry.example.com/foo/처럼 path를 포함하면 올바른 registry 주소가 아니므로 오류가 날 수 있습니다. 이미지 이름의 namespace와 registry 인증 주소를 분리해서 보는 것이 중요합니다.
credential store는 비밀번호 저장 위치를 바꾼다
Docker는 인증 정보를 credential store나 credential helper를 통해 OS keychain, Windows Credential Manager, pass 같은 외부 저장소에 보관할 수 있습니다. Docker Desktop은 보통 credential store가 이미 설치·설정되어 있습니다. credential store가 없으면 Docker는 $HOME/.docker/config.json 또는 Windows의 %USERPROFILE%\.docker\config.json에 base64 인코딩 형태로 저장할 수 있는데, 이 방식은 보안상 더 약합니다.
{
"credsStore": "osxkeychain"
}registry별로 다른 helper를 쓰려면 credHelpers를 설정합니다. 회사 registry와 Docker Hub 인증 정책이 다를 때 유용합니다. 이미 로그인한 상태에서 store 설정을 바꾸는 경우에는 docker logout으로 기존 자격 증명을 지우고 다시 로그인해야 설정이 명확하게 반영됩니다.
운영 기준
| 상황 | 적합한 선택 |
|---|---|
| Docker Hub 대화형 로그인 | docker login |
| 특정 사용자명으로 로그인 | docker login -u <user> |
| private registry 로그인 | docker login <registry-host>[:port] |
| CI에서 토큰 전달 | --password-stdin |
| 인증 정보 제거 | docker logout <registry> |
| 로컬 보안 저장소 사용 | credsStore |
| registry별 helper 분리 | credHelpers |
| config.json에 base64 저장됨 | credential store 설정 검토 |
CI에서는 토큰을 명령행 인자로 넘기지 말고 표준 입력으로 전달합니다. --password-stdin은 secret이 shell history나 로그에 남을 가능성을 줄입니다. 그래도 CI 로그, secret masking, 권한 범위, token 만료 정책은 별도로 확인해야 합니다.
주의할 점
docker login -p <password>처럼 비밀번호를 명령행 인자로 넘기면 shell history나 CI 로그에 남을 수 있습니다.
자동화에서는 access token을 secret store에서 읽어 --password-stdin으로 전달하는 방식이 더 안전합니다.
실패 예시
- registry 주소에 /namespace/project 같은 path를 포함해 login함
- Docker Desktop이 아닌 환경에서 credential store 없이 config.json에 인증 정보가 남음
- CI에서 password를 명령행 인자로 넘겨 로그에 노출됨참고 링크
1 sources