docker attach vs exec — 차이점과 올바른 활용법
docker attach와 docker exec의 근본적인 차이, STDIN/STDOUT 연결 방식, 안전한 분리(detach) 방법, 그리고 각 명령이 적합한 상황을 비교합니다.
지난 글에서 docker exec로 실행 중인 컨테이너에 명령을 보내는 방법을 살펴봤습니다. 이번에는 비슷해 보이지만 동작 원리가 전혀 다른 docker attach와 docker exec를 비교합니다.
핵심 차이 한 줄 요약
docker attach: 컨테이너의 PID 1 (메인 프로세스) stdin/stdout에 직접 연결docker exec: 컨테이너에 새 프로세스를 실행해서 연결
docker attach
docker attach web # PID 1에 터미널 연결
docker attach --no-stdin web # 출력만 감시 (입력 없음)
attach는 docker run -d로 시작한 컨테이너의 PID 1 프로세스(예: nginx, node 등)에 현재 터미널을 붙입니다. 새 프로세스를 만들지 않으며, PID 1의 stdin/stdout/stderr를 그대로 터미널에 연결합니다.
중요한 주의사항: 이 상태에서 Ctrl+C를 누르면 PID 1에 SIGINT가 전송되어 컨테이너 자체가 종료될 수 있습니다. 반드시 안전한 분리 방법을 사용해야 합니다.
안전하게 attach에서 빠져나오기
기본 분리 키 시퀀스는 Ctrl+P → Ctrl+Q입니다. 컨테이너를 종료하지 않고 터미널만 분리합니다.
# 분리 키를 커스텀으로 변경해서 attach
docker attach --detach-keys "ctrl-d" web
# 또는 ~/.docker/config.json 에서 기본값 영구 변경
# { "detachKeys": "ctrl-e,e" }
attach가 유용한 경우
- 컨테이너가 인터랙티브 앱 자체인 경우: PID 1이 CLI 게임, REPL 인터프리터 등
- 컨테이너 stdout 실시간 감시:
--no-stdin으로 출력만 스트리밍
# stdout 스트리밍 (logs -f 와 유사하지만 버퍼 없음)
docker attach --no-stdin web
docker exec가 더 나은 이유
대부분의 컨테이너 접근은 docker exec -it가 더 안전하고 유연합니다.
docker exec -it web bash # 새 bash 세션, exit해도 컨테이너 유지
docker exec -it web sh # bash 없을 때
docker exec web nginx -s reload # 단건 명령 후 자동 종료
| 항목 | attach | exec |
|---|---|---|
| 새 프로세스 생성 | ✗ | ✓ |
| Ctrl+C 위험 | ⚠ 컨테이너 종료 가능 | ✓ exec 프로세스만 종료 |
| 실행 중 컨테이너 필요 | ✓ | ✓ |
| 명령 실행 가능 | ✗ (PID 1에 따라 다름) | ✓ |
여러 터미널에서 동시 접속
# 터미널 A에서 attach
docker attach web
# 터미널 B에서 별도 bash
docker exec -it web bash
attach는 같은 컨테이너에 여러 터미널이 동시에 연결될 수 있으며, 모든 터미널에 같은 출력이 표시됩니다. exec는 각자 독립된 세션을 갖습니다.
정리
docker attach는 PID 1에 직접 붙으므로 잘못 사용하면 컨테이너를 종료시킬 수 있습니다. 일상적인 디버깅과 접근에는 docker exec -it를 쓰고, attach는 컨테이너 자체가 인터랙티브한 특수 상황에서만 사용합니다.
지난 글: docker exec — 실행 중인 컨테이너에 명령 실행
다음 글: docker logs — 컨테이너 로그 조회 완전 정복
읽어주셔서 감사합니다. 😊