도커 이미지는 실행하기 전의 정적인 상태이고,
docker run 을 해야만 실행이 된다.
프로그램도 실행 파일이 있지만 실행해야만
프로세스 (실행 중인 프로그램) 이 된다.
| 동작 | 도커 컨테이너 | 프로그램 프로세스 |
|---|---|---|
| 여러 개 실행 가능? | ✅ (같은 이미지로 여러 컨테이너 실행 가능) | ✅ (같은 프로그램을 여러 번 실행 가능) |
| 상태 확인 | docker ps | ps aux, tasklist |
| 종료 | docker stop | kill, Ctrl+C |
| 재시작 | docker restart | 다시 실행 |
도커 컨테이너는 docker ps 로 실행중인 컨테이너를 확인할 수 있고, 종료하면 사라지거나 멈춘다.
프로세스도 ps (리눅스), tasklist (윈도우)로 확인하고,
kill 또는 Ctrl + c 로 종료할 수 있다.
격리 여부
도커 컨테이너는 독립적인 환경에서 실행됨 (호스트 OS와 일부 격리)
프로그램 프로세스는 OS에서 직접 실행 (일반적인 실행 방식)
영속성
도커 컨테이너는 종료 후에도 재시작 가능 (docker start)
일반 프로세스는 종료하면 다시 처음부터 실행
✅ 컨테이너 = 독립적인 프로세스 같은 것
✅ 이미지 = 실행 파일 같은 것
✅ 하지만 컨테이너는 더 격리된 환경에서 동작
"컨테이너는 프로세스의 한 형태이지만, 더 격리되고 관리하기 편한 방식"
1단계 : 도커 이미지 다운로드 (docker pull)
docker pull nginx
2단계 : 특정 버전의 도커 다운로드
docker pull nginx:1.25
3단계 : 다운로드 된 이미지 확인 (docker images)
docker images
모든 이미지를 확인할 수 있음
4단계 : 특정 이미지 삭제 (docker rmi)
docker rmi nginx:1.25
지정한 nginx 1.25 이미지를 삭제
✅
docker pull [이미지명]: 최신 버전의 이미지를 다운로드✅
docker pull [이미지명]:[태그]: 특정 버전의 이미지를 다운로드✅
docker images: 현재 다운로드된 이미지 목록 확인✅
docker rmi [이미지명]:[태그]: 특정 도커 이미지를 삭제
1단계 : 컨테이너 실행 (docker run)
docker run hello-world
(hello-world 컨테이너가 실행되며, "Hello, from Docker!" 메시지가 출력)
2단계 : 실행된 컨테이너 목록 (docker ps -a)
docker ps -a
(hello-world 컨테이너가 실행되며 자동으로 종료)
3단계 : 컨테이너 삭제 (docker rm)
docker rm abc123456789
(실행이 끝난 hello-world 컨테이너를 삭제)
id는 docker ps -a 로 확인 가능
4단계 : 다운로드된 image 확인 (docker images)
docker images
5단계 : 이미지 삭제하기 (docker rmi)
docker rmi hello-world
✅
docker run hello-world:hello-world컨테이너 실행.✅
docker ps -a: 실행된 모든 컨테이너 목록 확인.✅
docker rm [컨테이너 ID]: 실행이 끝난 컨테이너 삭제.✅
docker images: 다운로드된 도커 이미지 목록 확인.✅
docker rmi hello-world:hello-world이미지 삭제.
docker run 으로 컨테이너를 실행하면 내부에서 주 프로세스가 작동
도커 컨테이너는 하나의 주 프로세스(메인 프로세스)를 중심으로 실행
컨테이너가 살아있으려면 이 주 프로세스가 계속 실행중이어야 함
주 프로세스가 종료되면, 컨테이너도 자동으로 종료 (EXITED 상태)
컨테이너에는 주 프로세스 외에도 여러 프로세스가 있을 수 있다.
nginx 컨테이너를 실행하면 nginx 프로세스가 주 프로세스가 되지만,worker process 같은 추가 프로세스도 동작할 수 있음최종 실행 명령어 (ENTRYPOINT + CMD)
컨테이너가 실행될 때 가장 마지막으로 실행되는 명령어는 최종 실행 명령어
이는 ENTRYPOINT (기본 실행 프로그램) + CMD (인자)로 구성
예를 들어, 아래와 같은 Dockerfile 을 보면
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]
실행되면 nginx -g 'daemon off;'가 최종 실행 명령어가 된다.
주 프로세스가 종료되면 컨테이너도 종료
docker run ubuntu 를 실행하면 기본적으로 아무런 명령어 없이 종료docker run ubuntu
bash 를 실행하면 프로세스가 유지docker run -it ubuntu bash
bash (쉘)가 주 프로세스가 되고, 종료하지 않는 한 컨테이너가 유지✅ 컨테이너 내부에는 주 프로세스가 반드시 하나 존재해야 함
✅ 최종 실행 명령어 = ENTRYPOINT + CMD
✅ 주 프로세스가 종료되면 컨테이너도 자동으로 종료됨
컨테이너 내부에서 실행되는 주 프로세스가 중요
도커에서 컨테이너를 실행할 때 가장 중요한 개념은 컨테이너 내부에서 실행되는 주 프로세스
컨테이너 내부에서 실행할 프로세스가 존재해야 하고, 프로세스가 실행되는 동안 컨테이너는 유지
hello-world 컨테이너 실행 과정
docker run hello-world 를 실행하면, 내부에서 hello 라는 프로그램이 실행
이 프로세스는 단순히 "Hello from Docker!" 메시지를 출력한 후 즉시 종료
주 프로세스가 종료되었기에, 컨테이너도 즉시 종료
컨테이너 실행과 종료의 관계
| 실행 명령어 | 내부에서 실행되는 최종 실행 명령어 | 실행 후 동작 |
|---|---|---|
docker run hello-world | /hello 프로그램 실행 | 메시지 출력 후 종료 |
docker run ubuntu | /bin/bash 실행됨 (일반적으로 종료됨) | -it 옵션이 없기 때문에 컨테이너가 실행되었다가 바로 종료됨 |
docker run -it ubuntu bash | /bin/bash 실행 (터미널 유지됨) | 사용자가 종료(exit)하기 전까지 컨테이너가 유지됨 |
컨테이너가 종료되는 이유
내부 프로세스가 종료되었기 때문
도커 컨테이너는 내부에서 실행된 프로세스가 종료되면 컨테이너도 자동으로 정지
컨테이너가 지속되어야 한다면, 오래 지속되는 혹은 영원히 지속되는 프로세스를 사용
nginx 컨테이너는 종료 안됨
nginx 웹서버 는 사용자가 명시적으로 종료하지 않으면 계속 실행됨
nginx 컨테이너는 자동으로 종료되지 않음
Ctrl + c 로 주 프로세스 종료 -> 컨테이너 종료
✅ OS 에서는 특정 프로세스가 종료되어도 OS가 종료되지 않는다.
✅ 도커 컨테이너는 내부에서 실행되는 주 프로스세가 종료되면
컨테이너도 종료된다.✅
docker run hello-world→ 실행 후 메시지를 출력하고 즉시 종료됨.✅
docker run ubuntu→ubuntu컨테이너가 실행되지만,
-it옵션이 없기 때문에 즉시 종료됨.✅
docker run nginx→nginx서버는 자동으로 종료되지 않는 프로세스이기 때문에 컨테이너가 유지됨.✅
Ctrl + c(으)로 주 프로세스 종료 => 컨테이너 종료✅ 실행을 유지하려면 오래 지속되는 혹은 영원히 지속되는 프로세스가
주 프로세스가 되도록 해야한다.