Dockerfile이 있는데 빌드 서버가 필요할까?
- 빌드 서버를 만들지 않는다면 각각의 개인 컴퓨터에 작업 환경을 전부 같이 세팅을 해야되므로 신규 개발자가 들어 왔을 때 환경 세팅에서만으로도 많은 시간을 쏟게 된다.
- Docerfile 스크립트를 작성한 후 이 이미지를 사용하여 애플리케이션을 패키징 할 수 있으므로 굳이 세팅할 필요가 없어진다.
애플리케이션 빌드 실전 예제 - 자바
- 본 예제는 https://github.com/sixeyed/diamol/tree/master 의 코드를 참조하여 만들었습니다.
FROM maven:3.8.4-openjdk-17-slim AS builder
WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY . .
RUN mvn package
# app
FROM openjdk:17
WORKDIR /app
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/app/iotd-service-0.1.0.jar"]
docker image build -t image-testing .
- 빌드를 마치면 이미지가 생성되는 것을 확인할 수 있다.
멀티 스테이지 Dockerfile 스크립트 이해하기
앞에서 봤던 Dockerfile 스크립트를 살펴보자
-
FROM maven:3.8.4-openjdk-17-slim AS builder : maven 3.8.4버전과 openjdk 17 버전의 이미지를 가져온 후 그 이름을 builder로 설정하였다.
-
WORKDIR /usr/src/iotd : 작업 디렉토리를 /usr/src/iotd로 설정한다.
-
COPY pom.xml . : pom.xml 파일을 복사한다.
-
RUN mvn -B dependency:go-offline : pom.xml에 있는 의존성을 오프라인으로 모두 복사한다.
-
COPY . . : 현재 디렉토리를 복사한다.
-
RUN mvn package : 현재 디렉토리를 기준으로 iotd-service-0.1.0.jar 파일을 생성한다.
-
FROM openjdk:17 : openjdk 17버전의 이미지를 기준으로 한다.
-
WORKDIR /app : 작업 디렉토리를 /app으로 설정한다
-
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar . : builder 에서 생성한 iotd-service-0.1.0.jar 를 복사해 가져온다.
-
EXPOSE 80 : 오픈 포트를 80번으로 지정한다.
-
ENTRYPOINT [“java”, “-jar”, “/app/iotd-service-0.1.0.jar”] : 컨테이너에 올라갔을 때 위 명령어를 실행하여 iotd-service-0.1.0.jar 파일을 실행한다.
멀티 스테이지 빌드란?
- 도커 이미지의 용량을 최소화하기 위해 빌드를 여러 번 거치는 과정이다.
- 이미지가 매우 많을 시 사소한 용량 차이가 큰 용량이 될 수 있기 때문에 위 과정은 중요하다고 볼 수 있다.
- 위 Dockerfile을 하나로 합친 경우
FROM maven:3.8.4-openjdk-17-slim AS builder
WORKDIR /usr/src/iotd
COPY pom.xml .
RUN mvn -B dependency:go-offline
COPY . .
RUN mvn package
EXPOSE 80
ENTRYPOINT ["java", "-jar", "/usr/src/iotd/target/iotd-service-0.1.0.jar"]
용량이 늘어난 것을 확인할 수 있다.
레지스트리에 이미지 공유하기
레지스트리, 리포지토리, 이미지 태그 다루기
- 레지스트리는 이미지를 다른 사람들이 이미지를 사용할 수 있도록 제공되는 장소이다. 기본값을 도커 허브로 지정되어 있다.
- 리포지토리는 일반적으로 애플리케이션의 이름에 해당되고, 하나의 리포지토리는 여러 버전의 이미지를 담을 수 있다.
- 이미지 태그는 애플리케이션의 버전 혹은 변종을 나타낸다. 기본값은 가장 최근 버전을 표시한다.
도커 허브에 직접 빌드한 이미지 push하기
- 도커 허브에 로그인 하기
docker login --username (유저 아이디)
- 기존 이미지에 새로운 이미지를 부여
docker image tag image-test bnh4924/image-test:v1
- 이미지 업로드 된 것을 확인할 수 있다.
로컬 네트워크에 전용 레지스트리가 있으면 편리한 점은 무엇인가?
- 버전 관리가 쉽다.
- 개인 컴퓨터에서 사용하므로 보안성이 좋다.
이미지 태그를 효율적으로 사용하기
- 새로운 이미지를 계속 제작하면서 이미지 태그를 버전처럼 사용하여 관리를 유용하게 할 수 있다.
실용 도커 기술
컨테이너와 호스트 사이에 파일 복사
- 컨테이너의 파일 시스템은 일시적인 것이므로 컨테이너가 삭제된다면 기존 컨테이너에 있는 데이터는 모두 손실된다.
- 도커는 이러한 상황을 방지하기 위해 도커 볼륨과 마운트 요소를 만들었다.
볼륨 마운트
바인드 마운트
- 원본이 될 폴더나 파일을 먼저 만들고 연결한다.
docker volume create (볼륨이름)
볼륨 마운트
- 볼륨 상위 커멘드를 사용해 먼저 볼륨을 생성한다.
docker run -v (실제 스토리지 경로):(컨테이너 마운트 경로)
docker run -v (볼륨 이름:(컨테이너 마운트 경로))
'docker' 카테고리의 다른 글
| Docker 4회차 실습 (0) | 2024.02.01 |
|---|---|
| Docker 4회차 (0) | 2024.02.01 |
| Docker 2회차 (1) | 2024.01.24 |
| Docker 1회차 실습 (0) | 2024.01.21 |
| Docker 1회차 (1) | 2024.01.21 |