์ค๋์ ๊ณต์ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Docker Registry๋ฅผ ๊ตฌ์ฑํด์ ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋๋ง์ Private Registry๋ฅผ ๋ง๋ค์ด๋ณด๋ ค ํ๋ค.
Docker Registry๋?
Registry๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์ ์ฅ์์ด๋ค. ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ์ํค๊ณ , ๋ค์ด๋ก๋ ํด์ ์ฌ์ฉํ๊ณ ํ๋ ๋ฑ์ ๋์์ ์ํํ ์ ์๊ฒ ๋์์ค๋ค. ๊ฐ์ฅ ๋๋ฆฌ ์๋ ค์ ธ ์๋ Registry๋ก๋ Docker Hub๋ฅผ ๊ผฝ์ ์ ์๋ค.
๊ทธ๋ฌ๋ฉด Docker Hub ์ฐ๋ฉด ๋์์?
๋ฌผ๋ก ๊ตณ์ด ๋๋ง์ Registry๋ฅผ ๊ตฌ์ฑํ์ง ์๊ณ , Docker Hub๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ์๋ ์๋ค. ํ์ง๋ง Docker Hub๋ ๋ฌด๋ฃ ๊ณ์ ์ ํํด์๋ Private Registry๋ฅผ ์ ๊ณตํ์ง ์๊ณ , ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ๊ณต๊ฐ๋๋ค. ๋ด๊ฐ ์๊ฐํ๋ Private Registry๊ฐ ํ์ํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์์ฉ ์๋น์ค๋ผ๋ฉด
๋น์ฐํ ์์ฉ ์๋น์ค์ ๊ฒฝ์ฐ ๋ฐฑ์๋ ์๋ฒ ์คํํ์ผ ๊ทธ ์์ฒด๋ก ๋ณผ ์ ์๋ ์ด๋ฏธ์ง๋ฅผ Publicํ๊ฒ ๋ ธ์ถํ๊ณ ์ถ์ง ์์ ๊ฒ์ด๋ค. ๋น์ฆ๋์ค๋ฅผ ๋ด๋นํ๋ ์๋ฒ์ ์คํ ๊ฐ๋ฅ๋ณธ์ ๋ ธ์ถํ๋ ๊ทธ ์์ฒด๊ฐ ๊ต์ฅํ ๋ถ๋ด์ด ๋ ๊ฒ์ด๋ค.
์ฌ์ด๋ ํ๋ก์ ํธ๋ผ๋
Docker ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ ์ปจํ ์ด๋์ ์ฌ๋ฆฌ๊ณ ์ถ๋ค๋ ๊ฒ์ ์๋ง ๋ฐฐํฌ๋ฅผ ์ผ๋์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์๋ฒ๋ฅผ ๋น๋ํด์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ก ๋ง๋ ๋ค๋ ๊ฒ์ ๋๋ถ๋ถ์ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ๋์ํ ์ ์๋๋ก ํ๋ ์๋๊ฐ ํฌ๋ค. ์ฆ, ์๋ฒ์์ DB์ ์ ์ํ๋ ์ ๋ณด๋, ๋ค๋ฅธ API ์๋ฒ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ API Key ๋ฑ์ ์ ๋ณด๊ฐ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๋ด์ Raw ํ๊ฒ ์ ์ฅ๋ผ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Hashicorp Vault๋ AWS Secrets Manager ์ ๊ฐ์ ์๋จ์ ์ฌ์ฉํ ์๋ ์๊ฒ ์ง๋ง ์ด๋ฐ ์๋ฃจ์ ์ ๋ํ ์ ๊ทผ ์ญ์๋ Key์ ์ํด์ ๋ฐํ์์ ์ํ๋ ํ๋ฅ ์ด ๋๋ค. ์ฆ, ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํ ์ด๋ฏธ์ง๋ฅผ ๋ ธ์ถํ๋ ๊ฒ ์์ฒด๊ฐ ๊ต์ฅํ ์ํํ๋ค๋ ์๋ฏธ์ด๋ค. ๋ฐ๋ผ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ฒด๋ฅผ Publicํ๊ฒ ๋ ธ์ถํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ๊ด์ฐฎ์ ์ ํ์ง ์ค ํ๋๊ฐ ๋ ์ ์๋ค.
๊ตฌ์ฑ ๋ฐฉ๋ฒ
์ด๋ฐ Registry๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์์ธ๋ก ๋ค์ํ ์๋ฃจ์ ์ด ์กด์ฌํ๋ค. ์ถฉ๋ถํ ์ปดํจํ ํ์๋ฅผ ํ๋ณดํ ์ ์๋ค๋ฉด, Harbor์ ๊ฐ์ ์๋ฃจ์ ์ ๋์ ํ๋ ๊ฒ์ ๊ณ ๋ คํด๋ณผ๋ง ํ๋ค. Web UI๋ฅผ ์ ๊ณตํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ฑ์ด ๊ต์ฅํ ์ข์์ง๊ธฐ ๋๋ฌธ์ด๋ค. ๋์ ๊ฒฝ์ฐ ์๊ณ ๊ท์ฌ์ด M1 Mac Mini์ ๊ฐ๋ฐ ์๋ฒ๋ฅผ ๋์๋๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Docker์์ ์ ๊ณตํ๋ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ๋ค. ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ฉด, ์๋ง ๋ก์ปฌ ํ๊ฒฝ์์ ๋ฐ๋ก ๋์๋ณด๋ ๊ฒ์ ๋ฌด๋ฆฌ๊ฐ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋์ ๊ฒฝ์ฐ Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ nginx, ์ธ์ฆ API, ๊ณ์ API, MySQL, Postgres, Grafana ๋ฑ๋ฑ ๋ง์ ์๋น์ค๋ค์ ๋์ ๊ด๋ฆฌํ๊ณ ์๋ค. ๋ฐ๋ผ์ Docker Compose๋ฅผ ํตํด ๊ตฌ์ฑ์ ์งํํด๋ณด๊ฒ ๋ค.
Docker Compose ์ค์ ์์
version: "3.8"
services:
registry:
restart: always
image: registry:2
ports:
- 5005:5000
environment:
REGISTRY_HTTP_TLS_CERTIFICATE: /etc/letsencrypt/live/your.domain.here/fullchain.pem
REGISTRY_HTTP_TLS_KEY: /etc/letsencrypt/live/your.domain.here/privkey.pem
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- /your-letsencrypt-dir-here/conf:/etc/letsencrypt
- /your-registry-volume-dir-here/data:/var/lib/registry
- /your-registry-volume-dir-here/auth:/auth
- ํด๋น Compose ํ์ผ์ ๊ณต์ ๋ฌธ์์ ์ด ๋ถ๋ถ๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค.
- ์ผ๋จ registry ์ปจํ ์ด๋์ inbound port๋ 5000์ผ๋ก ์ค์ ๋ผ ์๋ค.
- ์ฃผ์ํ๊ฒ ๋ด์ผ ํ ๋ถ๋ถ์
environment
๋ถ๋ถ์ด๋ค. - ์๋์ ๋ถ๊ฐ์ ์ธ ๋ด์ฉ๋ค๊ณผ ํจ๊ป ํด๋น ์ค์ ์ ๋ฏ์ด๋ณด์.
์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ Registry ๋ง๋ค๊ธฐ
- ๊ณต์ ๋ฌธ์์์ ์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํ๋ค.
- ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, ๋จผ์ Registry๋ฅผ TLS๋ก ๋ณดํธํด์ผ ํ๋ค๊ณ ํ๋ค.
- ์ฆ, HTTPS๋ฅผ ์ํ ํค๊ฐ ํ์ํ๋ค๋ ๋ป์ด๋ค.
- ๊ณต์ ๋ฌธ์์์๋
crt
์key
ํ์ผ์ ์ฌ์ฉํ์ง๋ง, ๋์ ๊ฒฝ์ฐ Certbot์ ์ด์ฉํ์ฌ API ์๋ฒ๋ Grafana ๋ฑ์ ์ธ์ฆ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์, registry๋ฅผ ์ํ Certbot ์ธ์ฆ์๋ฅผ ์์ฑํด์ฃผ์๋ค.- ์์ฑ์ ์ฌ์ฉํ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
certbot certonly --webroot --email myemail@gmail.com \
--agree-tos --config-dir /your-letsencrypt-dir-here/conf \
--logs-dir /your-letsencrypt-dir-here/log \
--work-dir /your-letsencrypt-dir-here/work \
-d registry.mydomain.com
- ๊ทธ๋ฆฌ๊ณ Compose ํ์ผ์
REGISTRY_HTTP_TLS_CERTIFICATE
,REGISTRY_HTTP_TLS_KEY
์ค์ ์ ์ก์์ฃผ์๋ค.- ์ฐธ๊ณ ๋ก, ํด๋น
environment
๋ ์ปจํ ์ด๋ ์์์ ์ฌ์ฉํ ๊ฒฝ๋ก๋ฅผ ์ก๋ ๋ถ๋ถ์ด๋ค. ๋ฐ๋ผ์,volumes
์ค์ ์ ํตํด์ ์ ์ ํ๊ฒ ํธ์คํธ ๋จธ์ ์ ๋๋ ํ ๋ฆฌ์ ์ปจํ ์ด๋ ์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋งคํ์์ผ์ค์ผ ํ๋ค.
- ์ฐธ๊ณ ๋ก, ํด๋น
์ธ๋ถ ์ ๊ทผ ์ธ์ฆ ์ค์ ํ๊ธฐ
- ๊ณต์ ๋ฌธ์์์ ์ด ๋ถ๋ถ์ ์ฐธ๊ณ ํ๋ค.
- ์ฐธ๊ณ ๋ก, TLS๋ก ๋ณดํธํ์ง ์์ผ๋ฉด ์ธ์ฆ ๊ด๋ จ ์ค์ ์ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ธ์ฆ์ ๊ด๋ จ ์ดํด๋ฅผ ๊ฐ๋จํ๊ฒ๋ผ๋ ์์งํ๋ ํธ์ด ๋์ ๊ฒ์ด๋ค.
- ์ธ์ฆ์ ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ Basic Auth๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
- HTTP Basic Auth์ ๋น์ทํ๊ฒ ๊ตฌํ๋์ด ์๋ ๋ฏ ํ๋ค.
- ๋๋ ์์ ๋๋ก htpasswd ๋ฅผ ์ฌ์ฉํด์ ์ธ์ฆ์ ์ค์ ํ๋ค.
- ์ฐธ๊ณ ๋ก, htpasswd ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ID / PW ์์ ๋ง๋ค์ด์ค์ผ ํ๋ค.
- ์์ฑ์ ์ฌ์ฉํ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
htpasswd -c ./htpasswd yourid
- ๊ทธ๋ฆฌ๊ณ ์์ฑํ htpasswd ํ์ผ์ Compose ํ์ผ์
volumes
์ค์ ์ ํ์ฉํ์ฌ ์ปจํ ์ด๋ ์์ผ๋ก ๋ฐ์ด๋ฃ์ด์ฃผ๋ฉด ๋๋ค. - ์ธ์ฆ์ ํ์ํ ํ์ผ์ ๋ฐ์ด๋ฃ์์ผ๋, ์ด์ Compose ํ์ผ์
environment
์ค์ ์ ํตํด htpasswd ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ฉด ๋๋ค.- ์ ์ค์์
REGISTRY_AUTH_HTPASSWD_REALM
์ด๋ผ๋ ์ ๊ธฐํ ์ค์ ์ด ์๋๋ฐ,Registry Realm
์ผ๋ก ์ค์ ํ๋ฉด, Registry ์์ญ์ ๋ํด ์ ๊ทผํ๋ ๊ฒ์ ๋ํ ์๋ ๋ก๊ทธ์ธ ์ค์ ๊ฐ์ ๊ฒ์ผ๋ก ๋ณด๋ฉด ๋๋ค.
- ์ ์ค์์
์๋ฃ
์๊ฐ๋ณด๋ค ์ด๋ ค์ด ๋ถ๋ถ ์์ด ์ค์ ์ ์๋ฃํ ์ ์์๋ค. ์ด์ Docker Compose๋ฅผ ํตํด ์ปจํ
์ด๋๋ฅผ ๋์์ฃผ๋ฉด, ๋๋ง์ Private Registry๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
Registry๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ด๋์ง ํ์ธํ๊ณ ์ถ์ผ๋ฉด, https://registry.yourdomain.com:{port}/v2
๋ก ์ ๊ทผํด๋ณด์. ์๋ง HTTP Basic Auth ๋ก๊ทธ์ธ ์ฐฝ์ด ๋ฐ๊ฒจ์ค ๊ฒ์ด๋ค.
nginx๋ฅผ Registry ์๋จ์ ๋ถ์ฌ๋๊ณ ์ฌ์ฉํ ์๋ ์๋๋ฐ, ๊ทธ๋ฌ๋ฉด ์ปจํ
์ด๋ ์ด๋ฏธ์ง์ ์ฌ์ด์ฆ์ ๋ฐ๋ผ ๋ nginx ์ค์ ์ ๋ง์ ธ์ผ ํ๋ ์ค๋ณต ๊ด๋ฆฌ๊ฐ ๋ค์ด๊ฐ ๊ฒ ๊ฐ์ ์ผ๋จ์ Registry๋ nginx๋ฅผ ๊ฑฐ์น์ง ์๊ฒ ๋์๋๋ค.
๋ด ๊ฒฝ์ฐ GitHub Actions๋ฅผ ํตํด ์ ์ปจํ
์ด๋๋ก ์ด๋ฏธ์ง๋ฅผ ์
๋ก๋ํด์ Mac Mini๋ก API ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์๋นํ๋๋ก ์ค์ ํด์ ์ฌ์ฉํ๊ณ ์๋ค.
๋.