Docker 기초부터 실무 활용까지: 컨테이너 운영 핵심 개념 정리

Docker란 무엇인가?

Docker는 애플리케이션을 격리된 환경에서 실행할 수 있도록 해주는 컨테이너 기반 가상화 플랫폼입니다. 개발 및 배포 환경의 일관성을 보장하며, 시스템 자원을 효율적으로 사용할 수 있습니다.

기본 설치 및 설정

Linux 환경(CentOS 기준)에 Docker를 설치하고, 국내 사용자를 위한 레지스트리 미러를 설정하는 방법은 다음과 같습니다:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://docker.xuanyuan.me"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

이 설정을 통해 이미지 다운로드 속도를 크게 향상시킬 수 있습니다.

주요 명령어 요약

이미지 관리

  • 검색: docker search nginx (현재 네트워크 문제로 제한적)
  • 다운로드: docker pull nginx:1.26.0
  • 목록 확인: docker images
  • 삭제: docker rmi [IMAGE_ID 또는 태그]

컨테이너 운영

백그라운드에서 Nginx 컨테이너를 실행하려면:

docker run -d --name web-server -p 88:80 nginx:1.26.0
  • -d: 백그라운드 실행
  • --name: 컨테이너 이름 지정
  • -p 88:80: 호스트 88번 포트 → 컨테이너 80번 포트 매핑

운영 상태 확인 및 조작

  • 실행 중인 컨테이너 보기: docker ps, 전체 보기 docker ps -a
  • 중지/시작/재시작: docker stop/start/restart [NAME|ID]
  • 리소스 모니터링: docker stats (실시간 업데이트)
  • 로그 확인: docker logs web-server
  • 내부 진입: docker exec -it web-server /bin/bash
  • 삭제: docker rm [NAME|ID] (실행 중인 경우 -f 옵션 필요)

데이터 영속성: 볼륨과 바인드 마운트

바인드 마운트 (Bind Mount)

호스트의 특정 디렉터리를 컨테이너 내부 경로에 연결합니다:

docker run -d -p 88:80 -v /app/html:/usr/share/nginx/html --name site-a nginx:1.26.0

호스트의 /app/html/index.html 수정이 즉시 컨테이너에 반영됩니다.

볼륨 마운트 (Volume Mount)

Docker가 자체적으로 관리하는 저장 공간을 사용합니다:

docker run -d -p 89:80 -v static-html:/usr/share/nginx/html -v config-nginx:/etc/nginx --name site-b nginx:1.26.0

볼륨 관련 명령어:

  • docker volume ls: 볼륨 목록 조회
  • docker volume create custom-vol: 볼륨 생성
  • docker volume inspect config-nginx: 볼륨 정보 확인

비교: 바인드 마운트 vs 볼륨 마운트

구분 항목 바인드 마운트 볼륨 마운트
관리 주체 사용자 직접 관리 Docker 엔진 자동 관리
저장 위치 호스트의 명시적 경로 Docker 내부 경로 (예: /var/lib/docker/volumes)
수명 주기 컨테이너와 독립적, 호스트 디렉터리 유지 컨테이너 삭제 후에도 유지 (직접 삭제 필요)
보안 및 격리 낮음 (호스트 파일 시스템 노출) 높음 (엔진 차원에서 격리)
권한 문제 빈번함 (UID/GID 불일치) 해결됨 (Docker가 처리)
클러스터 지원 제한적 (단일 노드) 확장 가능 (NFS, Ceph 등 연동)
주요 사용처 개발 시 코드 동기화, 설정 공유 DB 데이터 저장, 다중 컨테이너 공유

네트워킹: 컨테이너 간 통신

기본 통신 방식

기본적으로 각 컨테이너는 고유 IP를 가지며, 호스트의 포트를 통해 외부와 통신합니다.

커스텀 네트워크 사용

서로 다른 컨테이너가 이름으로 직접 통신할 수 있도록 하려면:

docker network create app-network
docker run -d --name api-server --network app-network nginx:1.26.0
docker run -d --name client-app --network app-network nginx:1.26.0

이후 client-app 내부에서 curl http://api-server로 접근 가능합니다.

실습 예제: Redis 마스터-슬레이브 구성

Bitnami 제공 Redis 이미지를 사용하여 복제 구조를 구성합니다.

마스터 노드 실행

docker run -d \
  --name redis-master \
  --network app-network \
  -p 6379:6379 \
  -v /app/redis-data/master:/bitnami/redis/data \
  -e REDIS_REPLICATION_MODE=master \
  -e REDIS_PASSWORD=123456 \
  bitnami/redis

디렉터리 권한 문제를 방지하기 위해:

mkdir -p /app/redis-data/master
chmod -R 777 /app/redis-data/master

슬레이브 노드 실행

docker run -d \
  --name redis-slave \
  --network app-network \
  -p 6380:6379 \
  -v /app/redis-data/slave:/bitnami/redis/data \
  -e REDIS_REPLICATION_MODE=slave \
  -e REDIS_MASTER_HOST=redis-master \
  -e REDIS_MASTER_PORT_NUMBER=6379 \
  -e REDIS_MASTER_PASSWORD=123456 \
  -e REDIS_PASSWORD=123456 \
  bitnami/redis

MySQL 컨테이너 배포

docker run -d \
  --name mysql-db \
  -p 3306:3306 \
  -v /app/mysql/conf:/etc/mysql/conf.d \
  -v /app/mysql/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=myapp \
  mysql:8.0.42-oracle

외부 DB 클라이언트로 접속하여 정상 동작 확인 가능합니다.

Docker Compose를 이용한 멀티 컨테이너 관리

다수의 서비스를 한 번에 정의하고 실행할 수 있는 도구입니다.

docker-compose.yml 예시

name: wordpress-stack
services:
  db:
    container_name: mysql-db
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wordpress
    volumes:
      - db-data:/var/lib/mysql
      - ./mysql-conf:/etc/mysql/conf.d
    restart: always
    networks:
      - frontend

  wp:
    image: wordpress
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-content:/var/www/html
    restart: always
    networks:
      - frontend

volumes:
  db-data:
  wp-content:

networks:
  frontend:

Compose 명령어

  • docker compose up -d: 백그라운드에서 모든 서비스 시작
  • docker compose down: 서비스 종료 (볼륨은 유지)
  • docker compose down -v --rmi all: 볼륨 및 이미지도 함께 제거
  • docker compose start/stop [서비스명]: 특정 서비스만 제어
  • docker compose scale wp=2: 워드프레스 인스턴스 2개로 확장

파일명이 compose.yaml 또는 docker-compose.yml이면 자동 인식되며, 다른 이름일 경우 -f 옵션으로 지정합니다.

태그: docker Containerization Docker Compose Volume Mount bind mount

9월 7일 00:34에 게시됨