Docker 컨테이너 내부 프로세스와 상호 작용하는 방법

DockerBeginner
지금 연습하기

소개

Docker 컨테이너는 애플리케이션 개발 및 배포 방식을 혁신했지만, 이러한 컨테이너 내에서 실행되는 프로세스와 상호 작용하는 것은 독특한 과제가 될 수 있습니다. 이 튜토리얼에서는 Docker 컨테이너 내 프로세스와 상호 작용하는 필수 기술을 실제 예제와 현실적인 사용 사례를 통해 안내합니다.

Docker 컨테이너 소개

Docker 는 개발자가 일관되고 재현 가능한 방식으로 애플리케이션을 패키징하고 배포할 수 있도록 지원하는 인기 있는 컨테이너화 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량의 독립 실행형 실행 가능한 소프트웨어 패키지입니다.

Docker 컨테이너란 무엇인가요?

Docker 컨테이너는 코드와 모든 종속성을 패키징하여 애플리케이션이 한 컴퓨팅 환경에서 다른 환경으로 빠르고 안정적으로 실행되도록 하는 표준화된 소프트웨어 단위입니다. 컨테이너는 컨테이너를 생성하기 위한 청사진인 Docker 이미지에서 생성됩니다.

graph TD
    A[Docker 이미지] --> B[Docker 컨테이너]
    B[Docker 컨테이너] --> C[실행 중인 애플리케이션]

Docker 컨테이너의 장점

  • 일관성: 컨테이너는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
  • 이식성: 컨테이너는 개발자의 랩톱에서 프로덕션 서버까지 다양한 환경에서 쉽게 이동 및 배포할 수 있습니다.
  • 확장성: 컨테이너는 변화하는 요구 사항에 맞춰 쉽게 확장하거나 축소할 수 있습니다.
  • 효율성: 컨테이너는 호스트 운영 체제를 공유하기 때문에 기존 가상 머신보다 더 경량적이고 효율적입니다.

Docker 아키텍처

Docker 는 Docker 클라이언트가 Docker 데몬과 통신하는 클라이언트 - 서버 아키텍처를 사용합니다. Docker 데몬은 Docker 컨테이너를 구축, 실행 및 배포하는 역할을 합니다.

graph LR
    A[Docker 클라이언트] -- API --> B[Docker 데몬]
    B[Docker 데몬] -- 이미지 다운로드 --> C[Docker 레지스트리]
    B[Docker 데몬] -- 컨테이너 실행 --> D[Docker 호스트]

Docker 시작하기

Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 공식 Docker 웹사이트에서 Docker 를 다운로드하여 설치할 수 있습니다. 설치 후 docker 명령줄 도구를 사용하여 Docker 컨테이너와 상호 작용할 수 있습니다.

## Ubuntu 22.04 에서 Docker 설치
sudo apt-get update
sudo apt-get install -y docker.io

Docker 컨테이너 내 프로세스와 상호 작용하기

Docker 컨테이너가 실행되면 컨테이너 내부의 프로세스와 상호 작용해야 할 수 있습니다. Docker 는 컨테이너에서 실행 중인 프로세스를 관리하고 상호 작용하는 데 도움이 되는 여러 명령어와 옵션을 제공합니다.

컨테이너 쉘 접근

docker exec 명령어를 사용하여 실행 중인 컨테이너의 쉘에 접근할 수 있습니다. 이를 통해 컨테이너 내부에서 직접 명령어를 실행할 수 있습니다.

## 실행 중인 컨테이너의 쉘에 접근
docker exec -it < container_id > /bin/bash

컨테이너 프로세스 모니터링

docker top 명령어를 사용하여 컨테이너 내부에서 실행 중인 프로세스 목록을 표시할 수 있습니다.

## 컨테이너 내부의 실행 중인 프로세스 목록

또한 docker stats 명령어를 사용하여 하나 이상의 컨테이너에 대한 실시간 성능 지표를 얻을 수 있습니다.

## 컨테이너의 실시간 성능 지표 얻기

프로세스에 시그널 보내기

docker kill 명령어를 사용하여 실행 중인 컨테이너에 시그널을 보낼 수 있으며, 이를 통해 컨테이너를 중지하거나 종료할 수 있습니다.

## 실행 중인 컨테이너에 SIGTERM 시그널 보내기

또한 docker exec 명령어를 사용하여 컨테이너 내부에서 실행 중인 프로세스에 직접 시그널을 보낼 수 있습니다.

## 컨테이너 내부의 프로세스에 SIGINT 시그널 보내기

로깅 및 디버깅

Docker 는 컨테이너의 로그에 접근하고 문제를 디버깅하는 데 도움이 되는 여러 명령어를 제공합니다.

## 실행 중인 컨테이너의 로그 보기

## 실행 중인 컨테이너의 stdout 및 stderr에 연결

이러한 기본 명령어와 기술을 이해함으로써 Docker 컨테이너 내부에서 실행 중인 프로세스와 효과적으로 상호 작용하고 관리할 수 있습니다.

실제 예제 및 사용 사례

이제 Docker 컨테이너와 그 내부에서 실행되는 프로세스와의 상호 작용에 대한 기본적인 이해를 갖추었으므로, 실제 예제와 사용 사례를 살펴보겠습니다.

Docker 컨테이너에서 웹 서버 실행

Docker 의 일반적인 사용 사례 중 하나는 웹 애플리케이션 실행입니다. Docker 컨테이너에서 간단한 Nginx 웹 서버를 실행해 보겠습니다.

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

## Nginx 컨테이너 실행
docker run -d -p 80:80 --name my-nginx nginx:latest

## 웹 브라우저에서 웹 서버 접근
http://localhost

이 예제에서는 Docker Hub 에서 Nginx 이미지를 가져와 해당 이미지를 기반으로 컨테이너를 실행하고 호스트의 포트 80 을 컨테이너의 포트 80 으로 매핑했습니다. 이제 웹 브라우저에서 http://localhost를 방문하여 컨테이너에서 실행 중인 Nginx 웹 서버에 접근할 수 있습니다.

컨테이너화된 애플리케이션 확장

Docker 는 여러 개의 컨테이너 인스턴스를 실행하여 애플리케이션을 쉽게 확장할 수 있도록 지원합니다. Docker Compose 를 사용하여 여러 컨테이너를 단일 애플리케이션으로 정의하고 관리할 수 있습니다.

## docker-compose.yml
version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    deploy:
      replicas: 3

이 예제에서는 Nginx 웹 서버를 실행하는 web 서비스를 정의했습니다. web 서비스의 3 개의 복제본을 실행하도록 지정했으며, Docker Compose 는 컨테이너의 확장을 자동으로 관리합니다.

컨테이너화된 애플리케이션 디버깅

컨테이너화된 애플리케이션에 문제가 발생하면 앞서 학습한 Docker 명령어를 사용하여 문제를 디버깅하고 해결할 수 있습니다.

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

## 실행 중인 컨테이너의 쉘 접근

## 컨테이너의 로그 보기

이러한 명령어를 사용하여 실행 중인 프로세스를 검사하고, 컨테이너의 파일 시스템에 접근하고, 로그를 보고 컨테이너화된 애플리케이션의 문제를 식별하고 해결하는 데 도움이 될 수 있습니다.

이러한 예제는 Docker 를 사용하여 애플리케이션을 실행, 확장 및 디버깅하는 방법의 일부에 불과합니다. Docker 컨테이너의 유연성과 이식성은 현대 소프트웨어 개발 및 배포에 강력한 도구가 됩니다.

요약

이 종합 가이드에서는 Docker 컨테이너 내부에서 실행되는 프로세스와 효과적으로 상호 작용하는 방법을 배웁니다. 컨테이너 프로세스 모니터링 및 제어부터 실제 사용 사례 탐색까지, 이 튜토리얼은 Docker 기반 애플리케이션을 손쉽게 관리할 수 있는 지식과 기술을 제공합니다. 마지막까지 Docker 프로세스 상호 작용의 전문가가 되어 Docker 기반 워크플로우를 최적화하고 간소화할 수 있을 것입니다.