Docker 컨테이너를 처음부터 만드는 방법

DockerBeginner
지금 연습하기

소개

이 튜토리얼은 Docker Compose 를 사용하는 방법에 대한 포괄적인 가이드를 제공하며, "docker: 'compose' is not a docker command" 오류를 해결하는 데 중점을 둡니다. Docker Compose 를 설치 및 구성하고, 다중 컨테이너 애플리케이션을 구축 및 관리하며, 효과적인 Docker Compose 사용을 위한 최선의 사례를 살펴볼 것입니다.

Docker 기본 개념

Docker 컨테이너화 소개

Docker 는 애플리케이션 배포 및 개발을 혁신하는 강력한 컨테이너 기술입니다. 컨테이너 기술을 통해 개발자는 애플리케이션과 모든 종속성을 패키징하여 다양한 컴퓨팅 환경에서 일관적인 성능을 보장할 수 있습니다.

Docker 의 핵심 개념

Docker 란 무엇인가요?

Docker 는 애플리케이션 배포, 확장 및 관리를 자동화할 수 있도록 하는 오픈소스 컨테이너화 플랫폼입니다. 컨테이너를 통해 기존 가상 머신에 비해 가벼운 대안을 제공하여 격리된 환경을 생성합니다.

Docker 의 주요 구성 요소

구성 요소 설명
Docker Engine 컨테이너 생성 및 실행을 위한 핵심 런타임 환경
Docker Image 애플리케이션 코드와 종속성이 포함된 읽기 전용 템플릿
Docker Container Docker 이미지의 실행 가능한 인스턴스
Dockerfile 컨테이너 빌드 지침을 정의하는 텍스트 파일

Docker 아키텍처

graph TD
    A[Docker Client] --> B[Docker Daemon]
    B --> C[Container Runtime]
    B --> D[Image Registry]
    D --> E[Docker Hub]

기본 Docker 명령 및 예제

Ubuntu 22.04 에 Docker 설치

## 시스템 패키지 업데이트
sudo apt update

## Docker 종속성 설치
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=amd64 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 Engine 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

기본 Docker 작업

## Docker Hub에서 이미지 가져오기

## 사용 가능한 이미지 목록

## 컨테이너 실행

## 실행 중인 컨테이너 목록

## 컨테이너 중지

컨테이너 기술의 이점

Docker 컨테이너화는 다음과 같은 여러 가지 장점을 제공합니다.

  • 일관된 애플리케이션 환경
  • 더 빠른 배포 및 확장
  • 감소된 리소스 소비
  • 개선된 개발 워크플로우
  • 플랫폼 독립성

Docker 컨테이너의 활용 사례

Docker 는 다음과 같은 분야에서 널리 사용됩니다.

  • 마이크로서비스 아키텍처
  • 지속적 통합/지속적 배포 (CI/CD)
  • 클라우드 네이티브 애플리케이션 개발
  • 개발 및 테스트 환경

Docker Compose 워크플로우

Docker Compose 이해

Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하는 도구입니다. YAML 파일을 사용하여 애플리케이션 서비스, 네트워크 및 볼륨을 구성할 수 있으므로 복잡한 컨테이너화된 환경을 관리하는 프로세스를 단순화합니다.

Docker Compose 아키텍처

graph TD
    A[Docker Compose] --> B[docker-compose.yml]
    B --> C[Service 1]
    B --> D[Service 2]
    B --> E[Service 3]
    C --> F[Network]
    D --> F
    E --> F

Docker Compose 구성

YAML 파일 구조

설명
version Compose 파일 형식 버전
services 개별 컨테이너 정의
networks 컨테이너 네트워킹 구성
volumes 지속적인 데이터 저장소 관리

실제 예제: 웹 애플리케이션 배포

샘플 docker-compose.yml

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./website:/usr/share/nginx/html
  database:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: secretpassword
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Docker Compose 명령어

## Ubuntu 22.04에 Docker Compose 설치
sudo apt update
sudo apt install docker-compose

## compose 파일 유효성 검사
docker-compose config

## 다중 컨테이너 애플리케이션 시작
docker-compose up -d

## 실행 중인 컨테이너 보기
docker-compose ps

## 컨테이너 중지 및 제거
docker-compose down

서비스 조직 기술

Docker Compose 는 고급 서비스 조직을 가능하게 합니다.

  • 컨테이너 간 종속성 정의
  • 환경 변수 관리
  • 네트워크 연결 구성
  • 컨테이너 시작 순서 제어

확장성 및 유연성

다중 컨테이너 애플리케이션은 다음과 같은 이점을 얻습니다.

  • 모듈형 아키텍처
  • 쉬운 수평 확장
  • 단순화된 구성 관리
  • 일관된 개발 환경

Docker 고급 기술

Docker 네트워크 구성

네트워크 유형

네트워크 모드 설명
Bridge 기본 네트워크 모드
Host 호스트 네트워크 직접 사용
Overlay 다중 호스트 통신
Macvlan MAC 주소 할당
graph TD
    A[Docker Network] --> B[Bridge Network]
    A --> C[Host Network]
    A --> D[Overlay Network]
    A --> E[Macvlan Network]

사용자 정의 네트워크 생성

## 사용자 정의 브리지 네트워크 생성
docker network create --driver bridge custom_network

## 네트워크 목록
docker network ls

## 네트워크 세부 정보 확인
docker network inspect custom_network

컨테이너 리소스 관리

리소스 제약

services:
  webapp:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: "0.50"
          memory: 512M
        reservations:
          cpus: "0.25"
          memory: 256M

Docker 볼륨 관리

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

## 컨테이너에 볼륨 마운트
docker run -v app_data:/app/data nginx

## 볼륨 목록
docker volume ls

## 사용되지 않는 볼륨 제거
docker volume prune

Dockerfile 최적화

## 다단계 빌드 예제
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin
ENTRYPOINT ["myapp"]

고급 문제 해결

## 컨테이너 로그 검사

## 실시간 리소스 모니터링

## 컨테이너 프로세스 세부 정보

보안 강화

런타임 보안 옵션

## 읽기 전용 파일 시스템으로 컨테이너 실행
docker run --read-only nginx

## 컨테이너 기능 제한
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx

성능 모니터링

## 시스템 전체 Docker 정보
docker system info

## 디스크 사용량 분석
docker system df

## 사용되지 않는 리소스 제거
docker system prune -a

요약

이 튜토리얼을 마치면 Docker Compose 에 대한 심층적인 이해와 "docker: 'compose' is not a docker command" 오류를 해결하는 방법을 익히게 됩니다. 최적의 성능과 유지 관리를 위한 업계 표준의 최선의 방법을 따르면서 Docker Compose 애플리케이션을 설정, 관리 및 확장할 수 있게 될 것입니다.