DockerFile → (Build) → Image → (Create) → Container
도커 파일(Docker File)
도커 파일은 도커 이미지를 빌드하는 출발점으로, 이미지를 구성하기 위한 명령어들을 작성한 스크립트입니다. 이 도커 파일에는 컨테이너를 구동하기 위해 필요한 정보가 작성되어 있으며, 이를 빌드하면 이미지가 생성되며, 애플리케이션 빌드 및 배포를 자동화할 수 있습니다.
# 사용할 베이스 이미지
FROM java:17
# 작업 디렉토리 설정
WORKDIR /app
# Gradle 빌드 캐시를 가져옴
COPY gradle gradle
# Gradle 설정 파일 및 응용 프로그램 소스 코드를 가져옴
COPY gradlew* ./
COPY build.gradle settings.gradle ./
COPY src ./src/
# gradlew 파일을 실행 가능하도록 권한 설정
RUN chmod +x gradlew
# 실행 가능한 JAR 파일을 생성합니다.
RUN ./gradlew clean build
# 실행 가능한 JAR 파일을 복사합니다.
COPY build/libs/myApp.jar .
# 최종 이미지
FROM java:17
# 작업 디렉토리 설정
WORKDIR /app
# JAR 파일 복사
COPY --from=builder /app/myApp.jar .
# 어플리케이션 실행
CMD ["java", "-jar", "myApp.jar"]
Docker FIle 명령어
- FROM : 베이스 이미지를 지정합니다.
- LABEL : 메타데이터를 이미지에 추가합니다.
- ENV : 환경변수를 설정합니다.
- WORKDIR : 작업 디렉터리를 설정합니다.
- COPY : 호스트 내에 있는 파일 또는 디렉터리를 컨테이너의 파일 시스템으로 복사합니다.
- ADD : 파일 또는 디렉터리를 컨테이너로 복사합니다.
- RUN : 명령어를 실행하여 새 이미지에 포함시킵니다.
- USER : 명령을 실행할 사용자명과 사용자 그룹을 설정합니다.
- EXPOSE : 컨테이너로 들어오는 트래픽을 특정 포트로 받아들일 수 있도록 지정합니다.
- VOLUME : 컨테이너 내의 특정 디렉터리를 컨테이너 외부 경로에 마운트 시켜줍니다.
- ENTRYPOINT : 컨테이너 시작 시 실행될 명령어를 지정하며, 파라미터는 변경할 수 없습니다.
- CMD : 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
도커 이미지(Docker Image)
도커 이미지는 애플리케이션을 실행하는 데 필요한 실행 파일, 설정 값 등을 포함한 파일로, 별도로 의존성 파일을 컴파일하거나 다양한 소프트웨어를 설치할 필요가 없는 상태입니다. 도커 이미지는 소스 코드, 라이브러리, 종속성, 도구 및 애플리케이션을 실행하는 데 필요한 기타 파일을 포함하는 변경이 불가능한 파일입니다. 이는 런타임 환경을 위한 템플릿 역할을 하며, 이미지를 컨테이너에 담아 실행시키면 해당 프로세스가 동작하게 됩니다. 이미지는 특정 시점의 애플리케이션과 가상 환경을 나타내는 읽기 전용 스냅샷입니다. 이러한 일관성은 개발자가 안정적이고 균등한 조건에서 소프트웨어를 테스트하고 개발할 수 있도록 도와줍니다.
도커 이미지의 특징
- 독립적인 실행 환경 제공 : 도커 이미지는 애플리케이션 실행에 필요한 모든 것을 포함하여 독립적인 환경을 제공합니다.
- 불변성 : 도커 이미지는 변경할 수 없는 상태로, 컨테이너 생성 시 추가되는 레이어만 수정이 가능합니다.
- 일관성 : 동일한 이미지를 사용하여 일관된 개발, 테스트 및 배포 환경을 제공합니다.
도커 이미지의 생성 방식
- 레이어 기반 구조 : 도커 이미지는 여러 개의 읽기 전용 레이어로 구성됩니다. 새로운 파일이 추가되거나 기존 파일이 변경될 때마다 새로운 레이어가 생성됩니다.
- 효율적인 저장 및 전송 : 기존 이미지를 다시 다운로드하지 않고, 필요한 부분만 새로운 레이어로 추가하여 효율적으로 이미지를 생성하고 관리합니다.
- 파일 시스템 통합 : 도커는 여러 개의 레이어를 하나의 파일 시스템으로 묶어 사용할 수 있게 해줍니다.
도커 이미지 생성 명령어
docker build -t optimalprice/backend:latest .
도커 컨테이너(Docker Container)
도커 컨테이너는 애플리케이션을 실행할 수 있는 격리된 환경을 제공하는 기술입니다. 리눅스의 chroot, 네임스페이스(namespace), cgroup과 같은 기능을 이용하여 프로세스 단위로 격리된 공간을 생성합니다. 이는 가상화된 환경을 구축하지만 가상 머신에 비해 성능 손실이 거의 없으며, 필요한 커널을 공유하여 리소스를 효율적으로 사용할 수 있습니다.
도커 컨테이너의 정의 및 특징
- 가상화 기술 사용 : 리눅스의 기능을 이용하여 격리된 실행 환경을 생성합니다. 이는 프로세스의 격리를 통해 애플리케이션을 독립적으로 실행할 수 있게 합니다.
- 이미지 기반 실행 : 도커 이미지를 기반으로 생성됩니다. 이미지는 여러 읽기 전용 레이어로 구성되며, 컨테이너는 이 이미지를 실행하여 쓰기 가능한 레이어를 추가하여 변경 사항을 보존합니다.
- 경량화 및 빠른 배포 : 이미지는 애플리케이션의 종속성과 실행 파일만을 포함하므로 용량이 작고 빠르게 배포할 수 있습니다.
- 지속성 : 컨테이너가 종료되더라도 컨테이너의 읽기/쓰기 레이어는 보존되며, 이를 기반으로 새로운 컨테이너를 다시 생성할 수 있습니다. 이미지 자체는 변경되지 않고 보존됩니다.
- 독립적 실행 : 하나의 호스트에서 여러 개의 독립적인 컨테이너를 실행할 수 있습니다. 각 컨테이너는 자체적으로 격리된 프로세스 환경을 제공받습니다.
- 리소스 공유 : 컨테이너는 호스트 운영 체제의 커널 공간과 자원을 공유하며, 필요한 경우 호스트와의 네트워크 및 파일 시스템을 연결하여 데이터를 공유할 수 있습니다.
도커 이미지와 컨테이너의 차이
도커 이미지와 도커 컨테이너는 도커 플랫폼에 의해 정의된 시스템의 일부입니다. 컨테이너가 존재하려면 이미지를 실행해야 하는 반면, 이미지는 컨테이너 없이 존재할 수 없습니다. 즉, 컨테이너는 이미지에 종속돼 런타임 환경을 구성하고 애플리케이션을 실행하는 데 사용됩니다. 도커 이미지는 도커 컨테이너에서 코드를 실행하며, 실행 중인 컨테이너를 만들려면 도커 이미지에 핵심 기능의 쓰기 기능 계층(Writable container)을 추가해야 합니다. 그리고 도커 컨테이너는 실행 중인 이미지를 인스턴스로 간주하여, 각각의 고유한 데이터와 상태를 가진 동일한 이미지에서 여러 개의 인스턴스를 만들어 낼 수 있습니다. 컨테이너 채택의 주요 이점은 개발, 운영 및 테스트의 표준화 및 단순화입니다. 그리고 CI/CD 파이프라인은 컨테이너를 빌드, 테스트 및 패키징 할 수 있으며, 다음 배포 시 해당 컨테이너를 애플리케이션의 일부로 실행할 수 있는 런타임 환경에 배포합니다. 간단하게 설명하면 도커 이미지는 설계서, 컨테이너는 설계서로 만들어진 상품입니다. 그리고 이미지가 중간에 바뀌게 되더라도 기존 컨테이너는 더 이상 이미지에 영향을 받지 않습니다.
※쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있습니다.
'🐬Docker[도커]' 카테고리의 다른 글
[Docker] What is Docker? 도커에 대해 알아보자! (0) | 2024.04.05 |
---|