안녕하세요! 지난 포스팅에서는 도커 이미지를 만들고 컨테이너를 실행, 관리하는 기본적인 명령어들을 배워봤습니다. 오늘은 한 단계 더 나아가, 컨테이너가 실행되는 두 가지 주요 모드인 Attached와 Detached 모드의 차이를 알아보고, 컨테이너와 어떻게 상호작용하는지 심층적으로 다뤄볼게요.
1. Attached vs. Detached 모드: 터미널의 자유
컨테이너를 실행할 때 크게 두 가지 모드가 있습니다.
- Attached 모드: 컨테이너의 프로세스가 터미널에 연결(attached)되어 실행됩니다. 컨테이너에서 발생하는 로그나 출력이 터미널에 실시간으로 표시되며, 터미널은 컨테이너가 멈출 때까지 다른 명령어를 입력할 수 없는 블로킹(blocking) 상태가 됩니다. docker run 명령어를 아무 옵션 없이 사용하면 이 모드가 기본값입니다.
- Detached 모드: 컨테이너의 프로세스가 터미널에서 분리(detached)되어 백그라운드에서 실행됩니다. 터미널에 컨테이너 ID만 출력되고 바로 다른 명령어를 입력할 수 있는 논블로킹(non-blocking) 상태가 됩니다. docker run 명령어에 -d 옵션을 추가하거나, docker start 명령어를 사용하면 이 모드가 기본값입니다.
데모: 웹 서버에서 차이 확인하기
지난 포스팅에서 만든 Node.js 웹 서버 컨테이너를 예로 들어볼게요.
- Attached 모드로 실행: docker run 명령어로 컨테이너를 실행하면, 터미널이 멈추고 서버 로그가 실시간으로 보입니다. 다른 작업을 할 수 없죠.
Bash
# 터미널이 블로킹 상태가 됨 docker run -p 8000:80 my-web-app - Detached 모드로 실행: docker run에 -d 옵션을 추가하면, 터미널에 컨테이너 ID만 출력되고 바로 다른 명령어를 입력할 수 있습니다.docker ps로 확인해보면 컨테이너가 정상적으로 실행 중인 것을 볼 수 있습니다.
Bash
# 터미널에 컨테이너 ID가 출력되고 바로 다음 명령어를 입력할 수 있음 docker run -d -p 8000:80 my-web-app
그렇다면 Detached 모드에서 로그를 확인하고 싶을 땐 어떻게 할까요? 두 가지 방법이 있습니다.
- docker attach: 이미 실행 중인 컨테이너에 다시 연결해 실시간 로그를 확인합니다.
Bash
docker attach [컨테이너 이름 또는 ID] - docker logs: 컨테이너가 출력한 로그를 조회합니다. -f (follow) 옵션을 추가하면 실시간 로그를 계속해서 볼 수 있습니다.
Bash
# 과거 로그 전체 보기 docker logs [컨테이너 이름 또는 ID] # 실시간 로그 보기 (docker attach와 유사) docker logs -f [컨테이너 이름 또는 ID]
2. 도커, 웹 서버만 돌리는 게 아니라고요?
도커는 웹 서버처럼 계속 실행되는 애플리케이션뿐만 아니라, 사용자와 상호작용이 필요한 프로그램도 실행할 수 있습니다. 예를 들어, 사용자에게 숫자를 입력받아 랜덤 숫자를 출력하는 간단한 파이썬 프로그램을 도커로 실행해 봅시다.
# random_number_generator.py
import random
min_val = int(input("최소 숫자를 입력하세요: "))
max_val = int(input("최대 숫자를 입력하세요: "))
print(random.randint(min_val, max_val))
Dockerfile 작성하기
이 파이썬 프로그램을 위한 Dockerfile을 작성해볼게요.
FROM python:3
WORKDIR /app
COPY . .
CMD ["python", "random_number_generator.py"]
상호작용을 위한 docker run -it
위 Dockerfile로 이미지를 빌드한 후 docker run 명령어로 컨테이너를 실행하면, "최소 숫자를 입력하세요"라는 메시지가 보이지만, 키보드 입력이 불가능합니다. 이는 docker run의 기본 Attached 모드가 출력만 듣고 입력은 불가능하기 때문입니다.
사용자 입력을 받으려면 -i (interactive)와 -t (tty) 옵션을 함께 사용해야 합니다.
- -i: 컨테이너의 표준 입력(Standard Input)을 열어줍니다.
- -t: 터미널(TTY)을 할당하여 입출력 환경을 만들어 줍니다.
이 두 옵션을 합쳐 **-it**로 사용합니다.
docker run -it [이미지 ID]
이제 명령어를 다시 실행하면, 터미널에 숫자를 입력할 수 있게 됩니다. docker -it는 사용자와 상호작용이 필요한 CLI(Command Line Interface) 애플리케이션을 실행할 때 필수적인 옵션입니다.
3. 컨테이너 재시작과 -it
컨테이너를 docker stop으로 멈췄다가 docker start로 다시 시작하면 기본적으로 Detached 모드가 되기 때문에, 다시 docker start -it를 사용해야 할까요?
docker start 명령어에 -a(attach)와 -i(interactive) 옵션을 추가하면 멈췄던 컨테이너를 Attached & Interactive 모드로 다시 시작할 수 있습니다.
docker start -a -i [컨테이너 이름 또는 ID]
이렇게 하면 docker run -it와 동일하게 사용자 입력을 받을 수 있는 상태가 됩니다.
이번 포스팅에서는 attached와 detached 모드의 차이, 그리고 사용자와 상호작용이 필요한 컨테이너를 다루는 방법에 대해 알아봤습니다.
실행 중인 컨테이너 확인:
docker ps
중지된 컨테이너 포함 확인:
docker ps -a
컨테이너 삭제(rm):
docker rm CONTAINER_ID
단, 실행 중인 컨테이너는 삭제 불가 → 먼저 중지 필요:
docker stop CONTAINER_ID
docker rm CONTAINER_ID
여러 개 삭제 가능:
docker rm CONTAINER_ID1 CONTAINER_ID2
이미지 관리
보유한 이미지 확인:
docker images
이미지 삭제(rmi):
docker rmi IMAGE_ID
- 실행 중이거나 중지된 컨테이너에서 사용 중인 이미지는 삭제 불가 → 먼저 컨테이너 삭제 필요.
- 여러 개 삭제 가능:
- docker rmi IMAGE_ID1 IMAGE_ID2
사용하지 않는 이미지 일괄 삭제:
docker image prune
컨테이너 자동 삭제 옵션
매번 중지된 컨테이너를 수동으로 정리하는 대신 --rm 플래그를 활용 가능.
예시:
docker run -d -p 3000:3000 --rm my-image
- -d: 백그라운드 실행
- -p: 포트 매핑
- --rm: 컨테이너 종료 시 자동 삭제
이 옵션은 Node 서버 같은 임시 컨테이너 실행에 특히 유용하다.
코드가 변경되면 어차피 새 이미지를 빌드해야 하므로 기존 컨테이너는 자동 삭제하는 편이 합리적이다.
👉 핵심 정리
- 컨테이너 삭제: docker stop → docker rm
- 이미지 삭제: docker rmi
- 불필요한 이미지 정리: docker image prune
- 자동 삭제 컨테이너 실행: docker run --rm
'DevOps' 카테고리의 다른 글
| [Docker 8] 도커 컨테이너와 로컬 환경 간 파일 복사, docker cp 활용법 (0) | 2025.08.24 |
|---|---|
| [Docker 7] docker image inspect로 이미지 심층 분석하기 (0) | 2025.08.24 |
| [Docker 5편] 컨테이너와 이미지 관리 명령어 모음 🐳 (2) | 2025.08.18 |
| [Docker 4편] 🐳 도커, 넌 대체 어떻게 빌드되는 거야? 이미지 레이어! (2) | 2025.08.18 |
| [Docker 3편] DockerFile로 도커 이미지 만들고 컨테이너 실행하기 (2) | 2025.08.17 |