logoRawon_Log
홈블로그소개

Built with Next.js, Bun, Tailwind CSS and Shadcn/UI

Docker

Docker - 이미지와 컨테이너

Rawon
2025년 9월 5일
목차
이미지
프로그램 vs 프로세스
이미지 vs 컨테이너
Docker CLI 실습
이미지와 메타데이터
컨테이너 라이프사이클
tencounter 를 활용하여 컨테이너 라이프사이클 실습

목차

이미지
프로그램 vs 프로세스
이미지 vs 컨테이너
Docker CLI 실습
이미지와 메타데이터
컨테이너 라이프사이클
tencounter 를 활용하여 컨테이너 라이프사이클 실습

이미지

일반적으로 서버에서 프로그램을 실행하려면 하드웨어가 필요하고 하드웨어에서 실행할 소프트웨어가 필요합니다.

이때, 소프트웨어는 nginx 웹서버처럼 다운받아 실행할 수도 있고 직접 개발해서 실행할 수도 있습니다.

다만, 소프트웨어는 소프트웨어 하나만 가지고 실행할 수는 없고 소프트웨어가 하드웨어 자원을 사용할 수 있도록 해주는 OS가 필요하고 특정 패키지나 라이브러리, 런타임 언어 설치 등 의존요소(구성)이 필요 합니다.

정리하면 소프트웨어 실행을 위해선 OS, 구성요소, 실행시킬 프로그램 과 같이 3가지가 필요합니다.

그런데 이전 포스팅에서 nginx 웹서버를 컨테이너로 실행했을 때를 생각해보면 이러한 구성을 설정하지 않고

명령어 한줄로 바로 실행했었습니다.

이러한게 가능한 이유는 nginx 이미지 를 통해 컨테이너를 실행했기 때문입니다.

이미지는 특정 시점의 파일 시스템(디렉터리)을 저장한 저장한 압축파일 입니다.

이미지는 **제작단계부터 소프트웨어 뿐만 아니라 실행하기 위해 필요한 모든 요소들을 준비해서 압축**합니다.

즉, 이미지 안에는 OS, 구성요소(의존요소), S/W가 모두 포함되어 있다는 의미입니다.

💡 도커는 가상환경에 서버를 운영하는 기술.

사용하는 목적은 컨테이너 내에서 웹서버나 웹 애플리케이션 같은 소프트웨어를 운영하는 것,

가상화 서버를 빠르고 가볍게 운영하기 위해 사용하는 것이 목적인 S/W.

컨테이너는 이미지를 통해 실행할 수 있으며, 이미지는 특정 소프트웨어를 실행하기 위해 OS, 의존요소, 소프트웨어가 포함되어 있는 파일 시스템 상태를 저장해놓은 압축파일.

이 이미지를 컨테이너로 실행시키면 Host OS 안에서 완전히 격리된 공간인 컨테이너가 만들어지며, 이 내부에서 소프트웨어가 실행됨

프로그램 vs 프로세스

크롬 앱을 설치하면 c드라이브에 크롬 앱이 설치되는데, 이 시점에서 프로그램이 파일 시스템 공간을 차지하게 됩니다.

설치 시에는 디스크 공간만을 차지하며, CPU나 메모리를 사용하는 상태는 아닙니다.

이제 설치된 크롬 앱을 실행하면 프로세스 가 되며, 여러 개의 크롬브라우저를 띄우게 되면 각각의 크롬 프로세스가 CPU와 메모리를 점유하기 때문에 속도가 저하됩니다.

즉, 프로그램은 디스크에 저장되어서 실행 가능한 상태인 파일을 의미하고

이 프로그램을 실제로 실행해서 실행 중인 상태인 것이 프로세스 라고 할 수 있습니다.

프로그램 1개는 여러 개의 프로세스로 실행할 수 있고 프로세스는 OS에서 CPU와 메모리를 할당받아 사용합니다.

이미지 vs 컨테이너

이미지와 컨테이너의 관계도 위 프로그램과 프로세스의 관계와 동일하다고 볼 수 있습니다.

이미지는 프로그램이 실행되기 위해 필요한 환경이 모두 포함된 파일 시스템이라고 했으며, 이러한 이미지를 실행한 것이 컨테이너가 됩니다.

컨테이너 실행을 위해서는 해당하는 이미지를 가지고 있어야 하며, 이미지는 압축파일 형태로 Host 머신의 특정 경로에 위치하게 되며,

이미지 상태에선 disk 공간만 사용하고 컨테이너가 실행되는 순간 CPU와 메모리를 사용하게 됩니다.

또한, 하나의 이미지로 여러 개의 컨테이너를 실행할 수 있습니다.

Docker CLI 실습

docker
docker image ls    // 현재 로컬 PC에 있는 이미지를 조회, tag는 이미지 버전, repo는 이미지 이름

docker image ls 이미지명    // 로컬 PC에 있는 특정 이미지를 조회

docker run -d --name (컨테이너명) 이미지명
// 컨테이너 이름을 지정하고 이미지를 통해 컨테이너를 실행하되 컨테이너를 백그라운드로 실행시킴

docker ps  // 실행 중인 컨테이너 리스트 조회, ps는 프로세스의 줄임말

docker rm -f   // 실행 중인 컨테이너 삭제 (rm 명령어만으로는 실행중인 컨테이너를 삭제할 수 없기 때문에 `-f` 옵션이 필요
docker
PS C:\Users\hiwon> docker run -d --name multinginx1 nginx
6c64cedc3b0257fb7daf260cb6e65d67c61b0d57b3e4fc433896bb0022cab322
PS C:\Users\hiwon> docker run -d --name multinginx2 nginx
a8cac43f2f014d8b2075f1027e2d5d86887cb504fbfea94b5e3e85616129b38a
PS C:\Users\hiwon> docker run -d --name multinginx3 nginx
64f8864b971dc905c8d5acc04f35e52a3002a77720c3279ca1dac23d32ef6efb
PS C:\Users\hiwon> docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS     NAMES
64f8864b971d   nginx     "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds    80/tcp    multinginx3
a8cac43f2f01   nginx     "/docker-entrypoint.…"   7 seconds ago    Up 6 seconds    80/tcp    multinginx2
6c64cedc3b02   nginx     "/docker-entrypoint.…"   11 seconds ago   Up 11 seconds   80/tcp    multinginx1

이미지와 메타데이터

메타데이터 는 데이터에 대한 데이터를 의미하며, 여기서 메타데이터는 이미지에 대한 정보를 기술하는 데이터를 의미합니다.

  • 이름, id, 크기 등을 저장
  • ENV : 애플리케이션이 사용하는 환경설정 값 (키와 값으로 구정되어 있음)
  • CMD : 이미지를 컨테이너로 실행 시 프로세스 실행 명령어 지정
  • 이미지를 컨테이너로 실행할 때, CMD에 있는 명령어를 통해 어떤 프로그램을 실행할지 메타데이터에서 결정

격리된 공간인 컨테이너가 만들어지면 이제 컨테이너에 있는 파일 시스템과 컨테이너의 메타데이터는 새롭게 격리되어 있는 공간이 됩니다.

그리고 이 메타데이터는 컨테이너를 실행할 때 새로운 값으로 덮어쓸 수 있습니다.

docker
docker image inspect 이미지명   // 이미지의 메타데이터 조회

docker container inspect 컨테이너명    // 컨테이너의 세부 정보 조회

docker run 이미지명 (실행명령)   // 컨테이너 실행 시 이미지의 메타데이터 CMD 덮어쓰기

docker run --env KEY=Value 이미지명   // 컨테이너 실행 시 메타데이터의 env 덮어쓰기

Linux의 cat 명령어는 리눅스 기본 명령어 중 하나로, cat 파일경로 와 같이 쓰면 해당 파일의 내용을 출력

docker
// CMD 덮어쓰기 예시
docker run --name customCMD nginx cat usr/share/nginx/html/index.html

그런데, docker ps 로 실행 중인 컨테이너를 조회하면 위 customCMD 컨테이너가 보이지 않을텐데

이는 cat 명령어는 일회성 프로세스로, CMD에서 지정한 cat 명령이 종료되는 순간 container 도 종료되기 때문입니다.

docker ps 대신 docker ps -a 로 종료된 컨테이너까지 확인하면 customCMD 컨테이너를 볼 수 있습니다.

docker
docker ps
docker ps -a

그리고 컨테이너의 메타데이터를 변경했다고 해서 이미지의 메타데이터가 변경되는 것은 아니니 참고 바랍니다.

docker
docker run -d 이미지명

// -d 옵션 추가 시 : 지속적으로 실행되는 데몬 프로그램을 실행할 때 적합, 백그라운드에서 컨테이너 실행
// -d 옵션 제거 시 : 실행 후 종료되는 프로그램에 적합, 실시간으로 로그를 확인할 경우에도 적합

컨테이너 라이프사이클

컨테이너는 이미지에서부터 시작한다는건 이제 이해하실 수 있을 겁니다.

컨테이너의 라이프사이클은 생성 - 실행 - 일시정지 - 종료 - 삭제 로 나누어집니

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2025-09-07_19.19.37.png

Create 생성 단계

  • 컨테이너 실행을 위해 격리된 공간을 만드는 단계이며,
  • 내부에서 프로세스를 실행하지 않기 때문에 Host OS의 CPU나 메모리는 사용하지 않습니다.
  • docker start 를 통해 Container의 메타데이터의 cmd 값을 활용하여 Running(실행 단계)로 만듭니다.

Running 실행 단계

  • running이 되었다는건 컨테이너 내에서 정상적으로 프로세스가 실행 중이란 것을 의미합니다.
  • 실제로 프로세스가 CPU와 메모리를 사용하고 있는 상태입니다.
  • docker run 명령어는 Create와 Start가 합쳐진 명령어이기 때문에 컨테이너를 만듦과 동시에 실행할 수 있습니다.
  • docker restart 는 프로세스 재시작 명령어 입니다.

Pause 일시정지 단계

  • pause 상태는 컨테이너 내 모든 프로세스가 일시중지된 상태를 의미하며,
  • CPU는 사용하지 않고 메모리만 점유하고 있는 상태입니다.
  • docker unpause 명령어를 통해 일시정지한 시점부터 다시 재시작을 할 수 있습니다.

Stop 종료 단계

  • 프로세스를 완전히 중단한 상태를 의미하며, 메모리 / CPU 사용도 모두 중지됩니다.
  • 컨테이너는 rm 명령어를 통해 삭제할 수 있습니다.

tencounter 를 활용하여 컨테이너 라이프사이클 실습

docker
docker logs (컨테이너명)        // 컨테이너의 로그 조회

docker create --name tencounter examplerepo/tencounter

docker start tencounter      // tencounter는 10초 뒤 자동으로 종료

docker ps -a                 // tencounter의 status가 exit

docker start -i tencounter   // 컨테이너 실행 및 로그 출력 지원

docker rm tencounter         // 컨테이너 삭제

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/CigvZ