전공지식/카카오테크캠퍼스_4기

[카테캠] Docker 컨테이너 기초(1)

공부왕찐천재거뇨정 2026. 6. 28. 19:52

목차

- 가상머신 VS 컨테이너

- Docker 개념 및 장점

- Docker 구성요소

- Doker 기본 명령어

 


 

가상머신 VS 컨테이너

* 내 컴퓨터에서는 잘 되는데 타인 컴퓨터에서는 안될 때

  - 개발서버, 테스트 서버, 운영 서버의 환경 불일치 등의 많은 이유

 

* 베어메탈

  - 물리서버를 그대로 사용하는 형태

  - 매우 높은 성능 필요시 사용 ★

  - 운영체제가 하드웨어 위에서 직접 실행

  - 1 물리서버 : 1 OS 만 사용하여 리소스 분할 어렵고 서버활용률 ↓

 

* 가상머신

  - 물리서버 위에 소프트웨어가 올라가고 그 위에서 여러개의 가상컴퓨터가 돌아가는 형태

  - VM은 자기만의 OS를 따로 가짐

  - OS 여러개 돌릴 수 있어서 격리 수준 높음

  - 각 VM이 자체 OS를 포함하므로 무겁고 부팅느림

  - CPU/MEM 오버헤드 존재 -> 컨테이너 시대 등장

 

* 컨테이너

  -  호스트 OS의 커널을 공유하면서 독립된 실행환경만 격리하는 상태

  - OS 전체를 복제하지 않으므로 가볍고 빠름 ★

  - 리소스 효율적으로 사용 ★

  - 커널공유 때문에 VM보다 격리수준 낮고 보안측면도 VM보다 약함


 

* 컨테이너는 독립된 서버처럼 보이지만, 실제로는 리눅스 커널이 이미 갖고있는 기능 조합해서

독립된 것처럼 보이도록 만든 기술.

  - 핵심기술

  1) chroot(가짜루트 만들기) - 이 디렉토리를 루트(/)라고 믿어라

 

  2) namespace(세계관 분리하기) - 네임스페이스는 리눅스의 가장 강력한 격리 기술. 각 프로세스에 분리된 우주를 제공

    - 컨테이너 안에서 hostname 바꿔도 호스트에는 영향 없음

 

  3) cgroup(리눅스 자원 관리하기) - 네임스페이스가 "보이지않게" 만드는 기능이라면, cgroup은 "사용량을 제한"하는 기능

    - 해당 기능으로 하나의 컨테이너가 폭주해도 호스트전체가 다운되지 않음

    - 제한 가능한 자원은 CPU, 메모리, 디스크I/O, 네트워크 대역폭, 프로세스 개수가 있

 

* chroot + namespace + cgroup = 컨테이너 엔진 -> 하나의 작은 가상서버처럼 보이게 된다

 

* VM vs 컨테이너

구분 VM Container
격리 수준 하드웨어 레벨 가상화 OS 레벨 가상화
OS 포함여부 Guest OS 포함(무거움) Host OS 커널 공유(가벼움)
구동 속도 느림(부팅 필요) 빠름(프로세스 실행)
용량 큼(GB) 작음(MB)

 


 

Docker 컨테이너 개념 및 장점

* Docker란

  - 애플리케이션, 실행 환경을  컨테이너라는 독립공간에 패키징하여 인프라에 구애받지 않고 SW를 신속하게 개발,배포,실행할 수 있게 해주는 오픈소스 플랫폼

 

* 컨테이너는 다른 컨테이너와 완전히 독립되어있다

* 어떤 리눅스 시스템에서도 실행 가능

* VM과 달리 호스트OS 커널을 공유하여 경량화되므로 오버헤드 적다

 

* 장점

  1) 유연성 - 복잡한 앱도 컨테이너로 구성가능

  2) 경량성 - OS커널을 공유하여 오버헤드 최소화

  3) 교체 가능성 - 컨테이너 실행중에도 업데이트 가능

  4) 이식성 - 로컬에서 빌드하고 클라우드에 배포하여 어디서나 실행가능

  5) 확장성 - 컨테이너 복제를 통해 확장 가능

 

Docker구성요소 및 주요 컴포넌트

* 도커는 클라이언트-서버 모델

* 3가지 구성 요소

  1) 클라이언트(CLI-도커 명령어 사용)

  2) 도커Host(컨테이너를 런타임환경에서 돌리게하는 영역)

  3) 레지스트리(컨테이너 저장소)

 


 

Docker 기본 명령어

1. Docker build

  - Dockerfile을 기반으로 도커이미지를 생성하는 명령어

  ★ 도커이미지 - 저장본을 실행할 수 있게 만들어주는 템플릿 같은 존재)

 

 

 

2. Docker run

  - 이미지를 기반으로 새 컨테이너를 만들고 실행하는 명령어

docker run [옵션] 이미지이름 [실행할 명령어]

ex) docker run ubuntu:20.04
// ubuntu:20.04 이미지를 이용해 새 컨테이너를 실행

★ 이미지가 컨테이너에 포함되어 런타임환경에 올라감.

 

ex) Docker run 예제

ex1) Ubuntu 컨테이너에서 쉘 접속
docker run -it --name my-ubuntu ubuntu:20.04 bash
                        (네임)    (이미지)   (컨테이너 안에서 실행할 명령-리눅스쉘)

★ 나의 컴퓨터안에 격리된 가상환경의 우분투 컨테이너가 실행된다

★ -it : 옵션 i,t를 붙여쓴 것

  1) -i = interactive

    - 키보드 입력을 컨테이너로 보내줌

  2) -t = tty

    - 가상 터미널을 만들어서 실제 터미널처럼 보이게 함

 

ex2) nginx 웹 서버를 백그라운드로 실행
docker run -d --name web-server -p 8080:80 nginx

★ -d : 컨테이너를 종료하더라도 백그라운드로 계속 실행

★ -p 8080:80

  - 호스트 포트 8080 -> 컨테이너 포트 80으로 연결(nginx가 엮어줌)

  - 브라우저에서 http://localhost:8080 접속 가능

★ 외부접근이 8080으로 들어오는 경로가 나의 컴퓨터 MAC의 8080을 열어준다

 

ex3) 테스트용 컨테이너 자동 삭제
docker run --rm ubuntu:20.04 echo "Hello Docker"

★ --rm : 컨테이너가 명령 실행 마치고 종료되면 자동삭제

★ echo "Hello Docker" : 컨테이너 안에서 한 번 실행 후 종료되는 명령

★ 로그 확인 후 컨테이너 목록을 봐도 남지않음

 

 

3) docker rm

  - 더이상 필요없는 컨테이너를 삭제하는 명령어

  - 디스크와 목록을 깨끗하게 유지하기 위해 필수

docker rm [옵션] 컨테이너이름(or ID) ...

  ※ 실행 중인 컨테이너는 바로 삭제할 수 없음

    -> 먼저  docker stop으로 멈추고, 그 다음 docker rm 실행

 

 

4) docker exec

  - 이미 실행 중인 컨테이너 내부에 접속하거나 특정 명령어를 추가로 실행할 때 사용하는 명령어

  ★ run은 새로운 컨테이너 만들어 실행 <-> exec는 이미 돌아가고 있는 컨테이너 들어가서 작업

docker exec [옵션] CONTAINER COMMAND [ARGS ...]

ex) docker exec -it my-nginx /bin/bash
// 실행 중인 my-nginx 컨테이너에 인터랙티브 모드(-it)로 접속하여 bash 셸 실행