Error response from daemon: Get https://registry.domain.com/v2/: x509: certificate signed by unknown authority

생각보닀 λ§Žμ€ μ‘°μ§μ—μ„œ 사내 μ •μ±…μ΄λ‚˜ 도컀 ν—ˆλΈŒμ˜ λ‹€μš΄λ‘œλ“œ μ œν•œλŸ‰μ„ κ²½ν—˜ν•˜κ³  λ„μ»€μ—μ„œ μ œκ³΅ν•˜λŠ” λ ˆμ§€μŠ€νŠΈλ¦¬ μ΄λ―Έμ§€λ‘œ 사섀 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. μœ„ 였λ₯˜λŠ” 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ— λ‘œκ·ΈμΈμ„ μ‹œλ„ν•  λ•Œ λ‚˜νƒ€λ‚  수 μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” 도컀 μ—”μ§„μ΄λΌκ³ ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„κ°€ 전달해쀀 μΈμ¦μ„œλ₯Ό μ‹ λ’°ν•  수 μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 그러면 μœ„μ™€ 같이 λ‚΄ 컴퓨터에 μ„€μΉ˜λœ 도컀 μ—”μ§„μ—μ„œ μ‚¬μ„€λ‘œ κ΅¬μΆ•ν•œ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ μΈμ¦μ„œλ₯Ό μ‹ λ’°ν•  수 μ—†λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ μ–΄λ–»κ²Œ ν•΄κ²°ν•˜λŠ”μ§€λ₯Ό μ•Œμ•„λ³΄λ„λ‘ ν•˜μ£ .

도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μΈμ¦μ„œ

도컀 μ—”μ§„μ—μ„œ μ°Έμ‘°ν•˜λŠ” λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ— λŒ€ν•œ μΈμ¦μ„œ ν΄λ”λŠ” certs.d μž…λ‹ˆλ‹€.

  • Windows: C:/ProgramData/Docker/certs.d/
  • Linux: /etc/docker/certs.d/
  • Mac: ~/.docker/certs.d/
/etc/docker/certs.d/         <-- Certificate directory
└── registry.domain.com:5000 <-- Hostname:port
   β”œβ”€β”€ client.cert           <-- Client certificate
   β”œβ”€β”€ client.key            <-- Client key
   └── ca.crt                <-- Certificate authority that signed the registry certificate

μ•ˆμ „ν•˜μ§€ μ•Šμ€ λ ˆμ§€μŠ€νŠΈλ¦¬

HTTPS둜 μ‹€ν–‰λœ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ— λŒ€ν•΄μ„œ 도컀 엔진이 μ‹ λ’°ν•  수 μ—†λŠ” μΈμ¦μ„œλ₯Ό λ¬΄μ‹œν•˜λ„λ‘ insecure-registriesμ˜΅μ…˜μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, 이 방법은 ν•΄λ‹Ή 도메인 μ£Όμ†Œμ˜ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„κ°€ μ˜¬λ°”λ₯Έ μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜λŠ”μ§€ κ²€μ¦ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— λ³΄μ•ˆμ μΈ 뢀뢄을 μƒκ°ν•œλ‹€λ©΄ 일반적으둜 μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλ˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

μ‹ λ’°ν•  수 μžˆλŠ” 인증 κΈ°κ΄€

도컀 엔진은 기본적으둜 μ‹œμŠ€ν…œμ— λ“±λ‘λœ μ‹ λ’°ν•  수 μžˆλŠ” 인증 κΈ°κ΄€μ˜ μΈμ¦μ„œ λͺ©λ‘μœΌλ‘œ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ₯Ό κ²€μ¦ν•©λ‹ˆλ‹€. μ΄λŠ” 크둬과 같은 λΈŒλΌμš°μ €μ—μ„œ HTTPS 톡신 μ‹œ μ„œλ²„μ—μ„œ μ „λ‹¬ν•˜λŠ” μΈμ¦μ„œκ°€ μœ νš¨ν•œμ§€λ₯Ό ν™•μΈν•˜λŠ” 것과 λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ €λŠ” μ‹ λ’°ν•  수 μžˆλŠ” 인증 κΈ°κ΄€μœΌλ‘œλΆ€ν„° λ°œκΈ‰λ°›μ€ 도메인 μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•˜μ—¬ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜μ˜€λŠ”λ°λ„ λΆˆκ΅¬ν•˜κ³  도컀 μ—”μ§„μ—μ„œλŠ” νšŒμ‚¬ 도메인 μ£Όμ†Œλ‘œλœ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ—μ„œ μ „λ‹¬λœ μΈμ¦μ„œκ°€ μ˜¬λ°”λ₯΄μ§€ μ•Šλ‹€λ©° λ™μΌν•˜κ²Œ x509: certificate signed by unknown authority 였λ₯˜λ₯Ό μ•Œλ €μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.

CA μΈμ¦μ„œ 체인

도컀 μ—”μ§„μ—μ„œ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ μΈμ¦μ„œλ₯Ό μ‹ λ’°ν•  수 μ—†λ‹€λŠ” 것은 λͺ‡κ°€μ§€ 사항에 λŒ€ν•œ 의미λ₯Ό κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 첫번째둜, 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„ ꡬ좕 μ‹œ μ‚¬μš©ν•œ CA μΈμ¦μ„œκ°€ ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œμ™€ 인증 기관듀에 λŒ€ν•œ μΈμ¦μ„œκ°€ μ—°κ²°λœ CA μΈμ¦μ„œ 체인이 아닐 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ‹€μ œλ‘œ μ§€κΈˆμ€ UI 기반의 μ‚¬μš©μž 및 이미지 관리λ₯Ό μœ„ν•΄ Harbor둜 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„λ₯Ό μž¬κ΅¬μΆ•ν•˜μ˜€μœΌλ‚˜ κΈ°μ‘΄ 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ— μ‚¬μš©λœ CA μΈμ¦μ„œ νŒŒμΌμ—λŠ” ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ§Œ μ‘΄μž¬ν–ˆλ˜ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 쑰직 λ‚΄ κ°œλ°œμžλ“€μ—κ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ—μ„œ μ‚¬μš©λœ CA μΈμ¦μ„œ 파일과 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ 및 ν‚€λ₯Ό μ „λ‹¬ν•˜κ³  도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μΈμ¦μ„œ 폴더에 μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•΄λ‹¬λΌκ³  μ•ˆλ‚΄ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. 결ꡭ은 도컀 엔진이 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„λ₯Ό μ‹ λ’°ν•  수 μ—†μœΌλ―€λ‘œ CA μΈμ¦μ„œ 체인을 μ‹ λ’°ν•  수 μžˆλŠ” μΈμ¦μ„œ λͺ©λ‘μ— ν¬ν•¨μ‹œν‚€λ©΄ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, Mac용 킀체인 접근을 μ‚¬μš©ν•˜μ—¬ 킀체인에 μΈμ¦μ„œ μΆ”κ°€ν•˜κΈ°μ— 따라 CA μΈμ¦μ„œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μœ νš¨ν•œ μΈμ¦μ„œμž„μ΄ ν‘œμ‹œλ¨μ„ 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

docker login registry.domain.com -u 'username' -p 'password'
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ CA μΈμ¦μ„œ 체인을 μ‹œμŠ€ν…œ μΈμ¦μ„œλ‘œ λ“±λ‘ν•˜κ³ λ‚˜μ„œλŠ” 도컀 엔진이 μ‹ λ’°ν•  수 μžˆλŠ” μΈμ¦μ„œ λͺ©λ‘μ— 따라 μΈμ¦μ„œκ°€ μœ νš¨ν•¨μ„ ν™•μΈν•¨μœΌλ‘œ μ •μƒμ μœΌλ‘œ HTTPS 톡신이 이루어지고 λ‘œκ·ΈμΈμ— μ„±κ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€. λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ— λŒ€ν•œ 둜그인 μ˜ˆμ‹œμ΄λ―€λ‘œ CLI κ²½κ³  λ¬Έκ΅¬λŠ” λ¬΄μ‹œν•΄μ£Όμ„Έμš”.

μ‹œμŠ€ν…œ 및 μ‚¬μš©μž μ •μ˜ CA μΈμ¦μ„œ 병합

On Linux any root certificates authorities are merged with the system defaults, including the host’s root CA set. If you are running Docker on Windows Server, or Docker Desktop for Windows with Windows containers, the system default certificates are only used when no custom root certificates are configured.

κ³΅μ‹λ¬Έμ„œμ— λ”°λ₯΄λ©΄ μœ„μ™€ 같이 μ‚¬μš©μž μ •μ˜ μΈμ¦μ„œ(certs.d)λŠ” μ‹œμŠ€ν…œ μΈμ¦μ„œμ™€ CA μΈμ¦μ„œκ°€ ν•©μ³μ Έμ„œ λ“±λ‘λœλ‹€λŠ” λ‚΄μš©μ΄ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ CA μΈμ¦μ„œ 체인을 μ‹œμŠ€ν…œ μΈμ¦μ„œ λͺ©λ‘μ΄λ‚˜ certs.d 폴더에 두면 λœλ‹€λŠ” μ΄μ•ΌκΈ°μž…λ‹ˆλ‹€. μ‹€μ œλ‘œ μ‹œμŠ€ν…œ μΈμ¦μ„œλ‘œ λ“±λ‘ν•˜μ§€ μ•Šμ•„λ„ certs.d 폴더에 ca.crtλΌλŠ” μ΄λ¦„μœΌλ‘œ CA μΈμ¦μ„œ 체인을 λ‘κ²Œλ˜λ©΄ λ™μΌν•˜κ²Œ λ™μž‘ν•¨μ„ 확인할 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν•œκ°€μ§€ ν₯미둜운 점은 이 글을 μž‘μ„±ν•˜κΈ° μœ„ν•΄ Docker Desktop for Windows μ—μ„œλ„ ν…ŒμŠ€νŠΈλ₯Ό ν•΄λ³Έ κ²°κ³Ό 도컀 λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„μ˜ CA μΈμ¦μ„œ 체인을 ꡳ이 λ“±λ‘ν•˜μ§€ μ•Šμ•„λ„ μ •μƒμ μœΌλ‘œ 둜그인이 λ˜μ—ˆλ‹€λŠ” μ μž…λ‹ˆλ‹€. 이점으둜 λ³΄μ•˜μ„λ•Œ λͺ¨λ“  μš΄μ˜μ²΄μ œμ—μ„œ λ™μΌν•˜κ²Œ λ™μž‘ν•˜μ§€λŠ” μ•ŠλŠ” 것 κ°™μ•„λ³΄μž…λ‹ˆλ‹€. λ”°λΌμ„œ, 도컀 μ—”μ§„μ—μ„œ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„λ₯Ό μ‹ λ’°ν•  수 μ—†λ‹€κ³  ν•œλ‹€λ©΄ λ ˆμ§€μŠ€νŠΈλ¦¬ μ„œλ²„ κ΄€λ¦¬μžμ—κ²Œ μΈμ¦μ„œ 체인을 μ „λ‹¬λ°›μ•„μ„œ λ“±λ‘ν•˜λŠ”κ²Œ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.