๋น์ฉ&๋ณด์ ๋ ๋ง๋ฆฌ ํ ๋ผ ์ก๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง ์ด์ฉ๋ฒ
๋น์ฉ&๋ณด์ ๋ ๋ง๋ฆฌ ํ ๋ผ ์ก๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง ์ด์ฉ๋ฒ ๊ด๋ จ
์ ํ๋ฆฌ์ผ์ด์ ํ๋ํ์ ๋ฐ๋ผ ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๊ฐ ๋ง์ ๋ถ๋ถ์์ ์ ์ฉ๋๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ ์ปจํ ์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ผ๋ก ์ ๋ฌ๋๋ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ด๋ฉฐ, ์ด ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ป๊ฒ ๋ง๋ค์ด ๋ด๋๊ฐ์ ๋ฐ๋ผ์ ํจ์จ์ ์ธ ํ์ดํ๋ผ์ธ์ ๊ฐ์ง๊ณ ์๋ค์ ์๋๋ค๋ฅผ ๋งํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ์ค์ํ๊ฒ ๋ด์ผ ํ๋ ๋ ๋ค๋ฅธ ์ง์ ์ด ์๋๋ฐ, ๋ฐ๋ก ํ์ดํ๋ผ์ธ๋ฑ์ ํตํด์ ์ปจํ ์ด๋๊ฐ ๋น๋๋ ๋ ์ปจํ ์ด๋์ ์ฉ๋์ ์ค์ด๋ ๊ฒ์ ๋๋ค.
์ปจํ ์ด๋์ ์ฉ๋์ ์ค์ด๋ ๊ฒ์ ๋ค์์ ์ฃผ์ 2๊ฐ์ง ์ด์ ์ด ์์ต๋๋ค.
- ์ด๋น์ฉ ๊ฐ์: ์ปจํ ์ด๋ ๋น๋, ๊ตฌ๋ ๊ทธ๋ฆฌ๊ณ ์ด์์ ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ค์ฌ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋น์ฉ์ด ๊ฐ์๋จ
- ๋ณด์์ ์ธ ์ธก๋ฉด: ์ฉ๋์ ์ค์ด๋ ๊ณผ์ ์์ ํจํค์ง๋ฅผ ์ต์ํํจ์ผ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ง์ ์ด ์ค์ด๋ฆ
์ด๋ ๊ฒ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ฉ๋์ ์ค์ด๋ ๋ฐฉ๋ฒ๋ค์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง, ๊ทธ์ค์ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ปจํ ์ด๋ ๋น๋๋ฅผ ์ํด์ ์ฌ์ฉํ๋ ๊ธฐ์ด ์ด๋ฏธ์ง๋ฅผ ๋์คํธ๋ก๋ฆฌ์ค(Distroless) ์ด๋ฏธ์ง๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์์ ํฌํจ๋์ด ๋ฐฐํฌ๋๋ ํจํค์ง ๋งค๋์ , ์ ธ(Shell), ๊ธฐํ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ ๋ฑ์ด ํฌํจ๋์ด ์์ง ์๊ณ ์ค์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์ํ๊ธฐ ์ํ ๋ฐํ์ ๊ด๋ จ ๋ด์ฉ๋ง์ด ํฌํจ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ๋ฐฐํฌํ์ ์ด๋ฏธ์ง๋ณด๋ค ํจ์ฌ ์ ์ ์ด๋ฏธ์ง ์ฉ๋์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค(Distroless) ์ด๋ฏธ์ง์ ์ฃผ์ 2๊ฐ์ง ์ด์
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ ์ ์๋ ์ต์ํ์ ํ๊ฒฝ๋ง์ ๊ฐ์ง๋ ์ด๋ฏธ์ง์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ณผ์ฐ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๊ฐ ์ผ๋ฐ ์ด๋ฏธ์ง์ ๋นํด ์ผ๋ง๋ ์ฉ๋์ด ๋ ์์์ง๋ฅผ ํ์ธํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
.openjdk:21
์ด๋ฏธ์ง์ ๊ตฌ๊ธ ์ปจํ
์ด๋ ๋๊ตฌ๋ค(GoogleContainerTools)์์ ์ ๊ณตํ๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง ์ค์์ gcr.io/distroless/java21-debian12
๋ฅผ ์ด์ฉํด์ ์ฉ๋์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค.
docker images
.openjdk:21
์ด๋ฏธ์ง๋ 504MB, gcr.io/distroless/java21-debian12
์ด๋ฏธ์ง๋ 191MB๋ก 313MB์ ์ฉ๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด ์ฐจ์ด๋ ํฌ์ง ์์ ๊ฒ ๊ฐ์ง๋ง, ์ด ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ๋ ์ปจํ
์ด๋์ ๊ฐ์๊ฐ ๋ง์์ง๋ฉด ๋ง์์ง์๋ก ๋์ ํด์ ๋์ด๋๊ฒ ๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ด ์ฉ๋์ ์ต์ํ ์ํค๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ์
๋๋ค.
์ด๋ฒ์๋ ๋ณด์ ๊ด์ ์์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด์ CNCF(Cloud Native Computing Foundation, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ปดํจํ
์ฌ๋จ)์ ๋๋์ค์ผ์ดํ์์ ํ์ธ๋๋ ๋ณด์ ์ค์บ ๋๊ตฌ ์ค์ trivy๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค. aquasecurity/trivy
๋ ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ทจ์ฝ์ ๊ฒ์ฆ ๋๊ตฌ๋ก์จ, ์ปจํ
์ด๋ ์ด๋ฏธ์ง ์ทจ์ฝ์ ๊ฒ์ฆ ์ด์ธ์ ๋์ปค(Docker), ํ
๋ผํผ(Terraform)๋ฑ์ ๋ํ ํ์ผ ๊ฒ์ฆ๋ ์ํ์ด ๊ฐ๋ฅํฉ๋๋ค. NSA(National Security Agency)์ FIPS(Federal Information Processing Standards) ๋ฑ์ ๊ธฐ์ค์ ๋ง๊ฒ ๋ณด์ ๊ฒ์ฆ์ ์งํํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ด์ trivy๋ฅผ ํตํด ์ผ๋ฐ์ปจํ
์ด๋ ์ด๋ฏธ์ง์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ๊ฐ๊ฐ ์ค์บํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ทจ์ฝ์ ์ ๊ฒ์ฆํ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง์ ์ฉ๋์ด ์๋ฑํ๊ฒ ํฐ openjdk:21์ ์ด๋ฏธ์ง๊ฐ gcr.io/distroless/java21-debian12
์ด๋ฏธ์ง์ ๋นํด ๋ณด์ ์์ผ๋ก ์ทจ์ฝํ ์์๋ค์ด ๋ง์ ๊ฒ์ผ๋ก ํ์ธ๋์์ต๋๋ค. (๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง์ ์๋ CRITICAL์ MiniZip ๊ด๋ จ ์ด์๋ก Zlib 1.3.1์์ ํด๊ฒฐ๋์์ง๋ง ์์ง ์ ์ฉ๋์ง ์์ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ์์ธ ๋ด์ฉ์ ๋ค์์ ์ฐธ๊ณ ํ์ธ์.) ๊ทธ ์ธ์ ์ ๋ฐ์ ์ธ ๋ชจ๋ ์ทจ์ฝ์ ๊ฒ์ฆ ๋ด์ฉ์ ๋์ ํ๋ก ์ ๋ฆฌํด ๋์์ผ๋ ํด๋น ๋ด์ฉ์ ์ดํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๊ฐ ์ด๋ป๊ฒ ์ฉ๋์ ์ค์ด๋ ์ด๋ฏธ์ง๊ฐ ๋ ์ ์์๋์ง ์ง์ ํด๋น ์ด๋ฏธ์ง์ ๋ด๋ถ๋ฅผ ํ์ํ๊ณ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๋ค์ ์ดํด๋ด์ผ๋ก์จ ์ดํด๋ฅผ ๋์ด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ผ๋ฐ openjdk ์ด๋ฏธ์ง์ ๋์คํธ๋ก๋ฆฌ์ค ํํ์ openjdk ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๋น๋ ๋น๊ต
๋น๋๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฐ๋ฐ ๋๊ตฌ๊ฐ ์ค์น๋์ด ์์ง ์์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋น๊ตํ๋ ค๋ฉด ๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๋น๋ ๋ฐฉ์๊ณผ ๋ฉํฐ ์คํ ์ด์ง ๋น๋ ๋ฐฉ์์ ๊ทธ๋ฆผ์ ํตํด ๊ตฌ์กฐ๋ฅผ ๊ฐ๋จํ ์์๋ด ๋๋ค.
์ผ๋ฐ์ ์ธ ๋น๋ ๋ฐฉ์์์๋ openjdk:21 ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , ๋ฉํฐ ์คํ
์ด์ง ๋น๋ ๋ฐฉ์์์๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ openjdk:21
(์ดํ openjdk) ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ํ ๋ ๋ฒ์งธ ๋จ๊ณ์์ gcr.io/distroless/java21-debian12
(์ดํ ๋์คํธ๋ก๋ฆฌ์ค) ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. openjdk ์ด๋ฏธ์ง๋ ์๋ฐ ์์ค ์ฝ๋๋ฅผ ๋น๋ํด ํจํค์ง๋ฅผ ๋ง๋๋ ๋ฐ ํ์ํ ๋๊ตฌ์ ํด๋น ํจํค์ง๋ฅผ ์คํํ๋ ๋๊ตฌ๊ฐ ๋ชจ๋ ํฌํจ๋์ด ์๊ณ , ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์๋ฐ ํจํค์ง๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋๊ตฌ๋ง ํฌํจ๋์ด ์๋ค๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ฐจ์ด๋ก ์ธํ์ฌ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ openjdk ์ด๋ฏธ์ง๋ณด๋ค ์ฉ๋์ด ์์ผ๋ฉฐ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ๋น๋ํ ํจํค์ง๋ฅผ ๋ ๋ฒ์งธ ๋จ๊ณ๋ก ๋ณต์ฌํ์ฌ ์ฌ์ฉํ๋ ๋ฉํฐ ์คํ
์ด์ง ๋ฐฉ์์ ์ต์ข
์ด๋ฏธ์ง ์ฉ๋์ด ๋ ์์ต๋๋ค.
์ด๋ ๋ฏ ๋ฉํฐ ์คํ
์ด์ง ๋น๋ ๋ฐฉ์์ ์ด์ฉํ๋ฉด ์ปจํ
์ด๋ ๊ธฐ๋ฐ์ ํธ๋ฆฌํ ๋น๋ ํ๊ฒฝ๊ณผ ๊ฐ๋ฒผ์ด ์ต์ข
์ด๋ฏธ์ง ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ์ด๋ฆด ์ ์์ต๋๋ค. ์ค์ Dockerfile
์ ์ดํด๋ณด๋ฉฐ ๋ฉํฐ ์คํ
์ด์ง ๋ฐฉ์์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ Dockerfile
๋ฐ ๋น๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ดํด๋ณด๋ฉฐ ์์ธํ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ๋ฉํฐ ์คํ
์ด์ง ๋น๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์ Dockerfile
์
๋๋ค.
FROM openjdk:21
LABEL description="Echo IP Java Application"
EXPOSE 80
RUN microdnf install git && git clone https://github.com/iac-sources/inbuilder.git
WORKDIR inbuilder
RUN chmod 700 mvnw \
&& ./mvnw clean package \
&& mv target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ก openjdk:21
์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด์ ์์ค ์ฝ๋๋ฅผ ๋ด๋ ค ๋ฐ๋๋ฐ ํ์ํ git
๊น์ง ์ค์นํ ํ ๋ฉ์ด๋ธ์ ์ด์ฉํ์ฌ ์๋ฐ ์์ค ์ฝ๋๋ฅผ ๋น๋ํ์ฌ app-in-image.jar
ํจํค์ง ํ์ผ์ ๋ง๋ ํ ํด๋น ํ์ผ์ ์ปจํ
์ด๋ ๋ด๋ถ์์ ์คํํฉ๋๋ค. ์ด๋ฌํ ๋น๋ ๋ฐฉ์์ ๋ณ๋์ ๋น๋ ํ๊ฒฝ ๊ตฌ์ถ ์์ด ์ปจํ
์ด๋ ๋ด๋ถ์์ ํธ๋ฆฌํ๊ฒ ๋น๋ํ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง์ง๋ง ๊ธฐ๋ฐ ์ด๋ฏธ์ง์ ์ฉ๋์ด ํฌ๊ณ ์ค์นํ ์ถ๊ฐ ๋๊ตฌ์ ๋น๋ ๊ณผ์ ์์ ๋ด๋ ค ๋ฐ๋ ํ์ผ๋ค์ ์ฉ๋๊น์ง ์ต์ข
์ด๋ฏธ์ง์ ๋ฐ์๋๋ ๋จ์ ์ด ์์ต๋๋ค.
๊ทธ๋ผ ๋ฉํฐ ์คํ
์ด์ง ๋น๋์์ ์ฌ์ฉํ๋ Dockerfile
์ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
FROM openjdk:21 AS int-build
RUN microdnf install git && git clone https://github.com/iac-sources/inbuilder.git
WORKDIR inbuilder
RUN chmod 700 mvnw \
&& ./mvnw clean package
FROM gcr.io/distroless/java21-debian12
LABEL description="Echo IP Java Application"
EXPOSE 80
COPY inbuilder/target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ์๋ฐ ์์ค ์ฝ๋๋ฅผ ๋น๋ํ์ฌ ํจํค์ง๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ผ๋ฐ์ ์ธ ๋น๋ ๊ณผ์ ๊ณผ ๋์ผํฉ๋๋ค. ๊ทธ๋ ์ง๋ง ๋ ๋ฒ์งธ ๋จ๊ณ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ ์ค ์์ฑํ app-in-image.jar ํ์ผ์ ๋ณต์ฌํ์ฌ ์คํํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ณผ์ ์ ํตํด ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ๋น๋ ํ๊ฒฝ์ ์ฅ์ ์ ์ ์งํ๋ฉด์ ์ต์ข ์ด๋ฏธ์ง์ ์ฉ๋์ ์๊ฒ ํ๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง์ ์ฅ์ ๊น์ง ์ถ๊ฐ๋ก ๊ฐ์ง ์ ์์ต๋๋ค.
์ค์ ๋ก openjdk ์ด๋ฏธ์ง์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋ณธ ํ ์ฉ๋์ ๋น๊ตํด ๋ณด๊ฒ ์ต๋๋ค. ์๋์ ๋ช
๋ น์ ์คํํ์ฌ openjdk-dockerfile
๋๋ ํฐ๋ฆฌ์ distroless-dockerfile
๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , openjdk ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ Dockerfile
๊ณผ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ Dockerfile
์ ์์ฑํ ํ ํ์ธํฉ๋๋ค. cat <<EOF>> [ํ์ผ์ด๋ฆ] [ํ์ผ๋ด์ฉ] EOF
๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด EOF ์ ์ค๊น์ง ๋ด์ฉ์ ํ์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
.Dockerfile
์์ฑ์ ํ์ธํ์์ผ๋ ์์ฑํ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ์ฌ openjdk ์ด๋ฏธ์ง์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฏธ์ง๋ค์ ์์ฑํด๋ด
์๋ค. ๋จผ์ openjdk ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค ๊ธฐ๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ Dockerfile
์ด ์๋ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํด ์ด๋ฏธ์ง๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ฏธ์ง ์์ฑ ์์
์ ๋ง์ณค์ผ๋ Dockerfile
์ด ์๋ ๋๋ ํฐ๋ฆฌ์์ ๋น ์ ธ๋์ ํ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ ํ ๋ ๊ฒฝ์ฐ์ ์ต์ข
์ด๋ฏธ์ง ์ฉ๋์ ๋น๊ตํ๋ฉด ์๋์ ๊ฐ์ด ๋ฉํฐ ์คํ
์ด์ง ๋น๋๋ฅผ ํตํด ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฉ๋์ด ํ์ ํ ์ค์ด๋ฆ์ ์ ์ ์์ต๋๋ค.
๋น์ง๋ฐ์ค(Busybox), ์ํ์ธ(Alpine) ๊ทธ๋ฆฌ๊ณ ๋์คํธ๋ก๋ฆฌ์ค์ ๋ํ ๊ตฌ๋ถ์
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๊ฐ ๋ค๋ฅธ ์ด๋ฏธ์ง์ ๋นํด ๊ฐ๋ฒผ์ด ์ด๋ฏธ์ง๋ผ๊ณ ๋ง์๋๋ ธ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๊ฐ๋ฒผ์ด ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์์๋ณผ ๋ ๋ง์ด ์ธ๊ธ๋๋ ๋ค๋ฅธ ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค. ์ฆ ๋น์ง๋ฐ์ค์ ์ํ์ธ ์ด๋ฏธ์ง์ ๋๋ค. ์ด๊ฒ๋ค์ ํน์ง์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ ์๋์ ๊ทธ๋ฆผ์ ํตํด ์ธ ๊ฐ์ง๋ฅผ ํ ๋์ ์์๋ด ์๋ค.
๋น์ง๋ฐ์ค๋ 350๊ฐ ์ด์์ ๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ฅผ ๋ด์ฅํ๊ณ ์๋ ๋งค์ฐ ๊ฐ๋ฒผ์ด ๋จ์ผ ์คํ ํ์ผ์
๋๋ค. cd
, ls
, rm
๋ฑ์ ๊ธฐ๋ณธ ๋ฆฌ๋
์ค ๋ช
๋ น์ด ๋ฟ ์๋๋ผ unzip
, tar
, telnet
๋ฑ๊ณผ ๊ฐ์ ์ ์ฉํ ๋ช
๋ น์ด๋ค์ ๋ด์ฅํ๊ณ ์์ด busybox <๋ช
๋ น์ด>
์ ๊ฐ์ ํ์์ผ๋ก ๋ค์ํ ๋ช
๋ น์ด๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ๋น์ง๋ฐ์ค๋ ์๋ฒ ๋๋ ๋ฆฌ๋
์ค๋ฅผ ์ํ ์ค์์ค ๊ตฐ์ฉ ์นผ์ด๋ ๋ณ๋ช
์ผ๋ก ๋ถ๋ฆฌ๋ฉฐ ์๋ง์ ์๋ฒ ๋๋ ๊ธฐ๊ธฐ์ ๋ด์ฅ๋์ด ์์ต๋๋ค. ์ปจํ
์ด๋ ๊ธฐ๋ฐ ์์คํ
์์๋ ์ปจํ
์ด๋ ๋ด๋ถ์์ ๋๋ฒ๊น
์ด ํ์ํ ๋ ๋น์ง๋ฐ์ค ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด ๊ฐ์ข
๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ฅผ ์ํํฉ๋๋ค.
์ํ์ธ ๋ฆฌ๋
์ค๋ ๊ฐ๋ฒผ์ด ๋ฆฌ๋
์ค ๋ฐฐํฌํ์ผ๋ก ์ ๋ช
ํฉ๋๋ค. ๊ฐ์ข
๊ธฐ๋ณธ ๋ช
๋ น์ด๋ฅผ ์ง์ ๋ด์ฅํ์ง ์๊ณ ๋น์ง๋ฐ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฉ๋์ ์ค์์ผ๋ฉฐ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด ํ์ํ C์ธ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ musl libc๋ผ๋ ๊ฐ๋ฒผ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ์์ต๋๋ค. ๋ํ ์ฌ์ฉ์๊ฐ ๋ณ๋์ ํ๋ก๊ทธ๋จ์ ์ถ๊ฐํ ์ ์๋๋ก apk-tools
๋ผ๋ ํจํค์ง ๊ด๋ฆฌ์๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ๋ฒผ์ด ์ฉ๋์ด์ง๋ง ์ผ๋ฐ์ ์ธ ๋ฆฌ๋
์ค ์ฌ์ฉ์ ๊ฐ๋ฅํ๋๋ก ๋ง๋ค์์ต๋๋ค. ์ํ์ธ ๋ฆฌ๋
์ค๋ ๋ฒ์ฉ ์ฌ์ฉ ํ๊ฒฝ์ด ํ์ํ๋ฉด์ ์ฉ๋๋ ๊ฐ๋ฒผ์์ผ ํ๋ ๊ฒฝ์ฐ์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ์ํ์ธ ๋ฆฌ๋
์ค์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ 3MB๋ด์ธ์ ์ฉ๋ ๋ฐ์ ์ฐจ์งํ์ง ์์ผ๋ฉฐ, ์ํ์ธ ๋ฆฌ๋
์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์คํ ํ๊ฒฝ์ด ํ์ํ๋ฉด apk ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ถ์ ๊ฐ์ข
์ธ์ด์ ์คํ ํ๊ฒฝ์ ์ค์นํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค๋ง ์ํ์ธ ๋ฆฌ๋
์ค์ ํน์ง์ธ musl libc๋ก ์ธํด ํธํ์ด ๋์ง ์๋ ๋๊ตฌ๊ฐ ์์ ์ ์์ด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค๋ ์์์ ์ค๋ช ํ ๊ฒ๋ค๊ณผ ๋ฌ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์๋ง ์ง์คํฉ๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ๋ฆฌ๋ ์ค์ ํต์ฌ ๊ธฐ๋ฅ๋ง ์ต์ํ์ผ๋ก ํฌํจํ๋ ์คํํฑ ๋ฐ๋น์(Static Debian)์ด๋ผ๋ ๊ฐ๋ฒผ์ด ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ ์๋ฐ ์คํ ํ๊ฒฝ ๋ํ ๊ฐ๋ฐ์ ํ์ํ ๊ธฐ๋ฅ์ ๋ฐฐ์ ํ๊ณ ์คํ์ ํ์ํ ์ต์ํ์ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ง๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ ๋๊ตฌ๋ ์ ธ์ ์คํํ ์ ์์ผ๋ฉฐ ์ธ๋ถ ์ ๊ทผ์ผ๋ก๋ถํฐ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ ์ ์์ต๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค๋ ์๋ฐ ์ด์ธ์๋ ๋ ธ๋์ ์ด์์ค(Node.js), ํ์ด์ฌ(Python) ๋ฑ์ ์คํ ํ๊ฒฝ๋ฅผ ํฌํจํ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ํ์ํ ๊ฒฝ์ฐ ์คํํฑ ๋ฐ๋น์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์๋ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์์ ํน์ง์ ์์ฝํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
ํญ๋ชฉ | ๊ตฌ์ฑ | ์ฉ๋ | ์ฉ๋ |
---|---|---|---|
๋น์ง๋ฐ์ค | ๋ฆฌ๋ ์ค ๋ช ๋ น์ด ์ธํธ | ์๋ฒ ๋๋, ๋๋ฒ๊น | 1MB ๋ด์ธ |
์ํ์ผ ๋ฆฌ๋ ์ค | ๋น์ง๋ฐ์ค, ํจํค์ง ๋งค๋์ | ๋ฒ์ฉ ๋ฆฌ๋ ์ค ํ๊ฒฝ | 3MB ๋ด์ธ |
๋์คํธ๋ก๋ฆฌ์ค | ์ ํ๋ฆฌ์ผ์ด์ ์คํ ํ๊ฒฝ | ์ ํ๋ฆฌ์ผ์ด์ ์คํ | 100MB ๋ด์ธ |
์ผ๋ฐ openjdk ์ด๋ฏธ์ง์ ๋์คํธ๋ก๋ฆฌ์ค ํํ์ openjdk ์ด๋ฏธ์ง ๊ตฌ์ฑ ๋น๊ต
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๊ฐ ์ผ๋ฐ openjdk ์ด๋ฏธ์ง์ ๋น๊ตํ์ฌ ์ด๋ค ํน์ฑ์ ๊ฐ์ง๊ณ ์๋์ง ์ดํด๋ด ์๋ค. ์ผ๋ฐ openjdk ์ด๋ฏธ์ง๋ ์ค๋ผํด ๋ฆฌ๋ ์ค์ ์๋ฐ์ ๋น๋ ๋๊ตฌ์ ์คํ ํ๊ฒฝ์ด ๋ชจ๋ ํฌํจ๋ JDK(Java Development Kit)๋ฅผ ํฌํจํ๋ ์ด๋ฏธ์ง์ ๋๋ค. ์ ธ ์ ์์ด ๊ฐ๋ฅํ๋ฉฐ openjdk ์ด๋ฏธ์ง๋ก ๋ง๋ ์ปจํ ์ด๋ ๋ด๋ถ์์ ์๋ฐ ์์ค ์ฝ๋ ๋น๋ ๋ฐ ํจํค์ง ์์ฑ๊น์ง ๊ฐ๋ฅํฉ๋๋ค. openjdk ์ด๋ฏธ์ง ๋ด๋ถ๋ฅผ ํ์ธํด๋ด ์๋ค.
docker run -t --rm openjdk:21 /bin/bash
java -version
#
# openjdk version "21" 2023-09-19
# OpenJDK Runtime Environment (build 21+35-2513)
# OpenJDK 64-Bit Server VM (build 21+35-2513, mixed mode, sharing)
openjdk ์ด๋ฏธ์ง ๋ด๋ถ์ ์๋ฐ ๊ด๋ จ ํ์ผ๋ค์ด ๋ฌด์์ด ์๋์ง /usr/java/openjdk-21/bin
๋ด์ฉ์ ์ดํด๋ณด๋ฉด ๊ต์ฅํ ๋ง์ ํ์ผ๋ค(์ด 29๊ฐ)์ด ์์์ ์ ์ ์์ต๋๋ค. ํด๋น ํ์ผ๋ค์ด ๋ฌด์์ธ์ง ์์ธํ ์ค๋ช
ํ์ง๋ ์์ง๋ง ์๋ฐ ์คํ์ ํ์ํ java
ํ์ผ ์ด์ธ์๋ ์๋ฐ์ ๋น๋ ๋ฐ ๋๋ฒ๊น
๋๊ตฌ ๋ค์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
ls /usr/java/openjdk-21/bin
#
# jar jarsinger java javac javadoc javap jcmd jconsole jdb jdeprscan jdeps jfr jhsdb jimage jinfo jlink jmap jmod jpackage jps jrunscript jshell jstack jstat jstatd jwebserver keytool rmiregistry serialver
exit
#
# exit
์ ธ ์ ์์ด ๊ฐ๋ฅํ๋ฉฐ ๋ด๋ถ์์ openjdk๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ํ ํ์ธํ ์ ์์ต๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์ด๋ป๊ฒ ๋์ด ์์์ง ํ์ธํด๋ด ์๋ค.
docker run -t --rm gcr.io/distroless/java21-debian21 /bin/bash
#
# Error: Unable to access jarfile /bin/bash
/bin/bash
๋ช
๋ น์ด๋ก ์
ธ์ ์ ๊ทผํด๋ณด๋ ค ํ์ผ๋ jarfile
์ ์ ๊ทผํ ์ ์๋ค๋ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค. ์ ์ด๋ฐ ๋ฉ์์ง๊ฐ ๋ฐ์ํ๋์ง ํ์ธํด๋ณด๊ธฐ ์ํด ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ํตํด ๋ง๋ ์ปจํ
์ด๋๊ฐ ๊ตฌ๋ํ ๋ ์ด๋ค ๋ช
๋ น์ด๋ฅผ ์คํํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์ปจํ
์ด๋ ๊ตฌ๋ ์ ์คํํ ๋ช
๋ น์ด๋ ์ํธ๋ฆฌํฌ์ธํธ(ENTRYPOINT
)๋ก ์ ์ํ๋ฏ๋ก ์ด ๋ถ๋ถ์ ์ด๋ฏธ์ง์ ์์ธ ๋ช
์ธ๋ฅผ ํ์ธํ๋ docker inspect
๋ช
๋ น์ด๋ฅผ ํตํด ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
docker run -it --rm gcr.io/distroless/java21-debian12:latest | grep Entrypoint -A 3
#
# "Entrypoint": null,
# "OnBuild": null,
# "Labels": null,
# },
# --
# "Entrypoint": [
# "/usr/bin/java",
# "-jar"
# ]
#
์ํธ๋ฆฌํฌ์ธํธ์ ์ ์๋ ๋ด์ฉ์ ํ์ธํ๋ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํ ํ ๋ /usr/bin/java -jar
๋ช
๋ น์ด๋ฅผ ์คํํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์๋ฐ๋ฅผ ์คํํ๋ ๊ฒ์ ์๋ํ ์ด๋ฏธ์ง๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์์์ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํ ๋ ์ธ์๋ก ์ ๋ฌํ๋ /bin/bash
๋ ์ปจํ
์ด๋ ๋ด๋ถ์์ /usr/bin/java -jar /bin/bash
์ ํํ๋ก ์คํ๋์์ ๊ฒ์ด๋ฉฐ ๊ทธ๋์ /bin/bash
๋ผ๋ jarfile์ ์ ๊ทผํ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ํธ๋ฆฌํฌ์ธํธ๋ฅผ ์ฌ์ ์ํ์ฌ ์ปจํ
์ด๋ ๋ด๋ถ์ ์
ธ๋ก ์ ๊ทผํ์ฌ ๋ด์ฉ์ ๋ณผ ์ ์์์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. docker run
๋ช
๋ น์ด๋ฅผ ์คํํ ๋ --entrypoint
์ต์
์ผ๋ก ์ํธ๋ฆฌํฌ์ธํธ๋ฅผ ์ฌ์ ์ํ ์ ์์ต๋๋ค.
bash
์ sh
๋ช
๋ น์ด ๋ชจ๋ ๊ทธ๋ฌํ ํ์ผ์ด ์๋ค๋ ์ค๋ฅ๊ฐ ์ถ๋ ฅ๋์ด ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์
ธ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ด ์ ํ ์์์ ์ ์ ์์ต๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ก ๋ง๋ ์ปจํ
์ด๋๋ ํ ๋ฒ ๊ตฌ๋๋๋ฉด ์ปจํ
์ด๋ ๋ด๋ถ์ ์
ธ๋ก ์ ๊ทผํ์ฌ ์กฐ์์ ํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์ด๋ค ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์์ง ํ ๋ฒ ์์๋ด
์๋ค. ์ด๋ฅผ ์ํด์๋ ์ฝ๊ฐ์ ์ฐํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ๋ด๋ถ์ ์
ธ์ด๋ ๋ช
๋ น์ด๊ฐ ์์ด ์ปจํ
์ด๋๋ฅผ ์คํํ ์ดํ ์ปจํ
์ด๋์ exec
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ๋ด๋ถ์ ํ์ผ ์์คํ
๊ตฌ์กฐ๋ฅผ ์์๋ผ ์ ์์ต๋๋ค. ๊ทธ๋ ์ง๋ง ๋ฆฌ๋
์ค ๋ฐฐํฌํ๋ค์ ๋ฆฌ๋
์ค ํ์ผ์์คํ
๊ณ์ธต ๊ตฌ์กฐ ํ์ค(Filesystem Hierarchy Standard, FHS)๋ฅผ ์ค์ํ๊ณ ์์ต๋๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ์ปจํ
์ด๋ ๋ด๋ถ์ ํ์ผ ์์คํ
์ ๋ณผ๋ฅจ์ ๋ง์ดํธํ๋ฉด ๋ด๋ถ ํ์ผ ๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋จ ๋์ปค์ ์ ์ฝ์ผ๋ก ์ธํด /
๋๋ ํฐ๋ฆฌ์ ๋ง์ดํธ๋ ํ์ฉํ์ง ์์ผ๋ฏ๋ก FHS์์ ์ ์ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ณผ๋ฅจ์ผ๋ก ๋ง๋ค์ด ๋ง์ดํธ ํด์ผ ํฉ๋๋ค.
๋ค์ ๋ง์ ๋ด์ฉ๋ค์ด ํฌํจ๋์ด ์์ง๋ง, ๋ฆฌ๋ ์ค ํ์ผ์์คํ ๊ณ์ธต ๊ตฌ์กฐ ํ์ค์ ์ ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ณผ๋ฅจ์ผ๋ก ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
์ด์ ์์ ๋ณผ๋ฅจ์ ์ฌ์ฉํ์ฌ ์์์ ๋ง๋ ๋์คํธ๋ก๋ฆฌ์ค ๊ธฐ๋ฐ์ ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํด๋ด
์๋ค. ์ด๋ gcr.io/distroless/java21-debian12
์ด๋ฏธ์ง๊ฐ ์๋ ์ง์ ๋น๋ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ java21-debian12 ์ด๋ฏธ์ง๋ ์ํธ๋ฆฌํฌ์ธํธ์ /usr/bin/java -jar
๋ช
๋ น์ด๋ง ์ ์๋์ด ์ด ์ด๋ฏธ์ง๋ก ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํ ๊ฒฝ์ฐ ์คํํ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ด์ ์ค๋ฅ ๋ฉ์์ง์ ๋ช
๋ น์ด ์ฌ์ฉ๋ฒ๋ง ์ถ๋ ฅํ ํ ์ปจํ
์ด๋๊ฐ ์ข
๋ฃ๋์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ฌ ๋ด๋ถ๋ก JAR๋ฅผ ๋ณต์ฌํด์ค ํ ์ํธ๋ฆฌํฌ์ธํธ๋ฅผ ์ฌ์ ์ํด ์ปจํ
์ด๋๊ฐ ๊ตฌ๋๋ ๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
์ปจํ
์ด๋๊ฐ ๊ตฌ๋๋๊ณ ๋๋ฉด /var/lib/docker/volumes/
๋๋ ํฐ๋ฆฌ์์ ํ์ผ ์์คํ
๊ตฌ์กฐ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๋ณผ๋ฅจ ํ์์ bin
๋๋ ํฐ๋ฆฌ๋ ์ปจํ
์ด๋ ๋ด๋ถ์ bin
๋๋ ํฐ๋ฆฌ์ ๊ฐ์ต๋๋ค. ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์ด๋ค ๋ช
๋ น์ด๋ฅผ ๊ฐ์ง๊ณ ์์์ง ํ์ธํด๋ด
์๋ค.
ls /var/lib/docker/volumes/bin/_data/
#
#
์๋ฌด๋ฐ ๋ช ๋ น์ด๊ฐ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด ์ปจํ ์ด๋ ๋ด๋ถ๋ก ์ ๊ทผํ์ฌ๋ ์๋ฌด๋ฐ ์์ ์ ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ ๋ณด๋ฅผ ์กฐ์ํ๊ฑฐ๋ ํ์ทจํ๋ ๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋์คํธ๋ก๋ฆฌ์ค ๋ด๋ถ์ ์๋ฐ ์คํ ํ๊ฒฝ์ ๋ฌด์์ ์ฌ์ฉํ๊ณ ์์์ง ์์๋ด ์๋ค.
๋๋ ํฐ๋ฆฌ ์ด๋ฆ๊ณผ ์ถ๋ ฅ ๊ฒฐ๊ณผ์์ Temurin ์ด๋ผ๋ ๊ฒ๊ณผ JRE๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. Temurin์ openjdk ์ ๋ฐฐํฌํ์ ์ผ์ข ์ ๋๋ค. openjdk ๋ ์คํ ์์ค ํ๋ก์ ํธ๋ก ์ผ์ข ์ ํ์ค ์ญํ ์ ํ๋ฉฐ ์ฌ๋ฌ ํ์ฌ์ ์ปค๋ฎค๋ํฐ๊ฐ openjdk์ ์์ค๋ฅผ ์ด์ฉํ์ฌ ์์ ๋ค์ ํนํ ๋๊ตฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ต์ ํ๋ฅผ ์ํจ ํ ๊ฐ์์ ๋ฐฐํฌํ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฐํฌํ์ผ๋ก๋ Amazon Corretto, Azul Zulu ๋ฑ์ด ์์ผ๋ฉฐ Temurin ์ ์ดํด๋ฆฝ์ค(Eclipse) ์ฌ๋จ์ ์ง์์ ๋ฐ๋ openjdk ๋ฐฐํฌํ์ ๋๋ค. ๋ํ JRE(Java Runtime Environment) ๋ผ๋ ๋ถ๋ถ์์ ๊ฐ๋ฐ ๊ด๋ จ ๋๊ตฌ๋ค์ด ์ ์ธ๋ ์คํ ํ๊ฒฝ๋ง์ ํฌํจํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ค ์คํ ํ์ผ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํด๋ด ์๋ค.
openjdk ์ด๋ฏธ์ง(์ด 29๊ฐ)์ ๋น๊ตํ์ฌ ์คํ ํ์ผ์ ์(์ด 6๊ฐ)๊ฐ ๊ต์ฅํ ์ ์ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ์๊ฐ ์ค์ด๋๋ ๊ฒ์ด ์ด๋ป๊ฒ ๊ณต๊ฒฉ๋ฐ์ ์ง์ ์ด ์ค์ด๋๋์ง 1๊ฐ์ง ์๋ฅผ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. trivy
๋ฅผ ํตํด์ ๊ฒ์ถ๋ ์ทจ์ฝ์ ์ค์ Medium ๋ฑ๊ธ์ CVE-2021-35937 ์์ต๋๋ค.
ํด๋น ์ทจ์ฝ์ ์ ๋ฆฌ๋ ์ค์์ ์ค์น๋ฅผ ๋ด๋นํ๋ rpm๊ณผ ๊ด๋ จ๋ ๊ฒ์ผ๋ก ๋ฆฌ๋ ์ค ๊ถํ ๊ด๋ฆฌ ์ฒด๊ณ์ ์ถฉ๋์ ์ ๋ฐํ์ฌ ๋ถ์ฌ๋ ๊ถํ์ ๋ฒ์ด๋ ์์ ์ ์ํํ๋๋ก ํ๋ ์ํ์ฑ์ ๊ฐ์ก์ต๋๋ค.
์ด๋ฌํ ์ทจ์ฝ์ ์ ๊ฐ์ง ํจํค์ง๋ ๋์คํธ๋ฆฌ๋ก์ค ์ด๋ฏธ์ง์ ํฌํจ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ํด๋น ์ทจ์ฝ์ ์์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์์ ๋กญ์ต๋๋ค. ๊ทธ๋ฟ๋ง ์๋๋ผ, ์ด๋ฏธ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ ์ ธ ๋๋๊ฐ์ข ๋ช ๋ น์ด๋ฅผ ํฌํจํ์ง ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ํ ์ต์ํ์ ๋๊ตฌ์๋ง ์ง์คํ๊ณ ์์ด ์ฌ๋ฌ ๊ฐ์ง ์ทจ์ฝ์ ๋ฐ ์ํ์ ๋ ธ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. ๋ฌผ๋ก ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๊ฐ ๊ณต๊ฒฉ ์ง์ ์ ์ต์ํํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง, ๋ฐฐํฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ณต๊ฒฉ์ ๋์์ด ๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก ๋ณด์์ ์ํด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ ๋จ๊ณ์์๋ถํฐ ์์ ํ๊ฒ ์ฝ๋ฉํ๊ณ ์ด์ ๋จ๊ณ์์๋ ์นจ์ ์ ๊ฐ์งํ๊ณ ์ด๋ฅผ ๋น ๋ฅด๊ฒ ์กฐ์นํ ์ ์๋ ๋์์ ์๋ฆฝํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
CVE(Common Vulnerabilities and Exposures, ๊ณตํต ์ทจ์ฝ์ ๋ฐ ๋ ธ์ถ)
trivy๋ฅผ ํตํด ์ ๊ฒ๋ ์ทจ์ฝ์ ์ CVE๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ๋ด์ฉ์ ์ ๋ฆฌํด์ ๋ณด์ฌ์ค๋๋ค. CVE๋ ์ ์ธ๊ณ ๋ณด์ ๊ด๋ จ ๊ธฐ๊ด๋ค์ด ๋ฐ๊ฒฌํ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฏธ๊ตญ ์ ๋ถ์ ์ง์์ ๋ฐ๋ ๋น์๋ฆฌ ๊ธฐ๊ด MITRE๊ฐ ์ทจํฉํ์ฌ ๊ณ ์ ๋ฒํธ๋ฅผ ๋ถ์ฌํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ผ๋ก ์ ์ธ๊ณ์ ์ผ๋ก ๋ณด์ ์ทจ์ฝ์ ๊ด๋ฆฌ์ ํ์ค์ผ๋ก ์ฌ๊ฒจ์ง๊ณ ์์ต๋๋ค.
๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง์ ํ์ฌ์ ๋ฏธ๋
GoogleContainerTools์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ ์ค๋ ์๊ฐ๋์ ๋๋ฆฌ ์ฌ์ฉ๋์ด ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ปจ์
์ ์ด์ฉํด์azul/zulu-openjdk-distroless
์ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ ๊ณณ๋ ์๊ฒจ๋ฌ์ผ๋ฉฐ GoogleContainerTools์ ๋์คํธ๋ก๋ฆฌ์ค์ ํต์ฌ ๊ธฐ์ฌ์ ์ค ์ผ๋ถ๋ Chainguard๋ฅผ ์ฐฝ์
ํ๊ธฐ๋ ํ์์ต๋๋ค. ์ด์ ๊ฐ์ ํ๋ฆ์ ํ์
์ด ์ปจํ
์ด๋ ์ธํ๋ผ๊ฐ ํ์ฑํ๋๋ ๋งํผ ๋์คํธ๋ก๋ฆฌ์ค๋ ๋์ฑ๋ ์ธ๊ธฐ๋ฅผ ๋๊ฒ ๋ ๊ฒ์
๋๋ค. ํ์ฌ ๋์คํธ๋ก๋ฆฌ์ค๋ฅผ ์ ๊ณตํ๋ gcr.io๋ 2024๋
5์๋ถํฐ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ ์์ ์ด์ง๋ง, ๋๋ฉ์ธ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ์ผ์ ๊ธฐ๊ฐ ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ์ ๊ณตํ ๊ฒ์ผ๋ก ์์๋๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์๋๋๊ตฌ๊ธ ์ ํ๋ค์๊ฒ๋ ์ค์ํ ํฌ์ง์
์ ์ฐจ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด์ ๋ํ ์ง์์ ์ด์ด๋๊ฐ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค.
์ค์ ๋ก gcr.io
๋ ๊ตฌ๊ธ ๋ด๋ถ ์ ํ์ธ Google Container Registry๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๊ณ ์ด ๋ฐฑ์๋๊ฐ Artifact Registry๋ก ๋ฐ๋๋ ๋ถ๋ถ์ ์ํฅ์ ๋ฐ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋ฐ๋ผ์ ์์ผ๋ก๋ ๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ๋ ๊ฒ์๋ ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ ์ ๋ง์
๋๋ค.
๋ง์น๋ฉฐ
์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ์ฉ๋์ ์ค์ด๋ ๊ฒ์ ๋จ์ํ ์ฉ๋๋ง ์ค์ด๋๋ ๊ฒ ์๋ ์ฌ๋ฌ ์ด์ ์ด ์๋ค๋ ๊ฒ์ ์ด์ ์๊ฒ ๋์์ ๊ฒ์ ๋๋ค. ๊ทธ์ค์ ํนํ ๋น์ฉ๊ณผ ๋ณด์์ ํ๋์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ ๋ฐ ๋ฐฐํฌ์ ๋งค์ฐ ์ค์ํ ์์์ ๋๋ค. ๋ฐ๋ผ์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด๋ผ๋ฉด ์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ ๋ณด๋ค ์ฑ์๋ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ฌ์ฉํ๊ธธ ๋ฐ๋๋๋ค.
๋ฌผ๋ก ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ง์ด ์ด๋ฅผ ๊ตฌํํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด ์๋๋ฉฐ, AWS์ฌ์์๋ ์ข ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ ์ํ๊ณ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์์ฝํ๋ฉด ์ค์ ๋น๋์ ํ์ํ ๋ถ๋ถ๋ง ๊ธฐ์ด ์ด๋ฏธ์ง์ ๋ฃ๊ณ , ๋น๋ ์๋ฃ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๊ด์ ์ ๋๋ค. ์ฆ ๋์คํธ๋ก๋ฆฌ์ค์ ์ ์ฌํ์ง๋ง ์ข ๋ ์์ฒด์ ์ธ ์ฑ๊ฒฉ์ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์กฐ์ง์ ์ฑ์๋๊ฐ ๋๋ค๋ฉด ์ด๋ฌํ ๋ฐฉ๋ฒ๋ ๋งค์ฐ ์ข์ผ๋ ์ปจํ ์ด๋ ์ธํ๋ผ๋ฅผ ์ค๊ณํ๋ฉฐ ๋ณํํ๊ธฐ์๋ ์ด๋ ค์ด ๋ถ๋ถ์ด ๋ง์ด ์์ผ๋ ์ฑ์๋๊ฐ ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ์๋ ๋์คํธ๋ก๋ฆฌ์ค ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋ ์ฝ๊ณ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ผ ๊ฒ์ ๋๋ค.
์ ๋ต์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฏธ์ง์ ์ฉ๋์ ์ค์ด๋ ๊ฒ์ ๋จ์ํ์ง๋ง ๊ฐ๋ ฅํ ํ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค๋ ๋ฐ๋ก ์์ํด ๋ณด์๋ฉด ์ด๋จ๊น์?