728x90
๋ฐ์ํ
4. ์ ํ๋ฆฌ์ผ์ด์ ์์ค ์ฝ๋์์ ๋์ปค ์ด๋ฏธ์ง ๊น์ง
4.1 Dockerfile ์ด ์๋๋ฐ ๋น๋ ์๋ฒ๊ฐ ํ์ํ ๊น?
- ํ ๋จ์์ ์์ ์ด ์งํ๋ ๊ฒฝ์ฐ ๋น๋ ๋๊ตฌ ํต์ผ์ด ํ์ํ๋ค.
- ํด๋น ์์ ์ ์ ์ง ๋ณด์๋ฅผ ์ํ ํฐ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
- ๊ทธ๋ฌ๋, Dockerfile ๋ก ๋น๋ ํด ์ฒด์ธ์ ํ ๋ฒ์ ํจํค์งํด์ ๊ณต์ ํด์ ์ฌ์ฉํ๋ค๋ฉด ์ ์ง ๋ณด์ ๋น์ฉ์ด ๋ํญ ๊ฐ์ํ๊ฒ ๋๋ค.
FROM diamol/base AS build-stage
RUN echo 'Building...' > /build.txt
FROM diamol/base AS test-stage
COPY --from=build-stage /build.txt /build.txt
RUN echo 'Testing...' >> /build.txt
FROM diamol/base
COPY --from=test-stage /build.txt /build.txt
CMD cat /build.txt
- ๊ฐ ๋น๋ ๋จ๊ณ๋ ์๋ก ๊ฒฉ๋ฆฌ๋ผ ์๋ค.
- ๋น๋ ๋จ๊ณ๋ณ๋ก ๊ธฐ๋ฐ ์ด๋ฏธ์ง๋ ๋ค๋ฅผ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ ์๋ ๋๊ตฌ๋ ๋ฌ๋ผ์ง๋ค.
- ๋ง์ง๋ง ๋น๋ ๋จ๊ณ์ ์ฐ์ถ๋ฌผ์ ์ด์ ๋น๋ ๋จ๊ณ์์ ๋ช ์์ ์ผ๋ก ๋ณต์ฌํด ์จ ๊ฒ๋ง ํฌํจํ ์ ์๋ค.
- ํ ๋จ๊ณ๋ผ๋ ๋ช ๋ น์ด ์คํจํ๋ฉด ์ ์ฒด ๋น๋๊ฐ ์คํจํ๋ค.
$ docker image build -t multi-stage .
[+] Building 4.0s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 566B 0.0s
=> WARN: DuplicateStageName: Duplicate stage name "test-stage", stage names should be unique (line 13) 0.0s
=> [internal] load metadata for docker.io/diamol/base:latest 3.4s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [build-stage 1/2] FROM docker.io/diamol/base:latest@sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7 0.0s
=> => resolve docker.io/diamol/base:latest@sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7 0.0s
=> => sha256:787fe221a14f46b55e224ea0436aca77d345c3ded400aaf6cd40125e247f35c7 1.40kB / 1.40kB 0.0s
=> => sha256:bd5e8ce69bca67190f789625870f8130d67069c4761b36ed7ecfa6dcbc6fdfd7 738B / 738B 0.0s
=> => sha256:e65ed3e91e579a862befe0d866ffe1e3377d64245c9e9fd82fffaf9e3c961f49 1.65kB / 1.65kB 0.0s
=> [build-stage 2/2] RUN echo 'Building...' > /build.txt 0.2s
=> [test-stage 2/3] COPY --from=build-stage /build.txt /build.txt 0.0s
=> [test-stage 3/3] RUN echo 'Testing...' >> /build.txt 0.1s
=> [stage-4 2/2] COPY --from=test-stage /build.txt /build.txt 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:499c256287f9fa71674b34f0a2d3ea3b25af235104c75c473091ec53fca12b59 0.0s
=> => naming to docker.io/library/multi-stage 0.0s
2 warnings found (use docker --debug to expand):
- DuplicateStageName: Duplicate stage name "test-stage", stage names should be unique (line 13)
- JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 19)
- 1๋จ๊ณ. ์์กด ๋น๋ ๋ชจ๋์ ๋ด๋ ค๋ฐ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ค.
- 2๋จ๊ณ. ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณต์ฌํ ํ ํ ์คํธ๋ฅผ ์งํํ๋ค.
- 3๋จ๊ณ. ํ ์คํธ๊ฐ ๋๋ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณต์ฌํ๋ค.
- ์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ํ ์ด์์ฑ์ ํ๋ณดํ ์ ์๋ค.
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํด ์ด๋ค ํ๊ฒฝ์์๋ ๋น๋ ๋๊ตฌ๋ฅผ ์ค์ ์ง์ค์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
- ๋ํ, ๋์ปค ํ๋ธ๋ฅผ ํตํด ์ฃผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ๋๊ตฌ๊ฐ ํฌํจ๋ ์ด๋ฏธ์ง๋ค์ด ์์ด. ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ต์ ํ ๋ฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
4.2 ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ์ค์ ์์ : ์๋ฐ ์์ค ์ฝ๋
# maven, OpenJDK ๊ธฐ๋ฐ ์ด๋ฏธ์ง
FROM diamol/maven AS builder
# pom.xmnl ๋ณต์ฌ
WORKDIR /usr/src/iotd
COPY pom.xml .
# ํ์ํ ์์กด์ฑ ๋ค์ด๋ก๋
RUN mvn -B dependency:go-offline
# ๋๋จธ์ง ์์ค์ฝ๋ ๋ณต์ฌ.
# ๋์ปค ๋น๋๊ฐ ์คํ ์ค์ธ ๋๋ ํฐ๋ฆฌ์ ํฌํจ๋ ๋ชจ๋ ํ์ผ๊ณผ ์๋ธ ๋๋ ํฐ๋ฆฌ๋ฅผ ํ์ฌ ์ด๋ฏธ ๋ด ์์
๋๋ ํ ๋ฆฌ๋ก ๋ณต์ฌ
COPY . .
# ๋น๋ ํจํค์ง
RUN mvn package
FROM diamol/openjdk
# ์์
๋๋ ํ ๋ฆฌ ์์ฑ
WORKDIR /app
# ์์
๋๋ ํ ๋ฆฌ์ ๋น๋๋ฅผ ํตํด ๋์จ jar ํ์ผ ๋ณต์ฌ
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .
# 80 ํฌํธ ์ธ๋ถ๋ก ๊ณต๊ฐ
EXPOSE 80
# jar ํ์ผ ์คํ
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"]
$ docker build -t image-of-the-day .
$ docker network create nat
$ docker container run --name iotd -d -p 8080:80 --network nat image-of-the-day
- ์ต์ข ์ ์ผ๋ก ์์ฑ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง์ ๋น๋ ๋๊ตฌ๋ ํฌํจ๋์ง ์ํ๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง์๋ ๋์ปค ํ์ผ์ ์ ์๋ ๋น๋ ๋จ๊ณ ์ค ๋ง์ง๋ง ๋จ๊ณ์ ์ปจํ ์ธ ๋ง ํฌํจ๋๋ค.
- ์ฆ, ํฌํจ์ํค๊ณ ์ถ์ ์ปจํ ์ธ ๊ฐ ์๋ค๋ฉด ์ต์ข ๋จ๊ณ์์ ๋ช ์์ ์ ์ฝํ ์ธ ๋ฅผ ๋ณต์ฌํด ์์ผ ํ๋ค.
4.3 ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ์ค์ ์์ : Node.js ์์ค ์ฝ๋
- Node.js ๋ Java ์ ์ปดํ์ผ ์ธ์ด์๋ ๋ค๋ฅธ ์ธํฐํ๋ฆฌํฐํ ์ธ์ด๋ก ๋ณ๋์ ์ปดํ์ผ ์ ์ฐจ๊ฐ ํ์ ์๋ค.
- ์ปจํ ์ด๋ํ๋ Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ค๋ฉด Node.js ๋ฐํ์๊ณผ ์์ค ์ฝ๋๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง์ ํฌํจ๋์ด์ผ ํ๋ค.
FROM diamol/node AS builder
# ์์กด์ฑ์ด ์ ์๋ package.json ํ์ผ ๋ณต์ฌ
WORKDIR /src
COPY sr/package.json .
# ์์กด์ฑ ๋ค์ด๋ก๋
RUN npm install
#app
FROM diamol/node
EXPOSE 80
CMD ["node", "server.js"]
WORKDIR /app
# ํธ์คํธ์ ์ ํ๋ฆฌ์ผ์ด์
์ํฐํฉํธ ๋ชจ๋ ๋ณต์ฌ
COPY --from=builder /src/node_modules/ /app/node_modules/
COPY src/ .
- ์์ ๊ฐ์ด ์ ์ํ์ฌ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์กด์ฑ ๋ชจ๋์ ๋์ปค ์ด๋ฏธ์ง ๋ ์ด์ด ์บ์์ ์ ์ฅ๋๋ค.
- ๋ฐ๋ผ์, ๋ณ๋์ ์์กด ๋ชจ๋ ์ถ๊ฐ๊ฐ ์์ ๊ฒฝ์ฐ ๋ค์ ๋ฒ ๋น๋๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์งํ๋๋ค.
4.4 ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ ์ค์ ์์ : Go ์์ค ์ฝ๋
- Go ๋ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ก ์ปดํ์ผ๋๋ ํ๋์ ์ธ ํฌ๋ก์ค ํ๋ซํผ ์ธ์ด๋ค.
- ์ฆ, ์ด๋ค ํ๋ซํผ(์๋์ฐ, ๋ฆฌ๋ ์ค, amd64, ARM) ์ด๋ ํด๋น ํ๋ซํผ์ ๋ง๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์ปดํ์ผ ํ ์ ์๋ค.
- ๋ํ, ๋ณ๋์ ๋ฐํ์์ด ํ์์์ด ๋์ปค ์ด๋ฏธ์ง ํฌ๊ธฐ๊ฐ ๋งค์ฐ ์์์ง๋ค.
- Docker ๋ํ Go ์ธ์ด๋ก ๊ตฌํ๋์๋ค.
FROM diamol/golang AS builder
COPY main.go .
# ์์กด์ฑ ์์ด ๋ฐ๋ก ๋น๋
RUN go build -o /server
# app
FROM diamol/base
# ํ๊ฒฝ๋ณ์ ์ค์
ENV IMAGE_API_URL="<http://iotd/image>" \\
ACCESS_API_URL="<http://accesslog/access-log>"
CMD ["/web/server"]
WORKDIR web
COPY index.html .
COPY --from=builder /server .
RUN chmod +x server
$ docker image ls -f reference=diamol/golang -f reference=image-gallery
REPOSITORY TAG IMAGE ID CREATED SIZE
image-gallery latest 412cedb50233 27 seconds ago 26.2MB
diamol/golang latest e0b7365f308e 2 hours ago 803MB
- ์์ ๋ช ๋ น์ด๋ฅผ ํตํด ๋ฒ ์ด์ค ์ด๋ฏธ์ง์ ์ ํ์ด ์ผ๋ง๋ ์ค์ํ์ง๋ฅผ ์ ์ ์๋ค.
- ๋ฆฌ๋ ์ค ํ๊ฒฝ + ๋น๋ ๋๊ตฌ ํฌํจ๋ ์ด๋ฏธ์ง๋ ์ฝ 800MB ์ด์ง๋ง, ๋์ปค ์ ํ๋ฆฌ์ผ์ด์ ๋ง ์๋ ์ด๋ฏธ์ง๋ ์ฝ 26MB ์ ๋์ด๋ค.
- Go ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์ ๋ณ๋์ ๋น๋ ๋๊ตฌ๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ์์ ๊ฐ์ด ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ต์ํ ํด์ Docker ์ ํน์ฅ์ ์ธ ๊ฒฝ๋ํ๋ฅผ ์ด๋ฆด ์ ์๋ค.
4.5 ๋ฉํฐ ์คํ ์ด์ง Dockerfile ์คํฌ๋ฆฝํธ ์ดํดํ๊ธฐ
- ๋ฉํฐ ์คํ ์ด์ง Dockerfile ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ์ ์ปจํ ์ด๋ ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๋น๋ํ๋ ๊ฒ์ ๋ํ ์ด์
A. ํ์คํ
- ๊ฐ์ธ์ ์ด์์ฒด์ ํ๊ฒฝ๊ณผ ๊ฐ์ธ ๋ก์ปฌ์ ๋น๋ ๋๊ตฌ์ ๋ํ ์ ์ฝ์ด ์๋ค.
- ๋ชจ๋ ๋น๋ ๊ณผ์ ์ด ๋์ปค ์ปจํ ์ด๋ ๋ด๋ถ์์ ์ด๋ค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋์ปค ๋ด๋ถ์ ๋น๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์คํ๋ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ด๋ ์๋ฒ ๊ด๋ฆฌ ๋ฐ ๊ฐ์ธ ๊ฐ๋ฐ์ ๋๊ตฌ ๋ฒ์ ์ฐจ์ด๋ก ์ธํ ๋น๋ ์คํจ ๋ฌธ์ ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
B. ์ฑ๋ฅ ํฅ์
- ๋ฉํฐ ์คํ ์ด์ง ๋น๋์ ๊ฐ ๋จ๊ณ๋ ์์ ๋ง์ ์บ์๋ฅผ ๋ฐ๋ก ๊ฐ๋๋ค.
- ๋์ปค๋ ๋น๋ ์ค์ ๊ฐ ์ธ์คํธ๋ญ์ ์ ํด๋นํ๋ ์บ์๋ฅผ ์ฐพ๋๋ค.
- Dockerfile ์คํฌ๋ฆฝํธ๋ฅผ ์ต์ ํ ํ๋ค๋ฉด ์บ์ ์ฌ์ฌ์ฉ์ ํตํด 90% ์ด์์ ๋น๋ ๋จ๊ณ์์ ์๊ฐ์ ์ ์ฝํ ์ ์๋ค.
C. ์์ ์ด๋ฏธ์ง
- ๋ฉํฐ ์คํ ์ด์ง Dockerfile ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ต์ข ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ฅํ ์๊ฒ ์ ์งํ ์ ์๋ค.
- ์ต์ ํ ๊ณผ์ ์ ํตํด ์คํ์ ํ์ํ ๋๊ตฌ๋ง์ ํฌํจ์ํด์ผ๋ก์จ ์ต์ข ์ด๋ฏธ์ง๋ ๊ฐ๋ฒผ์์ง๊ณ , ๋ชจ๋์ ์์กด์ฑ์ด ์์์ง๋ฉฐ ์์กด์ฑ์ ๋ํ ์ํ์ฑ ๋ํ ์์์ง๋ค.
4.6 ์ฐ์ต๋ฌธ์
- Go ์ธ์ด ๋ฉํฐ ์คํ ์ด์ง Dockerfil ๋ฅผ ์์ ํ์ฌ Linux ํ๊ฒฝ ์ด๋ฏธ์ง๋ ์ฝ 15MB, ์๋์ฐ ํ๊ฒฝ ์ด๋ฏธ์ง๋ ์ฝ 260MB ๊ฐ ๋๋๋ก ๋ง๋ค๊ธฐ.
- HTML ํ์ผ์ ์์ ํด๋ ์ฌ๋น๋ ์ ๋น๋ ๋จ๊ณ๊ฐ ํ ๋จ๊ณ๊ฐ ๋๋๋ก ์์ ํ๊ธฐ.
๋ฌธ์ Dockerfile ์คํฌ๋ฆฝํธ
FROM diamol/golang
WORKDIR web
COPY index.html .
COPY main.go .
RUN go build -o /web/server
RUN chmod +x /web/server
CMD ["/web/server"]
ENV USER=sixeyed
EXPOSE 80
- ์ฑ๊ธ ์คํ ์ด์ง ๋น๋ → ๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ก ๋ณ๊ฒฝ.
- diamol/golang ์ ๊ฒฝ์ฐ ๋น๋์ ํ์ํ ๋น๋ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ด๋ฏธ์ง ํ์ผ
- Go ์ธ์ด์ ๊ฒฝ์ฐ ์คํ ์ ๋น๋ ๋๊ตฌ๊ฐ ํ์ ์์ผ๋ฏ๋ก diamol/base ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝ
๋์ ํ์ด
FROM diamol/golang AS builder
COPY main.go .
RUN go build -o /web/server
# app
FROM diamol/base
WORKDIR /web
ENV USER=sixeyed
EXPOSE 80
CMD ["./server"]
COPY index.html .
COPY --from=builder /web/server ./server
RUN chmod +x ./server
$ docker image build -t ch04-lab .
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ch04-lab latest a21288fc2013 About a minute ago 25.9MB
์ ๋ต
FROM diamol/golang AS builder
COPY main.go .
RUN go build -o /server
RUN chmod +x /server
# app
FROM diamol/base
EXPOSE 80
CMD ["/web/server"]
ENV USER="sixeyed"
WORKDIR web
COPY --from=builder /server .
COPY index.html .
- chmod ๊ถํ ๋ช ๋ น์ ๊ฒฝ์ฐ์๋ builder ๋ก ์ฎ๊ฒผ์ผ๋ฉด ์ ๋ง ๊ทผ์ ํ์ ๋ฏ.
728x90
๋ฐ์ํ