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 ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์๋์ ๋ด์ฉ์ ํด๊ฒฐํ๋ผ.
# 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
๋ฐ์ํ