Quick Flow
# 새 container 생성과 실행
docker run --name web -d nginx:alpine
docker ps --filter name=web
# 같은 container를 멈췄다가 다시 시작
docker stop --time 30 web
docker start web
# 필요 없어진 stopped container만 삭제
docker stop web
docker rm webdocker run은 새 container를 만들고, docker start는 멈춘 기존 container를 다시 시작합니다. docker rm은 container의 writable layer와 설정을 없애지만 named volume, image, bind mount의 host 파일은 별도 수명주기를 가집니다.
상태와 명령
container 상태는 한 줄로만 진행되지 않습니다. created, running, paused, restarting, exited, removing, dead 등이 있으며, process가 정상 종료해도 exited가 됩니다. docker ps는 기본으로 running만 보므로, 실패한 container를 찾을 때는 docker ps -a를 사용합니다.
docker ps -a --filter status=exited
docker ps -a --filter status=restarting
docker container wait web # 종료될 때까지 기다리고 exit code 출력docker run은 create와 start를 한 번에 수행합니다. docker start는 image를 새로 build하거나 options를 다시 적용하지 않고 기존 container를 시작합니다. 실행 중 container 안에서 보조 명령을 실행하는 docker exec는 생명주기 변경 명령이 아닙니다.
정상 종료와 강제 종료
docker stop은 image의 STOPSIGNAL 또는 container 생성 때 지정한 --stop-signal을 PID 1에 보냅니다. 별도 설정이 없으면 Linux container에는 보통 SIGTERM이 사용됩니다. timeout 안에 종료하지 않으면 Docker가 SIGKILL로 강제 종료합니다. daemon 기본 timeout은 Linux container 10초, Windows container 30초이며 --time 또는 생성 시 --stop-timeout으로 바꿀 수 있습니다.
# application이 요청을 정리할 30초를 준 뒤 강제 종료
docker stop --time 30 web
# graceful shutdown을 건너뛰는 강제 종료
docker kill webdocker restart는 stop 후 start에 해당합니다. SIGKILL은 finally·flush·connection close를 보장하지 않으므로 DB나 queue consumer를 멈출 때는 application의 graceful shutdown과 timeout을 함께 설계합니다.
삭제와 재사용
docker stop 뒤 docker start를 하면 같은 container의 writable layer와 생성 시 설정은 남습니다. 하지만 docker rm 뒤 docker run은 새 container이므로 runtime에 수정한 파일과 restart count, anonymous writable layer는 이어지지 않습니다. named volume은 이름을 명시했다면 container 삭제 뒤에도 남습니다.
# 일회성 command: 종료 뒤 container와 anonymous volume을 제거
docker run --rm --name temp alpine:3.21 sh -c 'echo "health check"'
# 이 container는 이미 삭제되어 다시 start할 수 없음
docker start temp--rm은 조사할 로그·파일을 남기지 않고 anonymous volume도 제거할 수 있어, short-lived job에는 좋지만 장애 조사나 재시작 정책과 함께 쓰는 용도에는 맞지 않습니다. --rm과 --restart는 함께 사용할 수 없습니다.
docker run을 다시 실행하는 것은 restart가 아니라 새 container 생성입니다. 이름 충돌이 나면 기존 container를 먼저 inspect하고, 삭제가 필요한지 또는 docker start가 맞는지 판단한 뒤 처리하십시오.
참고 링크
3 sources