Quick Flow
# 1. exit·restart·log부터 확인
docker ps -a --filter name=app
docker logs --tail 100 app
# 2. 실행 설정과 실제 mount·port를 읽음
docker inspect --format '{{json .State}}' app
docker inspect --format '{{json .NetworkSettings.Ports}}' app
# 3. PID 1이 running일 때만 내부 command 실행
docker exec app env
docker exec -it app shlogs는 process output, inspect는 Docker가 기록한 설정과 상태, exec는 running container 안의 새 process를 확인합니다. container가 이미 exited면 exec 대신 logs·inspect·cp를 먼저 사용합니다.
inspect로 확인할 것
docker inspect는 container와 image의 저수준 metadata를 JSON으로 보여 줍니다. port mapping, mount source/destination, network attachment, environment, command, restart count, exit state를 확인할 때 사용합니다. 전체 JSON을 공유하면 environment variable과 mount path 같은 민감 정보가 노출될 수 있으므로, 운영 terminal에서는 필요한 field만 format합니다.
docker inspect --format '{{json .State}}' app
docker inspect --format '{{json .NetworkSettings.Ports}}' app
docker inspect --format '{{range .Mounts}}{{.Type}} {{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' app
docker inspect --format '{{.RestartCount}}' appinspect가 보여 주는 설정은 현재 container를 만들 때 적용된 값입니다. Compose file이나 Dockerfile을 수정했다 해도 container를 recreate하기 전까지 inspect 값은 바뀌지 않습니다.
exec의 경계
docker exec는 container의 primary process(PID 1)가 running일 때 그 안에서 새 command를 시작합니다. stopped·paused·dead container에는 사용할 수 없고, exec로 시작한 process는 container restart 뒤에 유지되지 않습니다.
# shell 없이 한 command만 실행
docker exec app env
docker exec -u root app id
# shell 문법이 필요하면 shell을 명시
docker exec app sh -c 'printenv | grep ^APP_'docker exec app echo "a && b"처럼 shell을 거치지 않은 command는 pipe, redirect, &&를 해석하지 않습니다. image에 sh나 bash가 없을 수도 있으므로 shell 접속을 debugging의 전제조건으로 두지 않습니다.
crash와 수정 범위
container가 시작 직후 exit하면 exec으로 들어갈 시간이 없습니다. 먼저 exit code, OOMKilled, logs, resolved config를 확인하고, 같은 image를 --entrypoint로 바꾼 새 debug container에서 file·environment·command를 조사합니다. distroless image처럼 shell이 없는 경우에는 docker debug 또는 목적에 맞는 diagnostic image를 검토합니다.
docker inspect --format 'exit={{.State.ExitCode}} oom={{.State.OOMKilled}}' app
docker logs --tail 100 app
# image에 sh가 있을 때만 가능
docker run --rm -it --entrypoint sh my-app:1.2.3running container에서 file을 고치거나 package를 설치하면 writable layer에는 남아 docker restart 뒤에도 남을 수 있습니다. 그러나 docker rm 또는 Compose recreate 뒤에는 사라지고 다른 replica에도 적용되지 않습니다. 조사 결과는 Dockerfile·image build·Compose 설정으로 옮겨 재현 가능한 변경으로 만듭니다.
exec는 진단을 위한 새 process일 뿐, crash root cause를 고치거나 배포 설정을 바꾸지 않습니다. production container를 즉석에서 수정해 정상처럼 보이게 만들지 말고, inspect·log 증거와 함께 image 또는 설정 변경으로 재현하십시오.
참고 링크
3 sources