런타임은 이미지를 빌드하는 시점이 아니라, 실제 프로세스로 실행하는 시점이다. 따라서 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를 사용하여 스트림을 완전히 개방해야 한다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 다양한 명령, 옵션 살펴보기: 리소스 정리, 이미지 태그 + CLI 출력 포맷팅 (0) | 2025.12.30 |
|---|---|
| [Docker] 컨테이너 생명주기(lifecycle)와 PID 1 프로세스 아키텍처 (0) | 2025.12.29 |
| [Docker] 이미지 레이어링(Image Layering)이란? (0) | 2025.12.29 |
| [Docker] 우분투에 도커 설치하기 (0) | 2025.12.26 |
| [Docker] 도커의 아키텍처와 동작 원리, 기술 동향 정리 (0) | 2025.12.26 |