Skip to content
joochaeyeon edited this page May 1, 2024 · 9 revisions
  • 💡1주차 질문

    1. VM과 Docker 차이

    ; VM보다 가볍고 경제적이며 확장 가능한 가상 시스템을 대체할 수 있는 방법이 Docker이다. Docker는 분산 응용프로그램을 개발할 수 있는 컨테이너 기반 기술이다.

    • VM이란?

       가상 시스템으로 하나의 하드웨어에 여러 개별 컴퓨터가 있는 것처럼 보이는 것으로 가상 시스템에는 기본 운영 체제가 필요하며 하드웨어가 가상화 된다. 
      
    • Docker란?

      컨테이너를 사용하여 응용 프로그램의 생성, 배포 및 실행을 쉽게 만드는 도구이다.                        
      
      컨테이너 내에서 응용프로그램 및 종속성을 바인딩한다.
      

    둘의 중요한 차이점은 운영 체제 지원, 보안, 이식성이다.

  1. 운영 체제 지원 image

위 사진을 보면 알 수 있듯이 VM과 도커 컨테이너의 운영 체제 지원이 매우 다르다.

가상시스템의 게스트 운영체제가 호스트 운영체제 위에 있으므로 가상 시스템이 무거워지는 반면 도커 컨테이너는 호스트 운영체제를 공유하기에 비교적 가벼워 컨테이너 시스템을 관리하는데 드는 처리시간이 가상 시스템에 비해 매우 낮다.

도커 컨테이너는 단일 운영 체제 커널에서 여러 응용 프로그램을 실행하려는 경우에 적합하다. 그러나 서로 다른 운영 체제 환경에서 실행해야 하는 어플리케이션이나 서버가 있는 경우에는 VM이 적합하다.

  1. 보안

    가상 시스템은 운영체제를 공유하지 않기 때문에 호스트 커널에서 분리가 된다. 따라서 컨테이너에 비해 더 안전하다. 테이너는 호스트 커널을 공유하기 때문에 보안 위험과 취약점이 많다. 또한 도커 리소스가 공유되고 네임스페이스가 없기 때문에 공격자가 하나의 컨테이너라도 액세스할 수 있으면 클러스터의 모든 컨테이너를 이용할 수 있다.  가상 머신에서는 리소스에 직접 액세스할 수 없으며, 하이퍼바이저는 VM의 리소스 사용을 제한한다.

  2. 이식성

    도커 컨테이너는 별도의 운영 체제가 없기 때문에 easily portable하다. 컨테이너를 다른 OS로 포팅하고 즉시 시작할 수 있다. 반면 가상 머신에서는 별도의 OS가 있어 컨테이너에 비해 가상 머신의 포팅이 어렵고, 크기 때문에 가상 머신을 포팅하는 데에도 많은 시간이 소요된다.

다양한 플랫폼에서 어플리케이션을 개발하고 테스트해야 한다면 도커 컨테이너를 사용하는 것이 이상적인 선택이다.

2. 스프링에서 도커 이미지 만들어주는 명령어 라이브러리 공부해서 알려주기

2-1.Docker Maven Plugin

프로젝트 pom.xml파일에 플로그인을 설정하여 Maven 빌드 중에 도커 이미지를 생성할 수 있다.

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>{플러그인 버전}</version>
    <configuration>
		    <!-- 생성될 이미지 이름 설정 -->
        <imageName>{이미지 이름}:{태그}</imageName>
        <!-- Dockerfile이 위치한 디렉토리 설정 -->
        <dockerDirectory>{도커 파일 디렉토리 경로}</dockerDirectory>
        <!-- 추적으로 필요한 리소스 설정 -->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
    <executions>
        <!-- Maven 빌드 중에 실행할 골 설정 -->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

2-2.Spotify Docker Maven Plugin

스프링 부트 애플리케이션의 JAR 파일을 기반으로 도커 이미지를 생성

 Maven 프로젝트의 **`pom.xml`** 파일에 플러그인을 추가
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>{플러그인 버전}</version>
    <configuration>
        <!-- 생성될 이미지 이름 설정 -->
        <imageName>{이미지 이름}:{태그}</imageName>
        <!-- Dockerfile이 위치한 디렉토리 설정 -->
        <dockerDirectory>{도커 파일 디렉토리 경로}</dockerDirectory>
        <!-- 추적으로 필요한 리소스 설정 -->
        <resources>
            <resource>
                <targetPath>/</targetPath>
                <directory>${project.build.directory}</directory>
                <include>${project.build.finalName}.jar</include>
            </resource>
        </resources>
    </configuration>
    <executions>
        <!-- Maven 빌드 중에 실행할 골 설정 -->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

**[ Docker Maven Plugin와의 차이점 ]**
  • Spotify Docker Maven Plugin는 Spotify에서 개발한 플러그인으로, 프로젝트의 Dockerfile을 기반으로 Docker 이미지를 빌드한다. Dockerfile과 함께 사용되며, Dockerfile을 수정하거나 커스터마이징하여 이미지 빌드 과정을 제어할 수 있다. 반면 Docker Maven Plugin은 Dockerfile 대신에 Maven 설정을 기반으로 이미지를 빌드하며, 추가적인 설정 없이도 기본적인 이미지 빌드를 제공한다.
  • Spotify Docker Maven Plugin은 Docker 설치를 필요로 하지 않으며 Docker Daemon에 의존하지 않고도 이미지를 빌드할 수 있다. 반면 Docker Maven Plugin은 Docker Daemon에 의존하여 Docker가 로컬 시스템에 설치되어 있어야 한다.

2-3.Spring Boot Maven Plugin

  스프링 부트 애플리케이션을 **패키징**하고, 도커 이미지를 생성
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>{플러그인 버전}</version>
    <configuration>
        <repository>{이미지 이름}</repository> //도커 이미지의 이미지이름과 태그를 의미
        <buildArgs>
            <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
    <executions>
        <execution>
            <id>default</id>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

[ 📍 Docker 이미지 자동 생성을 위한 라이브러리 중에는 Dockerfile을 사용하는 대신에 간단한 설정만으로 이미지를 생성할 수 있는 것들 ]

2-4. Jib

- 구글에서 만든 도커 이미지 빌드도구
- 빌드 프로세스와 도커 이미지 빌드를 분리하여 빠르고 효율적인 이미지 생성을 가능하게 한다.
- Docker 데몬에 의존하지 않고 바로 컨테이너 이미지를 빌드하기에 로컬에 Docker를 설치할 필요가 없다. 뿐만 아니라 Maven이나 Gradle 설정에 추가적인 Dockerfile작성이 필요하지 않다.
    
    → Maven 및 Gradle과 함께 사용 가능
    
- Spring Boot 애플리케이션에 Jib을 적용하려면 Maven 또는 Gradle 빌드 파일에 플러그인을 추가하면 된다. <br/>

2-5.Buildpacks

애플리케이션을 컨테이너 이미지로 변환하는 오픈 소스 도구로 애플리케이션의 언어, 프레임워크 및 종속성에 따라 빌드를 자동으로 처리한다.

Spring Boot와 함께 사용할 수 있으며, Spring Boot 애플리케이션을 빌드하고 이미지를 생성하기 위해 Spring Boot와 Buildpacks를 결합하여 사용할 수 있다.<br/><br/>

[Jib와 Buildpacks의 차이점]

Jib은 이미 빌드된 애플리케이션 JAR 파일을 이용하여 이미지를 빌드하는 반면, Buildpacks는 소스 코드나 JAR 파일을 이용하여 이미지를 빌드한다.