Ubuntu 에 Docker 설치 및 구성 방법

DockerBeginner
지금 연습하기

소개

Dockerfile 은 Docker 이미지를 구축하는 기반이며, Entrypoint 및 Cmd 명령어를 이해하는 것은 컨테이너를 효과적으로 구성하고 실행하는 데 필수적입니다. 이 튜토리얼에서는 이 두 명령어의 차이점, 사용 사례, 최적의 컨테이너 설정 및 배포를 달성하기 위해 이들을 결합하는 최선의 방법에 대해 자세히 알아볼 것입니다.

Docker 기본 개념

Docker 소개

Docker 는 소프트웨어 개발 및 배포를 혁신하는 강력한 컨테이너화 기술입니다. 오픈소스 플랫폼으로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 패키징, 배포 및 실행할 수 있도록 지원합니다.

컨테이너화의 핵심 개념

컨테이너화는 전체 머신 가상화에 대한 경량 대안으로, 애플리케이션이 격리된 환경에서 실행될 수 있도록 합니다. Docker 는 컨테이너 기술을 사용하여 휴대성이 높고 효율적인 소프트웨어 배포 솔루션을 만듭니다.

graph TD A[애플리케이션 코드] --> B[Docker 컨테이너] B --> C[일관된 배포] B --> D[격리된 환경]

주요 Docker 구성 요소

구성 요소 설명 기능
Docker 엔진 핵심 런타임 컨테이너 수명주기를 관리
Docker 이미지 경량 템플릿 컨테이너 구성을 정의
Docker 컨테이너 실행 가능 인스턴스 애플리케이션을 실행

Ubuntu 22.04 설치

## 패키지 인덱스 업데이트
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 버전 확인
docker --version

## Docker Hub에서 이미지 가져오기
docker pull ubuntu:latest

## 로컬 이미지 목록
docker images

## 컨테이너 실행
docker run -it ubuntu:latest /bin/bash

컨테이너 수명주기 관리

Docker 는 컨테이너 생성, 실행, 중지 및 제거를 포함한 컨테이너 수명주기를 관리하기 위한 포괄적인 도구를 제공합니다. 컨테이너는 간단한 명령어로 쉽게 시작, 일시 중지 및 종료할 수 있습니다.

성능 및 효율성

컨테이너는 기존 가상화에 비해 상당한 이점을 제공합니다.

  • 최소한의 리소스 오버헤드
  • 빠른 시작 시간
  • 일관된 다중 환경 배포
  • 효율적인 리소스 활용

Dockerfile 숙달

Dockerfile 이해

Dockerfile 은 Docker 이미지를 구축하기 위한 순차적인 명령어가 포함된 텍스트 문서입니다. 일관되고 재현 가능한 컨테이너를 생성하는 데 필요한 환경, 종속성 및 구성을 정의합니다.

graph LR A[Dockerfile] --> B[Docker 빌드] B --> C[Docker 이미지] C --> D[Docker 컨테이너]

필수 Dockerfile 명령어

명령어 목적 예시
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"]

Python 애플리케이션을 위한 샘플 Dockerfile

## 기본 이미지
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 이미지 구축

## 태그가 지정된 이미지 구축
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 런타임 구성

컨테이너 실행 매개변수

Docker 는 컨테이너 런타임 동작을 제어하기 위한 광범위한 구성 옵션을 제공하여 리소스 할당, 네트워킹 및 실행 환경을 정밀하게 관리할 수 있도록 합니다.

graph LR A[Docker 런타임 구성] A --> B[리소스 제한] A --> C[네트워크 설정] A --> D[볼륨 매핑] A --> E[환경 변수]

런타임 구성 옵션

매개변수 설명 예시
-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 이미지를 만들 수 있습니다.