728x90
๋ฐ˜์‘ํ˜•

5. ๋„์ปค ํ—ˆ๋ธŒ ๋“ฑ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€ ๊ณต์œ ํ•˜๊ธฐ

  • ๋„์ปค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด ๊ณต์œ ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ชจ๋“  ์˜์กด ๋ชจ๋“ˆ๊ณผ ํ•จ๊ป˜ ํŒจํ‚ค์ง•ํ•œ๋‹ค๋ฉด ์–ด๋–ค ํ™˜๊ฒฝ์—์„œ๋ผ๋„ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

5.1 ๋ ˆ์ŠคํŠธ๋ฆฌ, ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ, ์ด๋ฏธ์ง€ ํƒœ๊ทธ ๋‹ค๋ฃจ๊ธฐ

  • ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค ๋ฐ›๋Š” ์„œ๋ฒ„๋ฅผ ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ผ๊ณ  ํ•œ๋‹ค.
  • ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ค‘ ๋„์ปค ํ—ˆ๋ธŒ๊ฐ€ ์ œ์ผ ์œ ๋ช…ํ•˜๋‹ค.
  • ๋„์ปค ์ด๋ฏธ์ง€์˜ ์ „์ฒด ์ด๋ฆ„(์ด๋ฏธ์ง€ ์ฐธ์กฐ, image reference) ๋Š” ๋„ค ๊ฐœ์˜ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
[์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„]/[์ด๋ฏธ์ง€ ์ž์„ฑ์ž์˜ ๊ณ„์ • ์ด๋ฆ„]/[์ด๋ฏธ์ง€ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ์ด๋ฆ„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„]:[์ด๋ฏธ์ง€ ํƒœ๊ทธ]
docker.io/diamol/golang:latest
  • ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ๊ฐ’์€ docker.io ์ด๊ณ , ํƒœ๊ทธ์˜ ๊ธฐ๋ณธ๊ฐ’์€ latest ์ด๋‹ค.
  • ๋งŒ์•ฝ, ํ˜„์žฌ ํšŒ์‚ฌ์ฒ˜๋Ÿผ Harbor ๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉ์ค‘์ผ ๊ฒฝ์šฐ์—๋Š” ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.
  • ์ง์ ‘ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ํƒœ๊ทธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ํ˜ผ์šฉ๋˜์ง€ ์•Š๋„๋ก ๊ด€๋ฆฌ ํ•ด์•ผ ํ•œ๋‹ค.

5.2 ๋„์ปค ํ—ˆ๋ธŒ์— ์ง์ ‘ ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€ ํ‘ธ์‹œํ•˜๊ธฐ

  • ์ด๋ฏธ์ง€ ์ฐธ์กฐ์— ๊ณ„์ • ์ด๋ฆ„์ด ๋“ค์–ด๊ฐ€์•ผ ๋„์ปค ํ—ˆ๋ธŒ์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ฏธ ๋นŒ๋“œ๋œ ์ด๋ฏธ์ง€๋Š” ๋‹ค์‹œ ๋นŒ๋“œํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ด๋ฏธ์ง€ ์ฐธ์กฐ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
$ export dockerId=
$ docker login --username $dockerId
$ docker image tag image-gallery $dockerId/image-gallery:v1
$ docker image ls --filer reference=image-gallery --filter reference='*/image-gallery'
$ docker image push $dockerId/image-gallery:v1
$ echo "<https://hub.docker.com/r/$dockerId/image-gallery/tags>"
  • ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋„ ๋„์ปค ์—”์ง„๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ๋‹ค๋ฃฌ๋‹ค.
  • ๋”ฐ๋ผ์„œ, Dockerfile ์˜ ์ตœ์ ํ™”๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.
  • Dockerfile ์Šคํฌ๋ฆ…ํ‹ฐ๋Š” ๋นŒ๋“œ ์‹œ๊ฐ„. ๋””์Šคํฌ ์šฉ๋Ÿ‰์„ ๋„˜์–ด ๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ๊นŒ์ง€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ๋‹ค.

5.3 ๋‚˜๋งŒ์˜ ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์šด์˜ํ•˜๊ธฐ

  • ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์— ์ „์šฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ธํ„ฐ๋„ท ํšŒ์„  ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์—ฌ ์ฃผ๋ฉฐ ์ „์†ก ์‹œ๊ฐ„์„ ์ ˆ์•ฝ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๊ณต์œ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ๋‹ค.
  • ๋„์ปค ์ฝ”์–ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„๋Š” docker/distribution ์—์„œ ๊ฐœ๋ฐœ์ด ์ง„ํ–‰๋œ๋‹ค.
  • ์ฝ”์–ด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋ฒ„๋Š” ๋„์ปค ํ—ˆ๋ธŒ์™€ ๋™์ผํ•œ ๋ ˆ์ด์–ด ์บ์‹œ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๊ณ  ํ‘ธ์‹œํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ์›น UI ๊ธฐ๋Šฅ์€ ๋น ์ ธ์žˆ๋‹ค.
$ docker container run -d -p 5000:500 --restart always diamol/registry
$ echo $'\\n127.0.0.1 registry.local' | sudo tee -a /etc/hosts

127.0.0.1 registry.local

$ vi /etc/hosts

127.0.0.1 registry.local

$ ping registry.local
PING registry.local (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.026 ms
^C
--- registry.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.026/0.044/0.067/0.016 ms

๋น„๋ณด์•ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋“ฑ๋ก

  • ๋น„๋ณด์•ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋–„๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋„์ปค ์—”์ง„๊ณผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ํ†ต์‹  ๋‚ด์šฉ์„ ์ œ์‚ผ์ž๊ฐ€ ์—ฟ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฏธ์ง€ ํ‘ธ์‹œ ๊ณผ์ •์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„ ์˜ฌ ๋•Œ ์œ„์กฐ๋œ ๊ฐ€์งœ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„ ์˜ฌ ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๋‹ค.
$ vi /etc/docker/daemon.json

{
  "insecure-registries": ["registry.local:5000"]
}

$ docker image push registry.local:5000/gallery/ui:v1

5.4 ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • ๋„์ปค ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋Š” ์–ด๋–ค ๋ฌธ์ž์—ด์ด๋ผ๋„ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์ด๋ฏธ์ง€๋Š” [major].[minor].[patch] ํ˜•ํƒœ์˜ ๋ฒ„์ „ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.
$ docker image tag image-gallery registry.local:5000/gallery/ui:latest
$ docker image tag image-gallery registry.local:5000/gallery/ui:2
$ docker iamge tag image-gallery registry.local:5000/gallery/ui:2.1
$ docker image tag image-gallery registry.local:5000/gallery/ui:2.1.106
  • Dockerfile ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  • ๊ฐœ๋ฐœ ํŒ€๊ณผ ๋™์ผํ•œ ๋„๊ตฌ๋กœ ๋นŒ๋“œํ•˜๊ณ  ๋™์ผํ•œ ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ฒ„์ „์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นŒ๋“œ์šฉ ์ด๋ฏธ์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๋ฉด์„œ ๋นŒ๋“œ๊ฐ€ ๊นจ์งˆ ์ˆ˜๋„ ์žˆ๊ณ , ๋Ÿฐํƒ€์ž„์˜ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

5.5 ๊ณต์‹ ์ด๋ฏธ์ง€์—์„œ ๊ณจ๋“  ์ด๋ฏธ์ง€๋กœ ์ „ํ™˜ํ•˜๊ธฐ

  • ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ œ๊ณต๋˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์–ผ๋งˆ๋‚˜ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋ณ„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.
  • ๋„์ปค ํ—ˆ๋ธŒ๋Š” ๊ฒ€์ฆ๋œ ํผ๋ธ”๋ฆฌ์…”(Verified Publisher) ์™€ ๊ณต์‹ ์ด๋ฏธ์ง€(Official Image) ์ œ๋„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•ด๋‹น ์ด๋ฏธ์ง€๋“ค์€ ์ทจ์•ฝ์  ํƒ์ง€ ๋“ฑ์˜ ์Šน์ธ ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์ณ ๊ณต๊ฐœ๋˜๋ฏ€๋กœ, ๊ฒ€์ฆ๋œ ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ธ์ฆ๋œ ์ด๋ฏธ์ง€๋Š” ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ์ข‹๋‹ค.
  • ๊ณต์‹ ์ด๋ฏธ์ง€๋Š” ์ฃผ๋กœ ์˜คํ”ˆ์†Œ์Šค๋กœ, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ํŒ€๊ณผ ๋„์ปค๊ฐ€ ํ•จ๊ป˜ ์ด๋ฏธ์ง€๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๊ณต์‹ ์ด๋ฏธ์ง€ ์—ญ์‹œ ์ทจ์•ฝ์  ๊ฒ€์‚ฌ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ•˜๋ฉฐ, ์ตœ์ ํ™”๋œ Dockerfile ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
  • ๊ณต์‹ ์ด๋ฏธ์ง€์˜ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋Š” ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ๊นƒํ—ˆ๋ธŒ ์ €์žฅ์†Œ์—์„œ Dockerfile ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ๊ณจ๋“  ์ด๋ฏธ์ง€ (Golden Image) ๋ž€ ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋กœ ์‚ผ์•„ ์ธ์ฆ์„œ๋‚˜ ํ™˜๊ฒฝ ์„ค์ •๊ฐ’ ๋“ฑ ์ž์‹ ์ด ํ•„์š”ํ•œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.
$ cd ch05/exercises/dotnet-sdk
$ docker image build -t golden/dotnetcore-sdk:3.0 .

$ cd ../aspnet-runtime
$ docker image build -t golden/aspnet-core:3.0 .
FROM golden/dotnetcore-sdk:3.0 AS builder
COPY . .
RUN dotnet publish -o /out/app app.csproj

FROM golden/aspnet-core:3.0
COPY --from=builder /out /app
CMD ["dotnet", "/app/app.dll"]
  • ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ณจ๋“  ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ Dockerfile ์Šคํฌ๋ฆฝํŠธ ์ด๋‹ค.
  • CI / CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ๊ณต์‹ ์ด๋ฏธ์ง€์˜ ์ตœ์‹ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค, ๊ณจ๋“  ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

5.6 ์—ฐ์Šต๋ฌธ์ œ

Registry

  • ์œ„์˜ Registry ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ํ•ด๊ฒฐํ•˜๋ผ.
# docker build -t registry.local:5000/gallery/ui .

A. ํ•œ ๋ฒˆ์˜ image push ๋ช…๋ น์–ด๋งŒ์œผ๋กœ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ํ‘ธ์‹œํ•ด๋ผ

# ์ด๋ฏธ์ง€ ์ค€๋น„
$ docker image build -t gallery/ui:latest
$ docker image build -t gallery/ui:1.1.1
$ docker image build -t gallery/ui:2.2.2

# ๋ชจ๋“  ์ด๋ฏธ์ง€ ํ‘ธ์‹œ
$ docker image push registry.local:5000/gallery/ui

# docker push registry.local:5000/gallery/ui
Using default tag: latest
The push refers to repository [registry.local:5000/gallery/ui]
d287d2f650d9: Pushed 
8326b85cae07: Pushed 
866a21c83696: Pushed 
39adc7867f55: Pushed 
c087aa3a9887: Pushed 
20312b574584: Pushed 
latest: digest: sha256:88952f19c9833bbc27fa3a486da606d8301533eef91f34e8829c097249f390aa size: 1573

# ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ํ™•์ธํ•˜๊ธฐ
$ curl <http://registry.local:5000/v2/gallery/ui/tags/list>

{"name":"gallery/ui","tags":["latest"]}

B. ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ(gallery/ui) ์˜ ํƒœ๊ทธ ๋ชฉ๋ก์„ ํ™•์ธ

$ curl -X GET <http://registry.local:5000/v2/gallery/ui/tags/list>

{"name":"gallery/ui","tags":["latest"]}

C. ์ด๋ฏธ์ง€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํ™•์ธ

  • HTTP ํ—ค๋”๋ฅผ ํ™•์ธํ•˜๋ฉด Docker-Content-Digest ํ—ค๋”๊ฐ€ ์กด์žฌํ•œ๋‹ค.
  • ํ•ด๋‹น ํ—ค๋”๋ฅผ ํ†ตํ•ด ์‚ญ์ œ์š”์ฒญํ•  ๊ฒƒ์ด๋‹ค.
$ curl -X GET <http://registry.local:5000/v2/gallery/ui/manifests/latest>

{
   "schemaVersion": 1,
   "name": "gallery/ui",
   "tag": "latest",
   "architecture": "arm64",
   "fsLayers": [  ... ],
   "history": [ ... ],
   "signatures": [
      {
         "header": {
            "jwk": {
               ...
            },
            "alg": "ES256"
         },
         "signature": "",
         "protected": ""
      }
   ]
}

$ curl -I -X GET <http://registry.local:5000/v2/gallery/ui/manifests/latest>
HTTP/1.1 200 OK
Content-Length: 5158
Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
Docker-Content-Digest: sha256:4ea5dee4ce8e11a03dc25e2bf2a9e83a40ad05209d48e28255743f80fc8cd9d1
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:4ea5dee4ce8e11a03dc25e2bf2a9e83a40ad05209d48e28255743f80fc8cd9d1"
X-Content-Type-Options: nosniff
Date: Mon, 18 Nov 2024 08:17:28 GMT

D. API ๋ฅผ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์‚ญ์ œ

$ curl -X DELETE <http://registry.local:5000/v2/gallery/ui/manifests/sha256:4ea5dee4ce8e11a03dc25e2bf2a9e83a40ad05209d48e28255743f80fc8cd9d1>
728x90
๋ฐ˜์‘ํ˜•
MyeongDev