Docker / / 2024. 12. 9. 16:25

Docker in Action Chapter 2

2장: 컨테이너로 소프트웨어 실행하기(Running software in containers)

이 장에서는 실제 컨테이너 환경에서 소프트웨어를 실행하고 관리하는 기초를 다룹니다. 컨테이너 안에 다양한 애플리케이션(웹 서버, 모니터링 프로그램, 메일러 등)을 넣어 실행하며, 컨테이너 상태 확인, 로그 조회, 정리, 환경 변수 주입, 재시작 정책 설정 등 중요한 Docker 운영 기법을 살펴봅니다.

컨테이너 실행과 프로세스 격리

  • 프로세스 격리의 중요성:
    리눅스 컨테이너 기술은 프로세스, 파일 시스템, 네트워크 등을 네임스페이스로 격리하여, 하나의 호스트에서 서로 다른 애플리케이션이 독립적으로 실행되도록 합니다. 이를 통해 소프트웨어 간 충돌을 방지하고 보안·관리 측면에서 이점을 얻을 수 있습니다.

  • PID 네임스페이스:
    각 컨테이너는 고유한 PID 네임스페이스를 가져, 컨테이너 내 프로세스는 외부나 다른 컨테이너 프로세스를 볼 수 없습니다. 덕분에 프로세스 충돌, 공격 범위 축소 등 보안 이점이 있습니다.

컨테이너 생성·실행·관리 기본 명령어

  • docker run: 이미지로부터 컨테이너 생성 및 실행.

    • -d 또는 --detach: 컨테이너를 백그라운드(데몬) 모드로 실행.
    • -it 또는 --interactive --tty: 대화형(상호작용) 컨테이너 실행, 터미널 입출력 연결.
    • --name: 컨테이너에 명시적 이름 지정.
    • --env (-e): 환경 변수 주입.
    • --read-only: 컨테이너 파일 시스템을 읽기 전용으로 지정.
    • --link: 다른 컨테이너와 링크(레거시 기능, 현재는 사용자 정의 네트워크 권장)
  • docker ps: 현재 실행 중인 컨테이너 목록 조회. -a 옵션으로 종료된 컨테이너 포함 조회 가능.

  • docker logs: 컨테이너 로그 출력. -f 옵션으로 실시간 로그 모니터링 가능.

  • docker stop, docker kill: 실행 중인 컨테이너 종료. stop은 정상 종료 시그널 전달, kill은 즉각 강제 종료.

  • docker rm: 컨테이너 제거. 실행 중인 컨테이너를 제거하려면 -f 옵션이나 먼저 stop 필요.

  • docker exec: 실행 중인 컨테이너 내에서 명령어 실행. 이를 통해 프로세스 목록(ps) 조회, 추가 진단 커맨드 실행 가능.

  • docker rename: 컨테이너 이름 변경.

  • docker create: 실행하지 않고 컨테이너를 생성만 하는 명령. --cidfile로 컨테이너 ID를 파일에 저장 가능.

예제: 웹 서비스 모니터링 시스템 구축

  1. Nginx 웹 서버 컨테이너:
    docker run -d --name web nginx:latest
    백그라운드에서 Nginx 실행.

  2. 메일러(mailer) 컨테이너:
    docker run -d --name mailer dockerinaction/ch2_mailer
    알림 이메일을 보내는 메일러 실행.

  3. 모니터링(watcher) 컨테이너:
    docker run -it --name agent --link web:insideweb --link mailer:insidemailer dockerinaction/ch2_agent
    상호작용 모드로 실행 후 Ctrl+P,Q로 분리(detach).

  4. 로그 및 상태 확인:

    • docker ps: 실행 중인 컨테이너 목록 확인.
    • docker logs web, docker logs mailer, docker logs agent: 각 컨테이너 로그 확인.
  5. 컨테이너 중지 및 재시작:

    • docker stop web / docker start web
      웹 서버 중단 및 재시작으로 알림 기능 테스트.

환경 비의존적 시스템 구축

  • 단순히 컨테이너를 많이 늘리면 메타 수준의 충돌 가능. 예를 들어, 여러 WordPress 사이트를 동일한 패턴으로 실행할 때 데이터베이스 이름 충돌, 파일 시스템 충돌 등이 발생.

  • 이를 해결하기 위해:

    1. 읽기 전용 파일시스템(--read-only): 컨테이너 내 애플리케이션이 마음대로 파일을 변경하지 못하게 하여 환경 특수화를 방지.
    2. 환경 변수 주입(-e): 데이터베이스 호스트, 사용자, 비밀번호 등 런타임 시점에 다른 환경 정보를 주입. 이를 통해 동일한 이미지로 다양한 설정의 사이트 실행 가능.
    3. 볼륨: 데이터베이스나 로그 등 쓰기 가능한 공간은 호스트 볼륨이나 tmpfs 제공. /run/apache2/, /tmp 등 필요한 경로에 쓸 수 있는 공간 할당.

내구성 있는(durable) 컨테이너와 재시작 정책

  • 컨테이너가 비정상 종료되었을 때 자동으로 재시도하거나, 지수 백오프(점진적 대기 시간 증가)로 재시작할 수 있음.
    --restart 정책:

    • no (기본값): 실패 시 재시작하지 않음
    • on-failure: 실패 시 일정 횟수 재시작
    • always: 항상 재시작
    • unless-stopped: 수동으로 중지할 때까지 재시작
  • 심화: init 시스템이나 엔트리포인트 스크립트를 활용해 복잡한 재시작 및 초기화 로직 구현 가능.

정리(cleaning up)

  • 사용이 끝난 컨테이너는 docker rm으로 삭제. 실행 중이면 docker stopdocker rm 또는 docker rm -f 사용.
  • --rm 옵션을 docker run에 사용하면 컨테이너가 종료 시 자동 제거.

정리:
2장에서는 컨테이너 운영의 기본기를 다룹니다.

  • 컨테이너 생성·실행(대화형/백그라운드), 로그/상태 확인, 중지/재시작, 환경 변수 주입, 읽기 전용 파일시스템, 볼륨, 재시작 정책 등.
  • 예제를 통해 Nginx 웹 서버, 메일러, 모니터링 에이전트를 활용한 시스템 구축 과정을 실습.
  • 후반부에서는 WordPress+MySQL 사례를 통해 환경 비의존적 설정(환경 변수)과 읽기 전용 파일시스템, 볼륨, 재시작 정책을 활용해 내구성 있고 유연한 컨테이너 시스템 구성 방법을 익힌다.

다음 장에서는 이미지와 레이어, 파일 시스템, 소프트웨어 설치 전략을 자세히 다룰 예정이므로, 여기서 배운 컨테이너 실행·관리 기법을 토대로 더욱 정교한 Docker 환경을 구성할 수 있을 것이다.

'Docker' 카테고리의 다른 글

Docker in Action Chapter 4  (0) 2024.12.09
Docker in Action Chapter 3  (0) 2024.12.09
Docker in Action Chapter 1  (0) 2024.12.09
Docker 컨테이너 네트워킹  (1) 2024.12.04
도커 볼륨 (Docker Volumes)  (1) 2024.12.04
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유