정재훈-2
목차
[따배도] 3-1. 도커 컨테이너 살펴보기: 이론편
[따배도] 4-1. 도커 컨테이너 만들어보기: 이론편
[따배도] 5-1. 컨테이너 보관창고 - 이론편
[따배도] 6-1. Docker 컨테이너 사용하기 - 이론편
[따배도] 7-1. Docker 컨테이너 리소스를 관리해야지 - 이론편
컨테이너와 컨테이너 이미지의 차이
1) 컨테이너란?
하나의 어플리케이션이 독립적으로 실행되는 공간
예시 : Node.js, PHP, MySQL 각각이 하나의 컨테이너가 될 수 있습니다.
컨테이너는 CPU, 메모리, 네트워크 등 리소스를 각각 따로 가지고 있어서 서로 간섭하지 않습니다.(독립성)
2) 컨테이너 이미지란?
컨테이너를 만들기 위한 설계도 같은 파일입니다.
여러 겹의 Layer로 구성되어 있습니다.
이미지를 바탕으로 컨테이너가 만들어지고 실행됩니다.
3) 정리
컨테이너 이미지 = 조립 설명서
컨테이너 = 설명서를 따라 만든 완성품
컨테이너 동작 방식과 도커 호스트 역할
1) 도커 호스트(Docker Host)
도커가 설치된 컴퓨터나 서버를 말합니다.
2) 컨테이너 실행 과정
도커 클라이언트(명령어를 입력하는 사용자 도구)가 도커 데몬에게 컨테이너 실행 요청을 합니다.
도커 데몬은 저장된 컨테이너 이미지를 불러와서 메모리에 올리고, 독립된 프로세스로 실행합니다.
실행 중인 컨테이너는 실제로는 프로세스 하나지만, 격리된 환경에서 독립적으로 동작합니다.
3) 도커 허브(Docker Hub)
도커 이미지들이 저장된 온라인 저장소입니다.
수많은 이미지가 공개되어 있어, 필요한 이미지를 쉽게 내려받아 사용할 수 있습니다.
도커파일(Dockerfile)로 컨테이너 만들기
도커파일은 컨테이너를 만들기 위한 ‘설계도’ 같은 텍스트 파일입니다.
도커파일에는 컨테이너를 만들 때 필요한 명령어들이 순서대로 적혀 있습니다.
주요 명령어
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)가 있어요?
1) 도커 레지스트리란?
도커 레지스트리는 컨테이너 이미지를 저장하는 '창고' 같은 곳 입니다.
퍼블릭 레지스트리: 누구나 사용할 수 있는 공개 저장소 (예: 도커 허브)
프라이빗 레지스트리: 회사나 개인이 내부에서만 사용하는 비공개 저장소
컨테이너 이미지는 도커 푸쉬(docker push) 명령어로 레지스트리에 업로드하고,
도커 풀(docker pull)로 내려받아요.
2) 프라이빗 레지스트리 구축하기
프라이빗 레지스트리는 회사 내부에서만 사용하는 비공개 저장소입니다.
도커 공식 이미지 중에
registry
라는 컨테이너를 실행하면 나만의 레지스트리를 만들 수 있습니다.프라이빗 레지스트리에 이미지를 업로드할 때는 호스트명과 포트 번호를 포함한 이름을 써야 합니다.
회사 내부에서만 안전하게 이미지를 관리할 수 있습니다.
컨테이너를 사용하자
1) 컨테이너 이미지 사용하기
컨테이너 이미지는 실행 가능한 프로그램과 환경이 담긴 '설치 파일' 같은 것 입니다.
이미지는 Registry(저장소)에 저장되어 있고, 필요할 때 내 컴퓨터(Host)로 다운로드(pull) 합니다.
이미지를 확인하려면 docker images 명령어를 사용합니다.
필요 없으면 docker rmi '이미지이름' 으로 이미지를 삭제할 수 있습니다.
2) 컨테이너 실행 라이프 사이클 이해하기
이미지는 그냥 파일일 뿐, 실행하려면 컨테이너라는 '실행 중인 프로그램'으로 만들어야 합니다.
docker create 명령어로 이미지를 컨테이너로 '만들기'만 하고, 실제 실행은 docker start로 합니다.
docker run 명령어 하나로 이미지 다운로드부터 컨테이너 생성, 실행까지 한 번에 할 수 있습니다.
컨테이너 상태는 크게 세 가지로 나눌 수 있습니다 :
1. Created(만들어진 상태) — 실행 전
2. Running(실행 중) — 프로그램이 작동 중
3. Stopped(중지됨) — 실행이 멈춘 상태
3) 동작 중인 컨테이너 관리하기
실행 중인 컨테이너 내부에서 어떤 프로세스가 돌아가는지 보고 싶으면 docker top ‘컨테이너이름’ 을 사용합니다.
컨테이너가 만든 로그를 보려면 docker logs ‘컨테이너이름’ 명령어가 유용합니다.
컨테이너 안으로 접속해서 직접 명령어를 실행하고 싶으면 docker exec -it ‘컨테이너이름’ bash 같은 명령어로 쉘에 들어갈 수 있습니다.
컨테이너 리소스를 관리해야지
1) 컨테이너 리소스 제한 기본 개념
컴퓨터에는 CPU, 메모리, 디스크 같은 하드웨어 자원이 있는데, 컨테이너는 기본적으로 이 자원을 제한 없이 모두 사용할 수 있습니다.
한 컨테이너가 너무 많은 자원을 쓰면, 다른 컨테이너가 부족해져서 성능 저하가 발생할 수 있기에 각 컨테이너 별로 자원 사용량을 제한해 줘야 합니다.
2) 메모리 리소스 제한 방법
--memory (-m) | 컨테이너가 사용할 수 있는 최대 메모리 용량을 지정합니다. |
---|---|
--memory-reservation | 최소 보장 메모리 용량입니다. 예를 들어 --memory-reservation=500m은 컨테이너가 적어도 500MB는 사용할 수 있도록 보장해 줍니다. |
--memory-swap | 메모리 + 스왑 공간(디스크를 메모리처럼 사용하는 공간)의 최대 합계입니다. |
--oom-kill-disable | 메모리가 부족할 때 리눅스 커널이 자동으로 프로세스를 죽이는 기능(Out Of Memory Killer)을 끌 수 있습니다. |
비유 : 메모리는 컨테이너가 쓸 수 있는 '책상 크기'라고 생각하면, 책상이 작으면 자료를 많이 펼칠 수 없으니 작업이 힘들겁니다. 제한을 걸면 책상 크기를 조절하는 겁니다.
3) CPU 리소스 제한 방법
--cpus | 컨테이너가 사용할 수 있는 CPU 코어 수를 소수점으로 지정합니다. |
---|---|
--cpuset-cpus | 컨테이너가 사용할 CPU 코어 번호를 지정합니다. |
--cpu-shares | CPU 사용 우선순위(비율)를 지정합니다. 기본값은 1024이고, 2048로 설정하면 다른 컨테이너보다 2배 더 많은 CPU 시간을 받을 수 있어요. |
비유 : CPU 제한은 컨테이너에게 '몇 개의 작업대'를 줄지, 또는 '작업대 사용 우선순위'를 정하는 것과 비슷합니다.
4) Block I/O (디스크 입출력) 제한 방법
--blkio-weight | 디스크 입출력 우선순위(가중치)를 100~1000 사이에서 지정합니다. 기본값은 500입니다. |
---|---|
--device-read-bps / --device-write-bps | 특정 디바이스에 대해 초당 읽기/쓰기 바이트 수를 제한합니다. |
--device-read-iops / --device-write-iops | 초당 입출력 작업 수(IOPS)를 제한합니다. |
비유 : 디스크 I/O 제한은 컨테이너가 '얼마나 빨리 책을 읽고 쓰는지'를 조절하는 것과 같습니다.