Search
Duplicate
📒

[Docker Container] 0x. Dockerfile 실습, 쿠버

상태
미진행
수업
Docker Container
주제
기본개념
4 more properties
참고

4가지 방법으로 컨테이너 이미지 만들기

NOTE
컨테이너 인프라 환경을 구성할 때 이미 제공된 이미지를 사용하는 경우도 있지만, 직접 만든 애플리케이션으로 컨테이너를 만들 수도 있다!

기본 방법으로 빌드하기

NOTE
# mvn 빌드 ./mvnw clean package # 도커 빌드 docker build -t basic-img . docker build -t basic-img:1.0 -t basic-img:2.0 . # 캐시 때문에 빠르게진행 # 도커 실행 docker run -d -p 60431:80 --name basic-run --restart always basic-img
Bash
복사
FROM openjdk:8 LABEL description="Echo IP Java Application" EXPOSE 60431 COPY ./target/app-in-host.jar /opt/app-in-image.jar WORKDIR /opt ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
OpenJDK를 사용하는 이유는 JDK가 2019년부터 구독 방식으로 변경되어, 오픈소스인 OpenJDK를 사용한다.
현재 구동중인 호스트의 가상 인터페이스 IP(192.168.32.10)의 로컬 호스트 IP(127.0.0.1)의 60431포트에 요청을 보내면 출발지의 IP가 다르게 나온다.
도커 컨테이너는 docker0에 부여된 172.17.0.0/16 CIDR의 IP를 할당받는다. 따라서 현재 생성된 컨테이너는 해당 범위내의 IP를 가지고 있으며 이 컨테이너는 모든 네트워크 어댑터의 60431번 포트로 들어오는 요청을 컨테이너 내부로 전달되도록 옵션을 설정했다.
이 옵션을 설정하면 외부 IP에서 들어오는 요청을 컨테이너 내부 IP에 보내도록 설정된다.
192.168.32.10 → 192.168.32.10 (60431)로 전송됨
127.0.0.1의 경우에는 내부 IP에서 컨테이너 내부로 요청을 전달할 경우, docker-proxy 프로세스가 컨테이너 내부로 요청을 전달하는 역할을 하며 이 과정에서 도커가 사용하는 네트워크 인터페이스의 IP인 172.17.0.1을 출발지로 사용한다.
따라서 docker-proxy 프로세스에 문제가 발생하면 내부 IP로는 컨테이너 내부에 요청전달이 불가하다.
컨테이너 내부에서 호스트 외부 IP와 포트로 요청을 보낼 수 없다.
자세한건 헤어핀 NAT에 대해서 학습

컨테이너 용량 줄이기

NOTE
# mvn 빌드 chmod 700 mvnw ./mvnw clean package # 도커 빌드 docker build -t optimal-img . # 도커 실행 docker run -d -p 60431:80 --name basic-run --restart always basic-img
Bash
복사
FROM gcr.io/distroless/java:8 # 경량화 이미지 사용 LABEL description="Echo IP Java Application" EXPOSE 60432 COPY ./target/app-in-host.jar /opt/app-in-image.jar WORKDIR /opt ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
용량차이 비교

컨테이너 내부에서 컨테이너 빌드하기

NOTE
FROM openjdk:8 LABEL description="Echo IP Java Application" EXPOSE 60433 RUN git clone https://github.com/iac-source/inbuilder.git WORKDIR inbuilder RUN chmod 700 mvnw RUN ./mvnw clean package RUN mv target/app-in-host.jar /opt/app-in-image.jar WORKDIR /opt ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
docker build -t nohost-img .
Bash
복사

컨테이너 최적화 빌드(멀티 스테이지 빌드)

NOTE
# 자바 소스를 빌드해 JAR로 생성 FROM openjdk:8 AS int-build LABEL description="Java Application builder" RUN git clone https://github.com/iac-source/inbuilder.git WORKDIR inbuilder RUN chmod 700 mvnw RUN ./mvnw clean package # 빌드된 JAR을 경량화 이미지에 복사 FROM gcr.io/distroless/java:8 LABEL description="Echo IP Java Application" EXPOSE 60434 COPY --from=int-build inbuilder/target/app-in-host.jar /opt/app-in-image.jar WORKDIR /opt ENTRYPOINT [ "java", "-jar", "app-in-image.jar" ]
Docker
복사
docker build -t multistage-img .
Bash
복사