본문 바로가기
AI Journey/클라우드

[Docker] 런타임 모드와 표준 스트림(stdio) 제어

by 보눔비스타 2025. 12. 29.

런타임은 이미지를 빌드하는 시점이 아니라, 실제 프로세스로 실행하는 시점이다. 따라서 docker run 명령을 내리는 순간, 컨테이너 프로세스의 입출력 통로를 호스트 터미널에 연결할지(Foreground), 백그라운드로 돌릴지(Background/Detached) 결정해야 한다.

Nginx를 도커로 실행하는 예시를 통해 이 두 모드의 차이를 확인해볼 수 있다.

# Case 1: Detached Mode (백그라운드 실행)
docker run -d --name my_web1 nginx
9703b16ec053... (Container ID만 출력하고 즉시 쉘 프롬프트 반환)

# Case 2: Foreground Mode (포그라운드 실행)
docker run --name my_web2 nginx
...
2025/12/29 11:03:34 [notice] 1#1: start worker processes
(로그가 화면을 점유하며 터미널 제어권이 반환되지 않음)

 

포그라운드 실행 화면

 

1. 표준 스트림(Standard Streams)의 연결 메커니즘

리눅스의 모든 프로세스는 3개의 표준 입출력 스트림(STDIN(0), STDOUT(1), STDERR(2))을 가진다. Docker 실행 모드는 이 스트림을 어디에 연결하느냐의 차이다.

  • Foreground Mode (Default):
    • 컨테이너의 STDOUT/STDERR가 호스트의 터미널 화면에 직접 연결된다. 그래서 Nginx 로그가 내 화면에 실시간으로 출력되며 터미널을 점유하게 된다.
    • 이 상태에서는 터미널이 '대기 상태(Block)'가 되므로 다른 명령어를 입력할 수 없다.
  • Detached Mode (-d):
    • Docker 데몬이 컨테이너를 시작하자마자 호스트 터미널과의 I/O 스트림 연결을 끊는다(Detach).
    • 컨테이너의 출력 로그는 터미널로 보내지는 대신 Docker의 내부 로깅 드라이버(json-file 등)로 리다이렉션되어 저장된다. 덕분에 사용자는 즉시 터미널 제어권을 돌려받고 다른 작업을 수행할 수 있다.

2. 시그널(Signal) 처리와 TTY

  • Interactive Mode (-it): 단순히 입출력만 연결하는 것이 아니라 제어까지 가능하게 한다.
    • -i (Interactive): 호스트의 키보드 입력(STDIN)을 컨테이너 내부로 파이프라인처럼 연결한다. (입력 통로 개방)
    • -t (Pseudo-TTY): 프로세스에 **가상 터미널(TTY)**을 할당한다. TTY가 할당되어야만 쉘 프롬프트가 정상적으로 뜨고, Ctrl+C (SIGINT) 같은 종료 신호가 컨테이너 프로세스에 올바르게 전달된다.

결론: 서버 데몬(Nginx, DB 등)은 사용자 입력이 필요 없고 지속적으로 실행되어야 하므로 -d를 사용하고, 쉘(bash)과 같이 사용자와 대화해야 하는 프로세스는 -it를 사용하여 스트림을 완전히 개방해야 한다.