๐ผ๏ธ ์ด๋ฏธ์ง
1๏ธโฃ ์ด๋ฏธ์ง์ ๋ณธ์ง
์ด๋ฏธ์ง๋ ์์ ๋ฆฌ๋ ์ค๋ ๊ฐ๋ฒผ์ด VM์ด ์๋๋ผ,
์ปจํ ์ด๋ ์คํ์ ์ํ ์ค๊ณ๋์ ์ฌ๋ฃ ๊พธ๋ฌ๋ฏธ์ ๊ฐ๊น๋ค.
์ฆ, ์์๋ ์ด์์ฒด์ ์ ์ฒด๊ฐ ๋ค์ด์๋ ๊ฒ์ด ์๋๋ผ,
ํ์ํ ํ์ผ์์คํ ์ค๋ ์ท(๋ ์ด์ด๋ค์ ๋ชจ์)๊ณผ ์คํ ํ๊ฒฝ์ ์ ์ํ๋ ์ค์ (config)์ด ๋ด๊ฒจ์๋ค.
๋ฐ๋ผ์ ์ด๋ฏธ์ง๋ ๋ถ๋ณ(Immutable)ํ ์ํ๋ก ์ ์ฅ๋๋ฉฐ,
๋์ผํ ์ด๋ฏธ์ง๋ผ๋ฉด ๋๊ตฌ๋ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋ง๋ค ์ ์๋ค.
2๏ธโฃ ์ด๋ฏธ์ง์ ์ปจํ ์ด๋์ ๊ด๊ณ
์ด๋ฏธ์ง๋ ์ ์ (Static)์ธ ์กด์ฌ์ด๋ค.
์ฆ, ์คํ ์ ์ ์ค๋น๋ ์ํ์ด๊ณ , ํด์ ๊ฐ์ผ๋ก ๊ณ ์ ํ๊ฒ ๊ตฌ๋ถ๋๋ค.
๊ทธ๋ฌ๋ ์ปจํ ์ด๋๋ ๋์ (Dynamic)์ธ ์กด์ฌ์ด๋ค.
์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์ ํ๋ก์ธ์ค(PID 1)๋ฅผ ์คํํ๋ฉด์ ์ด์ ์์ง์ด๋ ์ํ๋ฅผ ๋ปํ๋ค.
๋ฐ๋ผ์ ์ปจํ ์ด๋๊ฐ ์ข ๋ฃ๋๋ฉด ์คํ ์ค์ธ ๋ฐ์ดํฐ๋ ์ฌ๋ผ์ง์ง๋ง,
์ด๋ฏธ์ง๋ ๊ทธ๋๋ก ๋จ์ ์๊ธฐ์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๐ก ๋น์ ํ์๋ฉด
- ์ด๋ฏธ์ง = ๋ ์ํผ+ ์ฌ๋ฃ ์์
(์ด๋ค ์์์ ๋ง๋ค์ง, ์ด๋ค ์ฌ๋ฃ๊ฐ ํ์ํ์ง ์ ๋ฆฌ๋ ๋ฌธ์์ ๋ฌถ์) - ์ปจํ
์ด๋ = ์ค์ ๋ก ์กฐ๋ฆฌ ์ค์ธ ์์
(๋ ์ํผ์ ์ฌ๋ฃ๋ฅผ ๊บผ๋ด์์ ์ฃผ๋ฐฉ์์ ์กฐ๋ฆฌํ๋ ์ํ)
์ด์ฒ๋ผ ๋ ์ํผ(์ด๋ฏธ์ง)๋ ๊ทธ๋๋ก ๋จ์ ์์ด์ ๊ฐ์ ์์์ ์ฌ๋ฌ ๋ฒ ๋ง๋ค ์ ์์ง๋ง,
์กฐ๋ฆฌ ์ค์ธ ์์(์ปจํ ์ด๋)์ ๋จน๊ณ ์น์ฐ๋ฉด ์ฌ๋ผ์ ธ๋ฒ๋ฆฌ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
๐ฆ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ด๋ถ ๊ตฌ์กฐ
์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ ๋จ์ํ ํ๋ก๊ทธ๋จ ํ์ผ์ ๋ฌถ์ด๋์ ์์ถ ํ์ผ์ด ์๋๋ค.
๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด OCI(Open Container Initiative) Image ์คํ์ด๋ผ๋ ํ์ค์ ๋ฐ๋ผ ์ ํด์ง ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฅธ๋ค.
์ ํํ๋ ์๋์ 4๊ฐ์ง ๊ตฌ์กฐ๋ฅผ ํฌํจํ๋๋ฐ, ๊ฐ๊ฐ์ ์ข ๋ ์์ธํ ์ดํด๋ณด์.
๐งฑ ๋ ์ด์ด(Layer)
๋ ์ด์ด๋ ํ์ผ ์์คํ ๋ณ๊ฒฝ์ (diff)์ ๋ด์ ๋ฌถ์์ด๋ค.
๋ณดํต tar ํํ๋ก ์ ์ฅ๋๊ณ , ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ์ ๋ฐ๋์ง ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ '๋ณ๊ฒฝ์ '์ด๋ผ๊ณ ๋ถ๋ฅผ๊น?
์ด๋ฏธ์ง๊ฐ ๋์ ๋๋ ๊ณผ์ ์์ ๊ฐ ๋จ๊ณ๊ฐ ์๋ก์ด ์ ์ฒด ๋ณต์ฌ๋ณธ์ด ๊ฒ์ด ์๋๋ผ
๊ทธ ์๊ฐ์ ์ฐจ์ด๋ง ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ด๋ฏธ์ง๋ ์ฌ๋ฌ ๋จ๊ณ์ ์์ ์ผ๋ก ๋ง๋ค์ด์ง๋๋ฐ,
์๋ฅผ ๋ค์ด์ Dockerfile์ด ์๋์ ๊ฐ์ด ์๊ฒผ๋ค๊ณ ํด๋ณด์.
FROM ubuntu:20.04 # (A) ์ฐ๋ถํฌ ๊ธฐ๋ณธ ํ์ผ ์์คํ
RUN apt-get update && apt-get install -y curl # (B) ํจํค์ง ์ถ๊ฐ
COPY app/ /app # (C) ๋ด ์ ํ๋ฆฌ์ผ์ด์
๋ณต์ฌ
- (A) ๋จ๊ณ ๐๐ป ๊ธฐ๋ณธ ์ฐ๋ถํฌ ํ์ผ ์์คํ ์ด ํ๋์ ํฐ ๋ ์ด์ด๊ฐ ๋๋ค.
- (B) ๋จ๊ณ ๐๐ป curl ๊ฐ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๋ฉฐ, ์๋ก์ด ๋ ์ด์ด๊ฐ ์์ ์์ธ๋ค.
- (C) ๋จ๊ณ ๐๐ป /app ์ ํ์ผ์ ๋ณต์ฌํ ๋ด์ฉ์ด ๋ ์ ๋ ์ด์ด๊ฐ ๋๋ค.
์ฆ, ๊ฐ ๋ช ๋ น์ด '์ด์ ๊น์ง์ ์ํ + ์ด๋ฒ ๋ณ๊ฒฝ'์ด๋ผ๋ ์๋ก์ด ๋ ์ด์ด๋ฅผ ์์ ์น๋๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ๋ค์ด ์ด๋ป๊ฒ ํฉ์ณ์ ํ๋์ ํ์ผ ์์คํ ์ด ๋๋ ๊ฑธ๊น?
Union File System ๋๋ถ์ ํ์ผ ์์คํ ์ ์ฌ๋ฌ ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ฅผ ๊ฒน์ณ์ ํ๋๋ก ํฉ์ณ ๋ณด์ด๊ฒ ๋ง๋ค๊ณ ,
๊ทธ ์์ ์์ ์ฐ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ฅผ ์น๋ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
์ปจํ ์ด๋๋ฅผ ์์ํ ๋, ๋ฐํ์์ ์ฌ๋ฌ ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ฅผ ์์์ ์๋๋ก ๊ฒน์ณ์ ํ๋์ ๋ฃจํธ ํ์ผ์์คํ ์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋งจ ์์ ์ปจํ ์ด๋ ์ ์ฉ์ ์์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ๋ ์ด์ด๋ฅผ ์์๋ก ์ฌ๋ฆฐ๋ค.
[์ปจํ
์ด๋ ์คํ ์ ๋ณด์ด๋ FS]
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ ← (์ฐ๊ธฐ ๊ฐ๋ฅ) ์ปจํ
์ด๋ ๋ ์ด์ด (์์, ์ปจํ
์ด๋ ์ข
๋ฃ ์ ์ฌ๋ผ์ง)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโค ← ๋ ์ด์ด C (ex. app ๋ณต์ฌ)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโค ← ๋ ์ด์ด B (ex. curl ์ค์น)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโค ← ๋ ์ด์ด A (ex. ubuntu:20.04 ๊ธฐ๋ณธ)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ด์ฒ๋ผ ์ฝ๊ธฐ ์ ์ฉ ๋ ์ด์ด๋ค์ ๊ทธ๋๋ก ๋๊ณ ,
์ปจํ ์ด๋์์ ํ์ผ์ ์์ , ์ถ๊ฐ, ์ญ์ ํ๋ฉด ๊ทธ ๋ณํ๋ ๋งจ ์์ ์ฐ๊ธฐ ๋ ์ด์ด์๋ง ๊ธฐ๋ก๋๋ค.
๋ํ, ํ์ผ ์ญ์ ๊ฐ์ ๋์์ ๋ด๋ถ์ ์ผ๋ก ํ์ดํธ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์๋์ด,
์๋ ๋ ์ด์ด์ ์๋ ํ์ผ์ด ๊ฐ๋ ค์ง ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
โ๏ธ Config JSON
์ด๋ฏธ์ง ์์๋ ํ์ผ๋ง ๋ค์ด์๋ ๊ฒ ์๋๋ผ '์ด๋ป๊ฒ ์คํํ ์ง'์ ๋ํ ๊ธฐ๋ณธ ์ค๊ณ๋๊ฐ ํจ๊ป ๋ค์ด์๋๋ฐ,
์ด ์ค๊ณ๋๊ฐ ๋ฐ๋ก Config Json์ด๋ค.
์ปจํ ์ด๋๋ฅผ ๋์ธ ๋ ๋ฐํ์์ด ์ด ์ ๋ณด๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ๊ณ ,
docker run ์ต์ ์ด ์์ผ๋ฉด ๊ทธ๊ฒ์ผ๋ก ๋ฎ์ด์์(override) ์คํํ๋ค.
์ ๋ฆฌํ์๋ฉด, Config JSON์ ์คํ ๊ธฐ๋ณธ๊ฐ์ ๋ฌถ์์ด๋ค.
(ex. ENTRYPOINT, CMD, ENV, USER, WORKDIR ๋ฑ)
๐ ์ฐธ๊ณ ์ฌํญ
- ENTRYPOINT: ์คํํ ํ๋ก๊ทธ๋จ์ ์ง์
- CMD: ENTRYPOINT์ ๋๊ธธ ๊ธฐ๋ณธ ์ธ์, ๋๋ ENTRYPOINT๊ฐ ์์ ๋ ๊ธฐ๋ณธ ์คํ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฆฌํด
๋ง์ฝ ์๋์ ๊ฐ์ด ENTRYPOINT์ CMD๊ฐ ๋ ๋ค ์์ผ๋ฉด, ๊ทธ๋ฅ ๋ ๊ฐ๊ฐ ํฉ์ณ์ ธ์ ์คํ๋๋ค.
ENTRYPOINT ["nginx", "-g"]
CMD ["daemon off;"]
๐๐ป nginx -g "daemon off;"
- ENV: ์คํ ํ๊ฒฝ ๋ณ์
- USER: ์ด๋ค ์ฌ์ฉ์๋ก ์คํํ ์ง
- WORKDIR: ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ
์ด๋ฌํ Config JSON์ ์ด๋์ ์๊ธธ๊น?
๋๋ถ๋ถ์ Dockerfile ์ง์์ด๋ก๋ถํฐ ์๋ ์์ฑ๋๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ Dockerfile์ด ์๋ค๊ณ ํด๋ณด์.
FROM ubuntu:22.04
ENV APP_ENV=prod
WORKDIR /app
COPY bin/server /app/server
EXPOSE 8080
USER 1001
ENTRYPOINT ["/app/server"]
CMD ["--port","8080"]
๋น๋ ์ Config JSON์๋ ์๋์ ๊ฐ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
- Env=['"APP_ENV=prod", ...]
- WorkingDir="/app"
- ExposedPorts={"8080/tcp":{ }}
- User="1001"
- Entrypoint=["/app/server"]
- Cmd=["--port", "8080"]
๋ฐํ์์์๋ ์ด ๊ฐ๋ค์ด ๊ธฐ๋ณธ๊ฐ์ด ๋๊ณ , ๋ง์ฝ docker run ์ต์ ์ด ์๋ค๋ฉด ํด๋น ํญ๋ชฉ๋ง ๋ฎ์ด์ฐ๊ฒ ๋๋ค.
๐ Manifest
Manifest๋ '์ด ์ด๋ฏธ์ง๊ฐ ์ด๋ค Config์ ์ด๋ค Layer(Blob)๋ค๋ก ๊ตฌ์ฑ๋์ด ์๋์ง'๋ฅผ ์ ํํ ๊ฐ๋ฆฌํค๋ ์ฒญ์ฌ์ง์ด๋ค.
์ปจํ ์ด๋ ๋ฐํ์์ pullํ ๋ ๋จผ์ Manifest๋ฅผ ๋ฐ์๋ณด๊ณ ,
๊ฑฐ๊ธฐ์ ์ ํ ๋ค์ด์ ์คํธ(sha256) ๋ชฉ๋ก์ ๋ฐ๋ผ ์ค์ ๋ธ๋กญ๋ค์ ๋ด๋ ค๋ฐ์ ๊ฒ์ฆํ๋ค.
์ด๋ฌํ Manifest์๋ ์๋์ ํญ๋ชฉ๋ค์ด ๋ด๊ธด๋ค.
- schemaVersion / medisType (์คํ ๋ฒ์ / ์ ํ)
- Config Json์ ์์น
- ์ด๋ฏธ์ง ํ์ผ ์์คํ ์ ์ด๋ฃจ๋ ๋ ์ด์ด๋ค์ ์์น(๋ค์ด์ ์คํธ) ๋ชฉ๋ก
๋์ถฉ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์์๋ฅผ ๋ค์ด๋ณด์๋ฉด ์๋์ ๊ฐ์ ๊ฒ์ด๋ค.
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:...config...",
"size": 1234
},
"layers": [
{"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:...A...","size":111},
{"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip","digest":"sha256:...B...","size":222}
]
}
ํต์ฌ์ ๊ฒฐ๊ตญ Manifest๋ config + ์ฌ๋ฌ layer์ ๋ค์ด์ ์คํธ ๋ชฉ๋ก์ผ๋ก ๊ตฌ์ฑ๋๋ค๋ ๊ฒ์ด๋ค.
๋ค์ด์ ์คํธ๋ก ๋ชจ๋ ๊ฒ์ ์๋ณํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณ์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ, ์บ์๊ฐ ๋ณด์ฅ๋๋ค.
๊ทธ๋ ๋ค๋ฉด Manifest List(= Image Index)๋ ๋ฌด์์ผ๊น?
ํ๋์ ์ด๋ฏธ์ง ์ด๋ฆ ์๋์ ์ฌ๋ฌ ์ํคํ ์ฒ(amd64, arm64, arm/v7 ๋ฑ) ํน์ ์ฌ๋ฌ OS(๋ฆฌ๋ ์ค, ์๋์ฐ) ๋ฒ์ ์ ๋ฌถ์ด๋๋
์์ ์ธ๋ฑ์ค๊ฐ Manifest LIST ์ด๋ค(OCI์์๋ Image Index).
์ด๋ ์ฌ์ฉ์๊ฐ docker pull nginx:latest ๋ฅผ ์คํํ ๋,
ํด๋ผ์ด์ธํธ์ ํ๋ซํผ ์ ๋ณด์ ๋ง๋ ๊ฐ๋ณ Manifest๋ฅผ ์๋์ผ๋ก ์ ํํด์ฃผ๊ธฐ ๋๋ฌธ์ ํ์ํ๋ค.
์๋ฅผ ๋ค์ด์ x86 ์๋ฒ์๋ ์๋์ผ๋ก amd64์ฉ Manifest๋ฅผ ์ ํํด์ฃผ๊ณ ,
M1, M2 ๋งฅ์๋ ์๋์ผ๋ก arm64์ฉ Manifest๋ฅผ ์ ํํด์ค๋ค.
๋งค์ฐ ์ถ์ฝํ ๊ฐ๋จํ ์์๋ฅผ ๋ณด๋ฉด ์๋์ ๊ฐ์ ๊ฒ์ด๋ค.
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.index.v1+json",
"manifests": [
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:...amd64...",
"platform": {"os":"linux","architecture":"amd64"}
},
{
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"digest": "sha256:...arm64...",
"platform": {"os":"linux","architecture":"arm64","variant":"v8"}
}
]
}
์ฌ๊ธฐ์์ ํต์ฌ์ Index๋ ์ฌ๋ฌ ํ๋ซํผ์ฉ Manifest๋ค์ ๋ชฉ๋ก์ด๊ณ ,
ํด๋ผ์ด์ธํธ๋ ์์ ์ ํ๋ซํผ์ ๋ง๋ ์ํธ๋ฆฌ๋ฅผ ์๋ ์ ํํ๋ค๋ ๊ฒ์ด๋ค.
๐ ๊ฒฐ๋ก
- ์ด๋ฏธ์ง๋ ์์ ์ด์์ฒด์ ๊ฐ ์๋๋ค.
- ์ฒ์์๋ ์ด๋ฏธ์ง ์์ OS ์ ์ฒด๊ฐ ๋ค์ด์๋ ์ค ์์์ง๋ง, ์ฌ์ค์ ํ์ผ ์์คํ ๋ณ๊ฒฝ์ (Layer)๊ณผ Config JSON, Manifest, Index ๊ฐ์ ๋ฉํ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ง ๋ถํธ ํ ํ๋ฆฟ์ด์๋ค.
- ๋ ์ด์ด๋ ๋ณ๊ฒฝ์ ์ ๊ธฐ๋ก์ด๋ค.
- ๊ฐ Dockerfile ๋ช ๋ น์ด ์๋ก์ด ์ ์ฒด ๋ณต์ฌ๋ณธ์ ๋ง๋๋๊ฒ ์๋๋ผ '์ด์ ์ํ + ์๋ก์ด ๋ณ๊ฒฝ'๋ง ๊ธฐ๋ก๋๋ค๋ ์ ์ด ํจ์จ์ฑ๊ณผ ์บ์ฑ์ ํต์ฌ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์๋ค.
- ์๋ง ์ด๊ฒ ๋ฐ๋ก ๋์ปค๊ฐ ๋น ๋ฅด๊ณ ์ ์ฅ๊ณต๊ฐ๋ ์ ์ฝํ๋ ์ด์ ์ผ ๊ฒ์ด๋ค.
- Config JSON์ ์ญํ
- ๋จ์ํ ํ์ผ๋ง ๋ด๋ ๊ฒ ์๋๋ผ, ์ปจํ ์ด๋๊ฐ ์คํ๋ ๋ ์ด๋ค ํ๋ก๊ทธ๋จ์ ๋์ฐ๊ณ ์ด๋ค ํ๊ฒฝ์์ ์คํํ ์ง์ ๋ํ ๊ธฐ๋ณธ๊ฐ์ ์ ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
- ๋๋ถ์ docker run ๋ง์ผ๋ก๋ ๋ฐ๋ก ์คํ ๊ฐ๋ฅํ ํ๊ฒฝ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
- Manifest์ Index์ ์ค์์ฑ
- Manifest๋ ์ด๋ฏธ์ง์ ์ฒญ์ฌ์ง ์ญํ ์ ํ๊ณ , Index๋ ๋ฉํฐ์ํคํ ์ฒ ํ๊ฒฝ์์ ์๋์ผ๋ก ๋ง๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํด์ค๋ค.
- ์ด ๋๋ถ์ ๋์ผํ nginx:latest ๋ผ๋ ์ด๋ฆ์ผ๋ก๋ x86 ์๋ฒ์ ARM ์๋ฒ์์ ๊ฐ๊ฐ์ ๋ง๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ธ ์ ์๋ ๊ฒ์ด๋ค.
์ค๋ ์ ๋ฆฌํ ๋ด์ฉ์ ํตํด์ ์์ผ๋ก๋ ๋จ์ํ docker pull ๋ง ํ๊ณ ์ฐ๋๊ฒ ์๋๋ผ
"์ด ์ด๋ฏธ์ง์ ๋ ์ด์ด๋ ์ด๋ป๊ฒ ๊ตฌ์ฑ๋์ด ์์๊น?", "Config JSON์ ์ด๋ค ๊ธฐ๋ณธ๊ฐ์ด ๋ค์ด๊ฐ ์์๊น?" ๊ฐ์ ์์ ์ผ๋ก ๋ฐ๋ผ๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ ์์ง์ ๋๋ฌด ์ด๋ ต๊ธด ํด์ ์ค๋ ํฌ์คํ ํ ๋ด์ฉ์ ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค .. (ลฬฅฬฅฬฅฬฅ ษลฬฅฬฅฬฅฬฅ)
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ ๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค] ๋์ปค ๋์ ์๋ฆฌ (4) | 2025.08.17 |
---|---|
[๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค] ๋์ปค์ ๊ฐ์ํ ๊ธฐ์ ์ ์ฐจ์ด (6) | 2025.08.13 |
[๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค] ์๋ฒ๋ (1) | 2025.08.12 |
[๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค] ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ์ ๋ ๋ฆฝ๋ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌํด์ผ ํ๋ ์ด์ (3) | 2025.08.12 |
[๋์ปค & ์ฟ ๋ฒ๋คํฐ์ค] ๋์ปค(Docker)๋ (1) | 2025.08.11 |