소개
Dockerfile 은 Docker 이미지를 구축하는 기반이며, Entrypoint 및 Cmd 명령어를 이해하는 것은 컨테이너를 효과적으로 구성하고 실행하는 데 필수적입니다. 이 튜토리얼에서는 이 두 명령어의 차이점, 사용 사례, 최적의 컨테이너 설정 및 배포를 달성하기 위해 이들을 결합하는 최선의 방법에 대해 자세히 알아볼 것입니다.
Dockerfile 은 Docker 이미지를 구축하는 기반이며, Entrypoint 및 Cmd 명령어를 이해하는 것은 컨테이너를 효과적으로 구성하고 실행하는 데 필수적입니다. 이 튜토리얼에서는 이 두 명령어의 차이점, 사용 사례, 최적의 컨테이너 설정 및 배포를 달성하기 위해 이들을 결합하는 최선의 방법에 대해 자세히 알아볼 것입니다.
Docker 는 소프트웨어 개발 및 배포를 혁신하는 강력한 컨테이너화 기술입니다. 오픈소스 플랫폼으로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 패키징, 배포 및 실행할 수 있도록 지원합니다.
컨테이너화는 전체 머신 가상화에 대한 경량 대안으로, 애플리케이션이 격리된 환경에서 실행될 수 있도록 합니다. Docker 는 컨테이너 기술을 사용하여 휴대성이 높고 효율적인 소프트웨어 배포 솔루션을 만듭니다.
| 구성 요소 | 설명 | 기능 |
|---|---|---|
| Docker 엔진 | 핵심 런타임 | 컨테이너 수명주기를 관리 |
| Docker 이미지 | 경량 템플릿 | 컨테이너 구성을 정의 |
| Docker 컨테이너 | 실행 가능 인스턴스 | 애플리케이션을 실행 |
## 패키지 인덱스 업데이트
sudo apt update
## 종속성 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Docker 공식 GPG 키 추가
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Docker 리포지토리 설정
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Docker 엔진 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## Docker 버전 확인
docker --version
## Docker Hub에서 이미지 가져오기
docker pull ubuntu:latest
## 로컬 이미지 목록
docker images
## 컨테이너 실행
docker run -it ubuntu:latest /bin/bash
Docker 는 컨테이너 생성, 실행, 중지 및 제거를 포함한 컨테이너 수명주기를 관리하기 위한 포괄적인 도구를 제공합니다. 컨테이너는 간단한 명령어로 쉽게 시작, 일시 중지 및 종료할 수 있습니다.
컨테이너는 기존 가상화에 비해 상당한 이점을 제공합니다.
Dockerfile 은 Docker 이미지를 구축하기 위한 순차적인 명령어가 포함된 텍스트 문서입니다. 일관되고 재현 가능한 컨테이너를 생성하는 데 필요한 환경, 종속성 및 구성을 정의합니다.
| 명령어 | 목적 | 예시 |
|---|---|---|
| FROM | 기본 이미지 선택 | FROM ubuntu:22.04 |
| RUN | 쉘 명령어 실행 | RUN apt-get update |
| COPY | 파일 이미지로 복사 | COPY app/ /application |
| WORKDIR | 작업 디렉토리 설정 | WORKDIR /application |
| ENV | 환경 변수 설정 | ENV APP_VERSION=1.0 |
| EXPOSE | 컨테이너 포트 정의 | EXPOSE 8080 |
| CMD | 기본 컨테이너 명령어 | CMD ["python", "app.py"] |
## 기본 이미지
FROM python:3.9-slim
## 작업 디렉토리 설정
WORKDIR /application
## 프로젝트 파일 복사
COPY . /application
## 종속성 설치
RUN pip install --no-cache-dir -r requirements.txt
## 애플리케이션 포트 노출
EXPOSE 5000
## 애플리케이션 실행
CMD ["python", "app.py"]
## 태그가 지정된 이미지 구축
docker build -t myapp:v1 .
## 생성된 이미지 목록
docker images
## 이미지 세부 정보 확인
docker inspect myapp:v1
## 빌드 단계
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn package
## 런타임 단계
FROM openjdk:11-jre-slim
COPY --from=build /app/target/app.jar /application.jar
ENTRYPOINT ["java", "-jar", "/application.jar"]
Docker 는 컨테이너 런타임 동작을 제어하기 위한 광범위한 구성 옵션을 제공하여 리소스 할당, 네트워킹 및 실행 환경을 정밀하게 관리할 수 있도록 합니다.
| 매개변수 | 설명 | 예시 |
|---|---|---|
| -m, --memory | 메모리 제한 | docker run -m 512m image |
| --cpus | CPU 리소스 할당 | docker run --cpus=2 image |
| -p, --publish | 포트 매핑 | docker run -p 8080:80 image |
| -v, --volume | 볼륨 마운팅 | docker run -v /host:/container image |
| --env | 환경 변수 | docker run --env KEY=value image |
## CPU 및 메모리 제한으로 컨테이너 실행
docker run -d \
--name webapp \
--memory=512m \
--cpus=1.5 \
--restart=always \
myapp:latest
## 사용자 지정 네트워크 생성
docker network create mynetwork
## 특정 네트워크에서 컨테이너 실행
docker run -d \
--network mynetwork \
--network-alias webapp \
myapp:latest
## 이름이 지정된 볼륨 생성
docker volume create appdata
## 컨테이너에 볼륨 마운트
docker run -v appdata:/app/data \
-d myapp:latest
## CMD vs ENTRYPOINT 예시
FROM python:3.9
WORKDIR /app
COPY . .
ENTRYPOINT ["python"]
CMD ["app.py"]
## 컨테이너 런타임 검사
docker inspect container_name
## 실시간 리소스 모니터링
docker stats container_name
이 자세한 가이드에서는 Dockerfile 에서 Entrypoint 및 Cmd 명령어, 그 차이점, 그리고 최적의 컨테이너 구성 및 배포를 위해 이들을 함께 사용하는 방법을 살펴보았습니다. 각 명령어의 역할을 이해하고 최선의 방법을 따르면 애플리케이션의 요구 사항을 충족하는 더 효율적이고 안정적인 Docker 이미지를 만들 수 있습니다.