애플리케이션 빌드를 위한 핵심 Docker 명령어

DockerBeginner
지금 연습하기

소개

이 포괄적인 튜토리얼은 애플리케이션 구축 및 관리를 위한 최상위 Docker 명령어를 안내합니다. Docker 설치 및 구성, 필수 Docker 명령어 및 컨테이너 수명 주기 탐색, 맞춤형 애플리케이션 환경 제작, 애플리케이션 배포 및 확장, 그리고 다중 컨테이너 애플리케이션을 위한 Docker Compose 활용 방법을 배울 것입니다. 이 튜토리얼을 마치면 Docker 를 사용하여 구축하는 강력한 Docker 명령어에 대한 확실한 이해를 얻게 될 것입니다.

Docker 소개: 컨테이너 및 그 이점 이해

Docker 는 애플리케이션 개발, 패키징 및 배포 방식을 혁신한 강력한 플랫폼입니다. 핵심적으로 Docker 는 컨테이너화 기술을 활용하여 애플리케이션과 그 종속성을 컨테이너라는 자립형 단위에 포장합니다. 이 접근 방식은 Docker 가 소프트웨어 개발 및 배포 환경에서 널리 채택되는 이유가 되는 다양한 이점을 제공합니다.

컨테이너 이해

컨테이너는 코드, 런타임, 시스템 도구 및 라이브러리와 같은 애플리케이션 실행에 필요한 모든 구성 요소를 포함하는 경량, 휴대용 및 자립형 소프트웨어 패키지입니다. 기존 가상 머신과 달리 컨테이너는 전체 운영 체제가 필요하지 않습니다. 대신 호스트 시스템의 커널을 공유하여 더욱 효율적이고 자원 친화적입니다.

컨테이너화의 이점

  1. 일관성 및 재현성: 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장하여 일관되고 예측 가능한 환경을 제공합니다.
  2. 확장성 및 유연성: 컨테이너는 쉽게 확장 및 축소할 수 있어 효율적인 자원 활용 및 애플리케이션의 동적 확장을 가능하게 합니다.
  3. 격리 및 보안: 컨테이너는 애플리케이션 간 충돌을 방지하고 독립적으로 실행되도록 보장하는 안전하고 격리된 환경을 제공합니다.
  4. 개발자 생산성 향상: 컨테이너화는 개발, 테스트 및 배포 프로세스를 단순화하여 개발자가 인프라 관리보다는 애플리케이션 구축에 집중할 수 있도록 합니다.
  5. 이식성 및 배포 단순화: 컨테이너는 다양한 플랫폼 및 환경에서 쉽게 패키징, 공유 및 배포할 수 있어 애플리케이션 배포 프로세스를 간소화합니다.

Docker 의 컨테이너화 역할

Docker 는 컨테이너 구축, 배포 및 관리를 위한 포괄적인 생태계를 제공하는 선도적인 컨테이너화 플랫폼입니다. 컨테이너화 프로세스를 단순화하는 다양한 도구와 기능을 제공합니다.

  1. Docker Engine: 컨테이너 생성 및 실행을 관리하는 Docker 의 핵심 구성 요소입니다.
  2. Docker Images: 애플리케이션 코드, 종속성 및 구성을 포함하는 표준화된 템플릿으로, 컨테이너의 일관된 생성을 가능하게 합니다.
  3. Docker Containers: 애플리케이션과 그 종속성을 포장하는 Docker 이미지의 실행 인스턴스입니다.
  4. Docker Registry: Docker 이미지를 저장 및 배포하는 중앙 레포지토리로, 애플리케이션의 공유 및 배포를 용이하게 합니다.

Docker 를 활용하여 개발자와 운영팀은 애플리케이션 개발, 테스트 및 배포 수명 주기를 간소화하여 효율성, 확장성 및 안정성을 높일 수 있습니다.

graph TD A[Docker Engine] --> B[Docker Images] B --> C[Docker Containers] C --> D[Docker Registry]

Docker 설치 및 구성: 플랫폼 시작 가이드

Docker 를 사용하기 전에 플랫폼에 설치 및 구성해야 합니다. 이 섹션에서는 Ubuntu 22.04 에서의 설치 과정을 안내합니다.

Ubuntu 22.04 에서 Docker 설치

  1. 패키지 인덱스를 업데이트하고 필요한 종속성을 설치합니다.
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 공식 Docker GPG 키를 추가하고 Docker 리포지토리를 설정합니다.
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. Docker Engine, Docker CLI 및 Docker Compose 를 설치합니다.
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker 설치 확인

설치 후 Docker 가 올바르게 설치되고 실행되는지 확인할 수 있습니다.

  1. Docker 버전을 확인합니다.
docker version
  1. 간단한 "Hello, World!" 컨테이너를 실행합니다.
docker run hello-world

설치가 성공하면 "Hello from Docker!" 메시지가 표시됩니다.

Docker 구성

기본적으로 Docker 데몬은 root 사용자로 실행됩니다. 모든 환경에서 바람직하지 않을 수 있습니다. 일반 사용자가 Docker 를 관리할 수 있도록 docker 그룹에 추가할 수 있습니다.

sudo usermod -aG docker your-username

변경 사항이 적용되려면 로그아웃하고 다시 로그인해야 합니다.

이제 Docker 가 설치 및 구성되었으므로 Docker 기본 사항을 탐색하고 첫 번째 Docker 기반 애플리케이션을 구축할 수 있습니다.

Docker 기본 개념: 필수 명령어 및 컨테이너 수명주기

Docker 를 효과적으로 사용하려면 Docker 컨테이너의 기본 명령어와 수명주기를 이해하는 것이 필수적입니다. 이 섹션에서는 가장 일반적으로 사용되는 Docker 명령어와 컨테이너 수명주기의 다양한 단계를 다룹니다.

필수 Docker 명령어

  1. docker run: 지정된 이미지에서 새 컨테이너를 생성하고 시작합니다.
  2. docker image ls: 시스템의 모든 Docker 이미지를 나열합니다.
  3. docker container ls: 실행 중인 모든 컨테이너를 나열합니다.
  4. docker container stop: 실행 중인 컨테이너를 중지합니다.
  5. docker container rm: 컨테이너를 제거합니다.
  6. docker image build: Dockerfile 에서 새 Docker 이미지를 빌드합니다.
  7. docker image push: Docker Hub 와 같은 레지스트리에 Docker 이미지를 푸시합니다.
  8. docker network create: 새 Docker 네트워크를 생성합니다.
  9. docker volume create: 새 Docker 볼륨을 생성합니다.
  10. docker-compose up: Docker Compose 파일에서 정의된 멀티 컨테이너 애플리케이션을 시작합니다.

Docker 컨테이너 수명주기

Docker 컨테이너의 수명주기는 다음 단계로 나눌 수 있습니다.

  1. 생성: docker run 명령어를 사용하여 Docker 이미지에서 컨테이너를 생성합니다.
  2. 실행: 컨테이너가 시작되고 애플리케이션이 실행됩니다.
  3. 일시 중지: 컨테이너의 프로세스가 일시 중지되지만 컨테이너 자체는 메모리에 남아 있습니다.
  4. 중지: 컨테이너의 애플리케이션이 중지되지만 컨테이너는 여전히 존재합니다.
  5. 재시작: 중지된 컨테이너를 재시작하여 실행을 다시 시작할 수 있습니다.
  6. 제거: docker container rm 명령어를 사용하여 컨테이너를 시스템에서 제거할 수 있습니다.
graph TD A[컨테이너 생성] --> B[컨테이너 실행] B --> C[컨테이너 일시 중지] B --> D[컨테이너 중지] D --> E[컨테이너 재시작] E --> B D --> F[컨테이너 제거]

이러한 필수 명령어와 컨테이너 수명주기를 이해하면 Docker 컨테이너를 효과적으로 관리하고 상호 작용할 수 있으며, 애플리케이션 구축 및 배포를 위한 기반을 마련할 수 있습니다.

Docker 이미지 생성: 맞춤형 애플리케이션 환경 구축

Docker 의 핵심 기능 중 하나는 사용자 정의 Docker 이미지를 구축하는 능력입니다. 이러한 이미지는 컨테이너화된 애플리케이션을 실행하는 기반이 되며, 특정 요구 사항에 맞는 맞춤형 환경을 생성할 수 있도록 합니다.

Docker 이미지 이해

Docker 이미지는 레이어화된 파일 시스템으로, 애플리케이션 코드, 종속성 및 기타 필요한 구성 요소를 포함합니다. Docker 컨테이너를 생성하는 템플릿 역할을 하며, 일관되고 재현 가능한 환경을 보장합니다.

Docker 이미지 생성

Docker 이미지를 생성하려면 Dockerfile 을 사용할 수 있습니다. Dockerfile 은 이미지를 구축하는 단계를 정의하는 텍스트 기반 스크립트입니다. 간단한 Node.js 애플리케이션을 위한 예시 Dockerfile 은 다음과 같습니다.

## 공식 Node.js 이미지를 기반으로 사용
FROM node:14

## 작업 디렉토리 설정
WORKDIR /app

## package.json 및 package-lock.json 파일 복사
COPY package*.json ./

## 애플리케이션 종속성 설치
RUN npm ci

## 애플리케이션 코드 복사
COPY . .

## 애플리케이션 빌드
RUN npm run build

## 애플리케이션 포트 노출
EXPOSE 3000

## 애플리케이션 시작
CMD ["npm", "start"]

이 Dockerfile 을 사용하여 Docker 이미지를 빌드하려면 다음 명령어를 실행합니다.

docker build -t my-node-app .

이 명령어는 태그 my-node-app이 있는 새 Docker 이미지를 생성합니다.

Docker 이미지 최적화

효율적이고 안전한 Docker 이미지를 보장하려면 다음과 같은 최선의 방법을 적용할 수 있습니다.

  1. 적절한 기본 이미지 사용: alpine 또는 debian-slim과 같은 작고 안전한 기본 이미지를 선택합니다.
  2. 이미지 레이어 최소화: Dockerfile 지침을 통합하여 이미지의 레이어 수를 줄입니다.
  3. 멀티 단계 빌드 활용: 빌드 및 런타임 환경을 분리하여 최종 이미지 크기를 줄이는 멀티 단계 빌드를 사용합니다.
  4. 취약점 검사: Trivy 또는 Snyk 와 같은 도구를 사용하여 Docker 이미지에 알려진 취약점을 검사합니다.
  5. 캐싱 전략 구현: Docker 의 캐싱 메커니즘을 활용하여 빌드 프로세스를 가속화합니다.

Docker 이미지 구축 기술을 숙달함으로써 애플리케이션에 맞춤화되고 최적화된 환경을 생성하여 원활한 배포 및 확장성을 가능하게 할 수 있습니다.

Docker 컨테이너 실행 및 관리: 애플리케이션 배포 및 확장

Docker 이미지를 구축한 후 다음 단계는 해당 이미지를 기반으로 컨테이너를 실행하고 관리하는 것입니다. 이 섹션에서는 컨테이너화된 애플리케이션을 배포하고 확장하기 위한 필수 명령어와 기술을 다룹니다.

Docker 컨테이너 실행

Docker 컨테이너를 실행하려면 docker run 명령어를 사용할 수 있습니다. Nginx 웹 서버 컨테이너를 실행하는 예는 다음과 같습니다.

docker run -d -p 80:80 --name my-nginx nginx

이 명령어는 다음과 같이 작동합니다.

  • -d: 컨테이너를 분리 모드 (백그라운드) 로 실행
  • -p 80:80: 호스트 포트 80 을 컨테이너 포트 80 으로 매핑
  • --name my-nginx: 컨테이너에 이름 "my-nginx" 할당
  • nginx: "nginx" Docker 이미지를 사용하여 컨테이너 생성

Docker 컨테이너 관리

컨테이너가 실행되면 다음 명령어를 사용하여 관리할 수 있습니다.

  • docker container ls: 모든 실행 중인 컨테이너 목록
  • docker container stop <container_name>: 실행 중인 컨테이너 중지
  • docker container start <container_name>: 중지된 컨테이너 시작
  • docker container rm <container_name>: 컨테이너 제거
  • docker container logs <container_name>: 컨테이너 로그 보기
  • docker container exec -it <container_name> <command>: 실행 중인 컨테이너 내에서 명령 실행

Docker 애플리케이션 확장

컨테이너화된 애플리케이션을 확장하려면 Docker 의 내장 기능을 사용하거나 Docker Swarm 또는 Kubernetes 와 같은 오케스트레이션 도구를 활용할 수 있습니다. Docker Swarm 을 사용하여 웹 애플리케이션을 확장하는 예는 다음과 같습니다.

  1. Docker Swarm 클러스터 생성:
docker swarm init
  1. Docker Swarm 서비스로 애플리케이션 배포:
docker service create --name my-web-app -p 80:80 my-web-app:latest
  1. 서비스를 여러 복제본으로 확장:
docker service scale my-web-app=3

이렇게 하면 my-web-app 서비스의 복제본이 3 개 생성되어 애플리케이션을 수평적으로 확장할 수 있습니다.

Docker 컨테이너를 실행, 관리 및 확장하는 방법을 이해하면 컨테이너화된 애플리케이션을 효과적으로 배포하고 유지 관리하여 고가용성과 확장성을 보장할 수 있습니다.

Docker 네트워킹 및 볼륨: 컨테이너 연결 및 데이터 지속

컨테이너화된 환경에서 네트워킹과 데이터 지속성은 복잡한 애플리케이션을 구축하고 관리하는 데 필수적입니다. Docker 는 이러한 요구 사항을 충족하기 위한 강력한 네트워킹 및 볼륨 기능을 제공합니다.

Docker 네트워킹

Docker 는 컨테이너가 서로 및 외부 세계와 통신할 수 있도록 여러 네트워킹 모드를 지원합니다.

  1. 브리지 네트워크: 동일한 호스트에서 컨테이너를 연결하는 기본 네트워크 모드입니다.
  2. 호스트 네트워크: 컨테이너는 호스트 머신과 동일한 네트워크 스택을 공유합니다.
  3. 오버레이 네트워크: 여러 Docker 호스트 간의 컨테이너 간 통신을 가능하게 합니다.
  4. Macvlan 네트워크: 컨테이너에 MAC 주소를 할당하여 물리적 네트워크 장치처럼 보이게 합니다.

커스텀 브리지 네트워크를 생성하고 컨테이너를 연결하려면 다음 명령어를 사용할 수 있습니다.

## 새로운 브리지 네트워크 생성
docker network create my-network

## 컨테이너 실행 및 네트워크 연결
docker run -d --name my-app --network my-network my-app:latest

Docker 볼륨

Docker 볼륨은 컨테이너에서 생성된 데이터를 지속적으로 유지하여 컨테이너가 중지되거나 제거될 때 데이터가 손실되지 않도록 하는 방법을 제공합니다. 여러 유형의 볼륨이 있습니다.

  1. 이름이 지정된 볼륨: Docker 에서 관리하는 고유한 이름을 가진 볼륨입니다.
  2. 바인드 마운트: 호스트 머신의 디렉토리와 컨테이너를 매핑합니다.
  3. tmpfs 마운트: 호스트에 데이터를 지속하지 않는 메모리 내 파일 시스템입니다.

이름이 지정된 볼륨을 생성하고 컨테이너에서 사용하는 예는 다음과 같습니다.

## 이름이 지정된 볼륨 생성
docker volume create my-volume

## 컨테이너 실행 및 볼륨 마운트
docker run -d --name my-db -v my-volume:/data my-db:latest

Docker 의 네트워킹 및 볼륨 기능을 이해하면 서로 통신하고 컨테이너 수명 주기 전반에 걸쳐 데이터를 지속할 수 있는 고도로 확장 가능하고 강력한 애플리케이션을 구축할 수 있습니다.

Docker Compose: 다중 컨테이너 애플리케이션 조정

Docker 는 개별 컨테이너를 실행하는 강력한 플랫폼을 제공하지만, 복잡하고 다중 서비스 애플리케이션을 관리하는 것은 번거로울 수 있습니다. 이때 Docker Compose 가 등장하여 전체 애플리케이션 스택의 배포를 정의하고 조정할 수 있도록 합니다.

Docker Compose 이해

Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행할 수 있도록 하는 도구입니다. YAML 기반 구성 파일을 사용하여 애플리케이션을 구성하는 서비스, 네트워크 및 볼륨을 지정합니다.

Docker Compose 파일 정의

데이터베이스가 있는 간단한 웹 애플리케이션을 위한 Docker Compose 파일 예제는 다음과 같습니다.

version: "3"

services:
  web:
    build: .
    ports:
      - "80:8080"
    depends_on:
      - db
  db:
    image: postgres:12
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

이 구성은 webdb 두 개의 서비스를 정의합니다. web 서비스는 현재 디렉토리에서 이미지를 빌드하고 호스트의 포트 80 을 컨테이너의 포트 8080 으로 매핑합니다. db 서비스는 공식 Postgres 12 이미지를 사용하고 데이터 지속성을 위해 이름이 지정된 볼륨을 마운트합니다.

Docker Compose 사용

Docker Compose 를 사용하려면 다음 단계를 따르세요.

  1. 프로젝트 디렉토리에 Docker Compose 파일을 만듭니다.
  2. 애플리케이션을 관리하기 위해 다음 명령어를 실행합니다.
    • docker-compose up -d: 분리된 모드로 애플리케이션을 시작합니다.
    • docker-compose down: 애플리케이션을 중지하고 제거합니다.
    • docker-compose ps: 실행 중인 서비스를 나열합니다.
    • docker-compose logs: 애플리케이션의 로그를 확인합니다.

Docker Compose 는 다중 컨테이너 애플리케이션의 배포 및 관리를 간소화하여 서비스의 수명 주기를 조정하고 개발 및 배포 프로세스의 여러 단계에서 일관된 환경을 보장합니다.

Docker 개발을 위한 최고의 실무: 워크플로 최적화

Docker 에 대한 이해도가 높아짐에 따라, 개발 워크플로를 최적화하고 Docker 기반 애플리케이션의 장기적인 유지보수를 보장하는 최고의 실무를 채택하는 것이 중요합니다. 이 섹션에서는 고려해야 할 몇 가지 주요 최고의 실무에 대해 설명합니다.

일관된 명명 규칙 채택

Docker 이미지, 컨테이너, 네트워크 및 볼륨에 대한 일관된 명명 규칙을 설정합니다. 이는 환경을 정리하고 리소스를 관리하기 쉽게 합니다. 예를 들어, <애플리케이션>-<서비스>-<환경>과 같은 명명 체계를 사용할 수 있습니다.

다단계 빌드 활용

다단계 빌드를 통해 빌드 및 런타임 환경을 분리하여 더 작고 안전한 Docker 이미지를 생성할 수 있습니다. 이 접근 방식은 빌드 프로세스가 자원 집약적이고 최종 런타임 이미지가 상당히 작을 수 있는 컴파일 언어에 특히 유용합니다.

지속적인 통합 및 배포 구현

지속적인 통합 (CI) 및 지속적인 배포 (CD) 파이프라인에 Docker 를 통합합니다. 이를 통해 Docker 기반 애플리케이션을 자동으로 빌드, 테스트 및 배포하여 일관성을 확보하고 수동 작업을 줄일 수 있습니다.

Docker 환경 모니터링 및 보안

Prometheus, Grafana 및 Sysdig 와 같은 도구를 사용하여 Docker 환경의 상태 및 성능을 모니터링합니다. 또한 이미지 취약점 검사, 액세스 제어 적용 및 Docker 데몬 및 엔진을 최신 상태로 유지하는 등의 보안 최고의 실무를 적용합니다.

Docker 이미지 레이어 최적화

Docker 이미지의 레이어 수를 최소화하기 위해 Dockerfile 을 신중하게 구성합니다. 이는 명령어를 통합하고 캐싱 전략을 활용하여 빌드 프로세스를 가속화하는 방식으로 달성할 수 있습니다.

로컬 개발을 위한 Docker Compose 활용

Docker Compose 를 사용하여 로컬 개발 환경을 정의하고 관리합니다. 이를 통해 애플리케이션 스택을 설정하고 해제하는 작업이 용이해지며, 다양한 개발 머신에서 일관성을 확보할 수 있습니다.

Docker 생태계 최신 정보 유지

새로운 기능, 최고의 실무 및 보안 업데이트를 포함한 Docker 생태계의 최신 개발 동향을 계속 파악합니다. Docker 문서를 정기적으로 검토하고 Docker 커뮤니티에 참여하여 최신 정보를 얻으십시오.

이러한 최고의 실무를 따르면 Docker 개발 워크플로를 최적화하고 Docker 기반 애플리케이션의 품질과 유지보수성을 향상시키며 원활하고 효율적인 개발 경험을 보장할 수 있습니다.

요약

이 튜토리얼에서는 애플리케이션을 빌드하고 관리하는 필수적인 Docker 명령어를 배웠습니다. Docker 설치 및 구성부터 사용자 지정 이미지 제작, 컨테이너 실행 및 관리, 다중 컨테이너 애플리케이션 조정까지, 이제 효율적이고 확장 가능한 애플리케이션 개발을 위해 Docker 의 기능을 활용할 수 있는 지식과 도구를 갖추게 되었습니다. 이러한 Docker 명령어를 숙달하면 애플리케이션을 쉽게 빌드, 배포 및 관리할 수 있습니다.