4-1. Dockerfile이 있는데 빌드 서버가 필요할 까?
1. 멀티 스테이지 빌드: 복잡한 앱을 하나의 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
cd ch04/exercises/multi-stage
docker image build -t multi-stage .
4-2. 애플리케이션 빌드 실전 예제: 자바 소스 코드
FROM diamol/maven AS builder
WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline # 메이븐 실행에 필요한 의존 모듈 다운
COPY . . # 도커 빌드중인 디렉토리에 위치한 모든 파일과 서브 디렉을 이미지 내 작업 디렉으로 복사
RUN mvn package # 자바 소스코드를 jar 포멧 어플리케이션으로 만듬.
# app
FROM diamol/openjdk # 자바 11 Runtime포함, maven은 미포함 상태의 파일
WORKDIR /app
COPY --from=builder /usr/src/iotd/target/ioid-service-0.1.0.jar . #멀티 스테이지인 builder(diamol/maven)에서 생성한 jar파일을 복사
EXPOSE /80 # 80번 포트를 외부로 공개(웹 서버 어플리케이션)
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"] # CMD와 같은 기능으로, 위 이미지를 이용하여 컨테이너 실행 시 도커가 위 명령을 실행하며 java -jar /app/iotd-service-0.1.0.jar이 실행되며 어플을 빌드
cd ch04/exercises/image-of-the-day
docker image build -t image-of-the-day .
docker network create nat
docker container run --name iotd -d -p 800:80 --network nat image-of-the-day # 컨테이너의 80번 포트를 호스트의 800번 포트에 공개하고 nat 네트워크에 컨테이너를 접속하라.
4-2. 애플리케이션 빌드 실전 예제: Node.js 소스 코드
FROM diamol/node AS builder # node.js 런타임과 npm이 현재 설치된 이미지
WORKDIR /src # 작업 디렉을 만들고
COPY src/package.json . # 이미지 내 json을 작업 디렉에 복사
RUN npm install # 모든 의존 모듈을 내려받는다??? 로 아마 아래의 server.js가 생긴듯
#app
FROM diamol/node # 멀티 스테이지
EXPOSE 80 # 포트 공개 80번(호스트에게)
CMD ["node", "server.js"] # node server.js를 실행
WORKDIR /app # 작업 디렉 따로 만들고
COPY --from=builder /src/node_modules/ /app/node_modules/ # 생성된 노드 모듈들을 복사
COPY src/ . # 작업디렉의 내용을 복사
빌드코드
cd ch04/exercises/access-log
docker image build -t access-log .
docker container run --name accesslog -d -p 801:80 --network nat access-log
4-4. 애플리케이션 빌드 실전 예제: Go 소스 코드