정재훈-2

정재훈-2

목차

[따배도] 3-1. 도커 컨테이너 살펴보기: 이론편
[따배도] 4-1. 도커 컨테이너 만들어보기: 이론편
[따배도] 5-1. 컨테이너 보관창고 - 이론편
[따배도] 6-1. Docker 컨테이너 사용하기 - 이론편
[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편

 


컨테이너와 컨테이너 이미지의 차이

image-20250526-005506.png

1) 컨테이너란?

  • 하나의 어플리케이션이 독립적으로 실행되는 공간

  • 예시 : Node.js, PHP, MySQL 각각이 하나의 컨테이너가 될 수 있습니다.

  • 컨테이너는 CPU, 메모리, 네트워크 등 리소스를 각각 따로 가지고 있어서 서로 간섭하지 않습니다.(독립성)

image-20250526-005631.png

 

2) 컨테이너 이미지란?

  • 컨테이너를 만들기 위한 설계도 같은 파일입니다.

  • 여러 겹의 Layer로 구성되어 있습니다.

  • 이미지를 바탕으로 컨테이너가 만들어지고 실행됩니다.

3) 정리

  • 컨테이너 이미지 = 조립 설명서

  • 컨테이너 = 설명서를 따라 만든 완성품

 


컨테이너 동작 방식과 도커 호스트 역할

image-20250526-010111.png

1) 도커 호스트(Docker Host)

  • 도커가 설치된 컴퓨터나 서버를 말합니다.

2) 컨테이너 실행 과정

  • 도커 클라이언트(명령어를 입력하는 사용자 도구)가 도커 데몬에게 컨테이너 실행 요청을 합니다.

  • 도커 데몬은 저장된 컨테이너 이미지를 불러와서 메모리에 올리고, 독립된 프로세스로 실행합니다.

  • 실행 중인 컨테이너는 실제로는 프로세스 하나지만, 격리된 환경에서 독립적으로 동작합니다.

3) 도커 허브(Docker Hub)

  • 도커 이미지들이 저장된 온라인 저장소입니다.

  • 수많은 이미지가 공개되어 있어, 필요한 이미지를 쉽게 내려받아 사용할 수 있습니다.


도커파일(Dockerfile)로 컨테이너 만들기

image-20250526-010922.png
  • 도커파일은 컨테이너를 만들기 위한 ‘설계도’ 같은 텍스트 파일입니다.

  • 도커파일에는 컨테이너를 만들 때 필요한 명령어들이 순서대로 적혀 있습니다.

  • 주요 명령어

FROM

베이스 이미지(운영 환경)를 지정합니다.

FROM

베이스 이미지(운영 환경)를 지정합니다.

COPY or ADD

내 컴퓨터의 파일을 컨테이너 안으로 복사합니다.

RUN

컨테이너 안에서 실행할 명령어를 적습니다

CMD or ENTRYPOINT

컨테이너가 실행될 때 자동으로 실행할 명령어를 지정합니다.

EXPOSE

컨테이너가 외부와 통신할 포트를 알려줍니다.

WORKDIR

작업 디렉토리를 설정합니다.

ENV

환경 변수를 설정합니다.

USER

컨테이너 실행 권한을 지정해 보안성을 높입니다.

1) 실습 예시 :

  • Node.js 앱 컨테이너 만들기
    FROM node : 12
    COPY ./app.js /app.js
    CMD [“node“, “/app.js“]

2) 컨테이너 배포 방법 :

  • 만든 컨테이너 이미지는 다른 사람이나 서버에서 쓸 수 있도록 도커 허브(Docker Hub) 같은 저장소에 올려야 합니다.

  • 도커 허브는 컨테이너 이미지를 저장하고 공유하는 온라인 공간입니다.

  • 배포 과정:
    1. 도커 허브에 로그인 (docker login)
    2. 컨테이너 이미지에 태그 붙이기 (docker tag)
    3. 이미지 업로드 (docker push)

 


컨테이너 보관 창고(Registry)가 있어요?

image-20250526-015530.png

1) 도커 레지스트리란?

  • 도커 레지스트리는 컨테이너 이미지를 저장하는 '창고' 같은 곳 입니다.

  • 퍼블릭 레지스트리: 누구나 사용할 수 있는 공개 저장소 (예: 도커 허브)

  • 프라이빗 레지스트리: 회사나 개인이 내부에서만 사용하는 비공개 저장소

  • 컨테이너 이미지는 도커 푸쉬(docker push) 명령어로 레지스트리에 업로드하고,
    도커 풀(docker pull)로 내려받아요.

2) 프라이빗 레지스트리 구축하기

  • 프라이빗 레지스트리는 회사 내부에서만 사용하는 비공개 저장소입니다.

  • 도커 공식 이미지 중에 registry라는 컨테이너를 실행하면 나만의 레지스트리를 만들 수 있습니다.

  • 프라이빗 레지스트리에 이미지를 업로드할 때는 호스트명과 포트 번호를 포함한 이름을 써야 합니다.

  • 회사 내부에서만 안전하게 이미지를 관리할 수 있습니다.

 


컨테이너를 사용하자

image-20250526-020720.png

1) 컨테이너 이미지 사용하기

  • 컨테이너 이미지는 실행 가능한 프로그램과 환경이 담긴 '설치 파일' 같은 것 입니다.

  • 이미지는 Registry(저장소)에 저장되어 있고, 필요할 때 내 컴퓨터(Host)로 다운로드(pull) 합니다.

  • 이미지를 확인하려면 docker images 명령어를 사용합니다.

  • 필요 없으면 docker rmi '이미지이름' 으로 이미지를 삭제할 수 있습니다.

image-20250526-020844.png

2) 컨테이너 실행 라이프 사이클 이해하기

  • 이미지는 그냥 파일일 뿐, 실행하려면 컨테이너라는 '실행 중인 프로그램'으로 만들어야 합니다.

  • docker create 명령어로 이미지를 컨테이너로 '만들기'만 하고, 실제 실행은 docker start로 합니다.

  • docker run 명령어 하나로 이미지 다운로드부터 컨테이너 생성, 실행까지 한 번에 할 수 있습니다.

  • 컨테이너 상태는 크게 세 가지로 나눌 수 있습니다 :
    1. Created(만들어진 상태) — 실행 전
    2. Running(실행 중) — 프로그램이 작동 중
    3. Stopped(중지됨) — 실행이 멈춘 상태

3) 동작 중인 컨테이너 관리하기

  • 실행 중인 컨테이너 내부에서 어떤 프로세스가 돌아가는지 보고 싶으면 docker top ‘컨테이너이름’ 을 사용합니다.

  • 컨테이너가 만든 로그를 보려면 docker logs ‘컨테이너이름’ 명령어가 유용합니다.

  • 컨테이너 안으로 접속해서 직접 명령어를 실행하고 싶으면 docker exec -it ‘컨테이너이름’ bash 같은 명령어로 쉘에 들어갈 수 있습니다.

 


컨테이너 리소스를 관리해야지

image-20250526-042728.png

1) 컨테이너 리소스 제한 기본 개념

  • 컴퓨터에는 CPU, 메모리, 디스크 같은 하드웨어 자원이 있는데, 컨테이너는 기본적으로 이 자원을 제한 없이 모두 사용할 수 있습니다.

  • 한 컨테이너가 너무 많은 자원을 쓰면, 다른 컨테이너가 부족해져서 성능 저하가 발생할 수 있기에 각 컨테이너 별로 자원 사용량을 제한해 줘야 합니다.

2) 메모리 리소스 제한 방법

--memory (-m)

컨테이너가 사용할 수 있는 최대 메모리 용량을 지정합니다.
예를 들어 -m 512m은 최대 512MB까지만 쓸 수 있다는 뜻입니다.

--memory (-m)

컨테이너가 사용할 수 있는 최대 메모리 용량을 지정합니다.
예를 들어 -m 512m은 최대 512MB까지만 쓸 수 있다는 뜻입니다.

--memory-reservation

최소 보장 메모리 용량입니다. 예를 들어 --memory-reservation=500m은 컨테이너가 적어도 500MB는 사용할 수 있도록 보장해 줍니다.

--memory-swap

메모리 + 스왑 공간(디스크를 메모리처럼 사용하는 공간)의 최대 합계입니다.
예를 들어 -m 300m --memory-swap 500m이면 실제 메모리 300MB + 스왑 200MB까지 쓸 수 있습니다.

--oom-kill-disable

메모리가 부족할 때 리눅스 커널이 자동으로 프로세스를 죽이는 기능(Out Of Memory Killer)을 끌 수 있습니다.

  • 비유 : 메모리는 컨테이너가 쓸 수 있는 '책상 크기'라고 생각하면, 책상이 작으면 자료를 많이 펼칠 수 없으니 작업이 힘들겁니다. 제한을 걸면 책상 크기를 조절하는 겁니다.

3) CPU 리소스 제한 방법

--cpus

컨테이너가 사용할 수 있는 CPU 코어 수를 소수점으로 지정합니다.
예를 들어 --cpus=0.5는 CPU 1개 중 절반만 사용 가능하다는 뜻입니다.

--cpus

컨테이너가 사용할 수 있는 CPU 코어 수를 소수점으로 지정합니다.
예를 들어 --cpus=0.5는 CPU 1개 중 절반만 사용 가능하다는 뜻입니다.

--cpuset-cpus

컨테이너가 사용할 CPU 코어 번호를 지정합니다.
예를 들어 --cpuset-cpus="0,1"은 0번과 1번 코어만 사용 가능하다는 의미입니다.

--cpu-shares

CPU 사용 우선순위(비율)를 지정합니다. 기본값은 1024이고, 2048로 설정하면 다른 컨테이너보다 2배 더 많은 CPU 시간을 받을 수 있어요.

  • 비유 : CPU 제한은 컨테이너에게 '몇 개의 작업대'를 줄지, 또는 '작업대 사용 우선순위'를 정하는 것과 비슷합니다.

4) Block I/O (디스크 입출력) 제한 방법

--blkio-weight

디스크 입출력 우선순위(가중치)를 100~1000 사이에서 지정합니다. 기본값은 500입니다.

--blkio-weight

디스크 입출력 우선순위(가중치)를 100~1000 사이에서 지정합니다. 기본값은 500입니다.

--device-read-bps / --device-write-bps

특정 디바이스에 대해 초당 읽기/쓰기 바이트 수를 제한합니다.

--device-read-iops / --device-write-iops

초당 입출력 작업 수(IOPS)를 제한합니다.

  • 비유 : 디스크 I/O 제한은 컨테이너가 '얼마나 빨리 책을 읽고 쓰는지'를 조절하는 것과 같습니다.