[Docker] 4가지 방법으로 컨테이너 이미지 만들기
4.3 4가지 방법으로 컨테이너 이미지 만들기
4.3.1 기본 방법으로 빌드하기
자바소스 빌드 -> 도커파일 작성 -> 도커파일 빌드 -> 빌드 완료
- 도커 빌드에 사용 된 Dockerfile은 DSL로 작성된 파일이다.
FROM openjdk:8 LABEL description="Echo IP Java Application" EXPOST 60431 COPY ./abc.jar /opt/abc.jar WORKDIR /opt ENTRYPOINT ["java", "-jar", "abc.jar"]
도커 파일 내용 | 배시 명령으로 유사 해석 | 설명 | |
---|---|---|---|
1 | FROM openjdk:8 | import openjdk:8 image | openjdk를 기초 이미지로 사용한다. |
2 | LABEL description=”Echo IP Java Application” | Label_desc=”Echo IP Java Application” | 이미지에 부가적인 설명을 위한 레이블을 추가할 떄 사용 |
3 | EXPOST 60431 | EXPOST=60431 | 사용할 포트 |
4 | COPY ./abc.jar /otp/abc.jar | scp ./target/abc.jar /opt/abc.jar | 컨테이너 이미지로 필요한 파일 복사 |
5 | WORKDIR /opt | cd /opt | 이미지의 현재 작업 위치를 opt로 변경 |
6 | ENTRYPOINT [“java”, “-jar”, “abc.jar”] | ./java -jar .abc.jar | abc.jar를 java -jar 명령어를 통해 실행 |
# 생성한 이미지 확인
docker images basic-img
# 1.0 태그 이미지 생성
docker build -t basic-img:1.0
# sed를 이용한 Dockerfile 내용 중 일부 수정
sed -i 's/Application/Development/' Dockerfile
# 버전이 중복 되지 않도록 태그 2.0 으로 사용
docker build -t basic-img:2.0 .
# 컨테이너 동작
docker run -d -p 60431:80 --name basic-run --restart always basic-img
4.3.2 컨테이너 용량 줄이기
도커파일 작성 -> 도커파일 빌드 -> 빌드 완료
Dockerfile
FROM gcr.io/distroless/java:8 # 자바 실행을 위해 설계 된 가벼운 이미지
LABEL description="Echo IP Java Application"
EXPOST 60432
COPY ./abc.jar /opt/abc.jar
WORKDIR /opt
ENTRYPOINT ["java", "-jar", "abc.jar"]
- Dockerfile 에서 변경 된 FROM 에 distroless 는 자바 실행으 위해 경량화 된 이미지이다.
용량을 줄여 빌드한 컨테이너 이미지와 원래 빌드한 이미지를 비교.
# 현재 새로 생성된 이미지만 볼 수 있게 head -n 3 옵션을 추가
docker images | head -n 3
REPOSITORY TAG SIZE
optimal-img latest 145MB
basic-img latest 528MB
# 정상 작동하는지 확인
docker run -d -p 60432:80 --name optimal-run --restart always optimal-img
4.3.3 컨테이너 내부에서 컨테이너 빌드하기
도커파일 작성 -> 도커파일 빌드 -> 빌드 완료
FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOST 60433
RUN git clone https://github.com/iac-source/inbuilder.git # 이미지 내부에서 실행하기 위해 RUN을 추가
WORKDIR inbuilder # git clone으로 내려받은 디렉터리 현재 작업 공간으로 설정
RUN chmod 700 mvnw # mvnw에 실행 권한 설정
RUN ./mvnw clean package # 메이븐 래퍼로 JAR 빌드
RUM mv target/abc.jar /opt/abc.jar # 빌드된 jar를 옮김
WORKDIR /opt
ENTRYPOINT ["java", "-jar", "abc.jar"]
# docker 파일 빌드
docker build -t nohost-img
# 정상 작동 확인
docker run -d -p 60433:80 --name nohost-run --restart always nohost-img
# 빌드한 컨테이너 삭제
docker rm -f optimal-run
docker rm -f basic-run
docker rm -f nohost-run
4.3.4 최적화해 컨테이너 빌드하기
도커파일 작성 -> 도커파일 빌드 -> 빌드 완료
-
멀티 스테이지 빌드은 최종 이미지의 용량을 줄일 수 있고 호스트에 어떠한 빌드 도굴르 설치할 필요도 없다.
-
docker-ce 17.06 버전 부터 지원한다.
Dockerfile
# 1단계: 자바 소스를 빌드해 JAR로 만든다.
FROM openjdk:8 AS int-build # openjdk 이미지에 별칭을 붙인다.`
LABEL description="Echo IP Java Application"
RUN git clone https://github.com/iac-source/inbuilder.git
WORKDIR inbuilder
RUN chmod 700 mvnw
RUN ./mvnw clean package
# 2단계: 빌드 된 JAR를 경량화 이미지에 복사한다.
FROM gcr.io/distroless/java:8
LABEL description="Echo IP Java Application"
EXPOSE 60434 # 노출 되는 포트의 중복을 피하고자 변경.
COPY --from=int-build inbuilder/target/abc.jar /opt/abc.jar # 1단계에서 빌드가 완성된 jar를 distroless에 복사 함
WORKDIR /otp
ENTRYPOINT ["java", "-jar", "abc.jar"]
docker build -t multistage-img
- 컨테이너 이미지 중에
으로 표시되는 이미지가 있다, 이런 이미지를 댕글링 이미지라고 한다. - 멀티 스테이지 과정에서 자바 소스를 빌드하는 과정에 생성 된 이미지로, 불필요한 이미지이기에 삭제 한다.
docker rmi $(docker images -f danling=true -q)
# 정상 작동 확인 docker run -d -p 60434:80 --name multistage-run --restart always multistage-img
# 그동안 빌드한 컨테이너 삭제 docker rm -f optimal-run docker rm -f basic-run docker rm -f nohost-run docker rm -f multistage-run