1. 소개

로컬과 서버의 OS가 다르고, 설치된 언어의 버전이 꼬이거나 라이브러리 경로가 어긋나면 본격적인 개발을 시작하기도 전에 진이 다 빠지곤 한다. 도커 컨테이너는 바로 이러한 환경의 파편화 문제를 해결하기 위해 등장했다. 핵심은 실행 환경의 표준화이다. 어디서든 동일한 환경을 보장해주는 도커 컨테이너의 내부 동작 방식과 실제 활용법을 정리해보고자 한다.



2. 기저의 역사

컨테이너 기술의 탄생부터 도커, 그리고 현재의 클라우드 네이티브 생태계까지

2.1. 컨테이너의 탄생


2.2. VM과 컨테이너의 공존

구분 가상 머신 (VM) 초기 컨테이너 (LXC 등)
격리 하드웨어 수준 격리 (하이퍼바이저)로 안전 호스트 커널을 공유하여 보안 우려
범용성 Windows 호스트에서 Linux 실행이 가능 호스트 OS와 컨테이너 OS가 동일해야함
관리 VMware 등 성숙한 관리 솔루션이 존재 CLI 기반으로 설정이 매우 복잡하고 파편화
이식성 가상 디스크가 너무 커서 옮기기 어려움 환경이 조금만 달라져도 실행이 안 되는 경우가 많았음

2.3. Docker의 등장


2.4 Docker 그 이후



3. VM과 컨테이너


구분 VM Docker Container
구조 HW 레벨 가상화 (Guest OS 필수) OS 레벨 가상화 (Host OS 커널 공유)
속도 부팅 및 실행이 느림 (분 단위) 프로세스 실행 수준으로 매우 빠름 (초 단위)
무게 GB 단위, 무겁고 자원소모⬆️ MB 단위, 가볍고 효율적임


4. Docker

4.1. Docker 핵심 개념


4.2. Dockerfile

명령어 의미 및 역할
FROM 이미지를 생성할 때 기반이 되는 Base Image 지정
RUN 이미지 빌드 과정에서 명령어를 실행하여 새로운 레이어를 생성
COPY 호스트에 있는 파일이나 디렉토리를 이미지 내부의 경로로 복사
ADD COPY와 유사 -> 압축 파일 해제, 파일을 다운로드하는 기능 등
WORKDIR 이후 실행될 명령어가 실행될 작업 디렉토리를 설정
ENV 이미지 내부에서 사용할 환경 변수를 설
EXPOSE 컨테이너가 실행될 때 외부로 노출할 포트 번호 지정
CMD 컨테이너가 실행될 때 기본으로 실행될 명령어
ENTRYPOINT 컨테이너 실행 시 반드시 실행되어야 하는 명령어 지정

4.3. Docker 내부 아키텍처와 작동 방식


실행 흐름 요약

  1. 사용자가 명령을 내리면 dockerd가 이를 수신한다.
  2. dockerdcontainerd에게 컨테이너 생성을 요청한다.
  3. containerdcontainerd-shim을 띄우고 runc를 호출한다.
  4. runc는 운영체제 커널 기능을 이용해 컨테이너를 만들고 사라진다.
  5. 결과적으로 컨테이너 프로세스는 containerd-shim에 의해 관리되며 안정적으로 돌아간다.

지방 축제 부스를 예시로 다시 정리해보자



5. 사용 방법

간단한 파이썬 애플리케이션을 도커 환경에서 실행하는 과정을 통해 사용 방법을 알아보자

Dockerfile 작성

# 1. 베이스 이미지 지정
FROM python:3.9-slim

# 2. 호스트의 파일을 컨테이너 내부로 복사
COPY . /app
WORKDIR /app

# 3. 의존성 설치 및 앱 실행
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Docker image 빌드와 run

작성이 완료되면 터미널에서 이미지를 빌드하고 컨테이너를 띄운다.

# Dockerfile을 읽어 'my-python-app'이라는 이름의 이미지를 빌드한다.
$ docker build -t my-python-app .

# 빌드된 이미지를 백그라운드(-d)에서 포트 8080으로 연결하여 실행한다.
$ docker run -d -p 8080:8080 my-python-app


6. Q&A

Docker가 OS를 따로 설치하지 않는데, FROM 을 통해 ubuntu, apline 등을 가져오는 이유


도커 이미지에 실제 코드가 압축되어 들어가나?


컨테이너는 인스턴스 인가?


컨테이너 내부에서 PID 1의 의미


왜 runc는 퇴근해야 할까?


Unix Domain Socket Program


폐쇄망에서 작업 시 Dns 서버의 부재


OverlayFS 기반 계층 파일 시스템이란?


그럼에도 불구하고 VM을 사용하는 경우



7. Reference