도커 알아보기

현곤·2025년 2월 25일

1. 도커 이미지 vs 프로그램

  • 도커 이미지는 실행하기 전의 정적인 상태이고,
    docker run 을 해야만 실행이 된다.

  • 프로그램도 실행 파일이 있지만 실행해야만
    프로세스 (실행 중인 프로그램) 이 된다.


2. 실행 중 상태

동작도커 컨테이너프로그램 프로세스
여러 개 실행 가능?✅ (같은 이미지로 여러 컨테이너 실행 가능)✅ (같은 프로그램을 여러 번 실행 가능)
상태 확인docker psps aux, tasklist
종료docker stopkill, Ctrl+C
재시작docker restart다시 실행
  • 도커 컨테이너docker ps 로 실행중인 컨테이너를 확인할 수 있고, 종료하면 사라지거나 멈춘다.

  • 프로세스ps (리눅스), tasklist (윈도우)로 확인하고,
    kill 또는 Ctrl + c 로 종료할 수 있다.


3. 차이점

  1. 격리 여부

    • 도커 컨테이너는 독립적인 환경에서 실행됨 (호스트 OS와 일부 격리)

    • 프로그램 프로세스는 OS에서 직접 실행 (일반적인 실행 방식)

  2. 영속성

    • 도커 컨테이너는 종료 후에도 재시작 가능 (docker start)

    • 일반 프로세스는 종료하면 다시 처음부터 실행


✅ 컨테이너 = 독립적인 프로세스 같은 것
✅ 이미지 = 실행 파일 같은 것
✅ 하지만 컨테이너는 더 격리된 환경에서 동작

"컨테이너는 프로세스의 한 형태이지만, 더 격리되고 관리하기 편한 방식"


4. docker 실습

이미지 다운로드 방법

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 이미지 삭제.


도커 컨테이너의 주 프로세스와 실행 방식

  1. docker run 으로 컨테이너를 실행하면 내부에서 주 프로세스가 작동

    • 도커 컨테이너는 하나의 주 프로세스(메인 프로세스)를 중심으로 실행

    • 컨테이너가 살아있으려면 이 주 프로세스가 계속 실행중이어야 함

    • 주 프로세스가 종료되면, 컨테이너도 자동으로 종료 (EXITED 상태)

  2. 컨테이너에는 주 프로세스 외에도 여러 프로세스가 있을 수 있다.

    • 예를 들어, nginx 컨테이너를 실행하면 nginx 프로세스가 주 프로세스가 되지만,
      내부적으로 worker process 같은 추가 프로세스도 동작할 수 있음
  3. 최종 실행 명령어 (ENTRYPOINT + CMD)

    • 컨테이너가 실행될 때 가장 마지막으로 실행되는 명령어최종 실행 명령어

    • 이는 ENTRYPOINT (기본 실행 프로그램) + CMD (인자)로 구성

    • 예를 들어, 아래와 같은 Dockerfile 을 보면

    ENTRYPOINT ["nginx"]
    CMD ["-g", "daemon off;"]

    실행되면 nginx -g 'daemon off;'가 최종 실행 명령어가 된다.

  4. 주 프로세스가 종료되면 컨테이너도 종료

    • 예를 들어, docker run ubuntu 를 실행하면 기본적으로 아무런 명령어 없이 종료
    docker run ubuntu
    • 하지만 bash 를 실행하면 프로세스가 유지
    docker run -it ubuntu bash
    • 여기서 bash (쉘)가 주 프로세스가 되고, 종료하지 않는 한 컨테이너가 유지

✅ 컨테이너 내부에는 주 프로세스가 반드시 하나 존재해야 함

최종 실행 명령어 = ENTRYPOINT + CMD

✅ 주 프로세스가 종료되면 컨테이너도 자동으로 종료됨

개념 정리

  1. 컨테이너 내부에서 실행되는 주 프로세스가 중요

    • 도커에서 컨테이너를 실행할 때 가장 중요한 개념은 컨테이너 내부에서 실행되는 주 프로세스

    • 컨테이너 내부에서 실행할 프로세스가 존재해야 하고, 프로세스가 실행되는 동안 컨테이너는 유지

  2. hello-world 컨테이너 실행 과정

    • docker run hello-world 를 실행하면, 내부에서 hello 라는 프로그램이 실행

    • 이 프로세스는 단순히 "Hello from Docker!" 메시지를 출력한 후 즉시 종료

    • 주 프로세스가 종료되었기에, 컨테이너도 즉시 종료

  3. 컨테이너 실행과 종료의 관계

실행 명령어내부에서 실행되는 최종 실행 명령어실행 후 동작
docker run hello-world/hello 프로그램 실행메시지 출력 후 종료
docker run ubuntu/bin/bash 실행됨 (일반적으로 종료됨)-it 옵션이 없기 때문에 컨테이너가 실행되었다가 바로 종료됨
docker run -it ubuntu bash/bin/bash 실행 (터미널 유지됨)사용자가 종료(exit)하기 전까지 컨테이너가 유지됨
  1. 컨테이너가 종료되는 이유

    • 내부 프로세스가 종료되었기 때문

    • 도커 컨테이너는 내부에서 실행된 프로세스가 종료되면 컨테이너도 자동으로 정지

    • 컨테이너가 지속되어야 한다면, 오래 지속되는 혹은 영원히 지속되는 프로세스를 사용

  2. nginx 컨테이너는 종료 안됨

  • nginx 웹서버 는 사용자가 명시적으로 종료하지 않으면 계속 실행됨

  • nginx 컨테이너는 자동으로 종료되지 않음

  • Ctrl + c 로 주 프로세스 종료 -> 컨테이너 종료

✅ OS 에서는 특정 프로세스가 종료되어도 OS가 종료되지 않는다.

✅ 도커 컨테이너는 내부에서 실행되는 주 프로스세가 종료되면
컨테이너도 종료
된다.

docker run hello-world → 실행 후 메시지를 출력하고 즉시 종료됨.

docker run ubuntuubuntu 컨테이너가 실행되지만,
-it 옵션이 없기 때문에 즉시 종료됨.

docker run nginxnginx 서버는 자동으로 종료되지 않는 프로세스이기 때문에 컨테이너가 유지됨.

Ctrl + c (으)로 주 프로세스 종료 => 컨테이너 종료

✅ 실행을 유지하려면 오래 지속되는 혹은 영원히 지속되는 프로세스
주 프로세스가 되도록 해야한다.

profile
코딩하는 곤쪽이

0개의 댓글