Cloud Architect/Docker

Chapter 2. Docker란? [Container opensource platform]

"Everything about infra" 2025. 7. 17. 11:54

01. Container 개념

컨테이너(Container)란?

애플리케이션 레벨에서 필요한 소스 코드, 라이브러리 등 모든 파일을 하나의 런타임 환경으로 패키징하는 기술.

 

가상화 환경에서 컨테이너 환경으로 변화 하면서 바뀐점

01. 하이퍼바이저 → 컨테이너 런타임(Docker)으로 변경.

02. vm → container : 경량화 되어있으므로 빠른 실행속도와 가볍다는 장점이 있다.

 

따라서 컨테이너 환경은, 시스템을 가상화 하는것이 아닌 어플리케이션을 구동할 수 있는 환경 자체를 가상화 기술

 

Container 기반 기술은 아래와 같다.

  • namespace : 컨테이너에 대한 격리 계층을 제공
  • cgroup : 어플리케이션을 특정 리소스 사용 세트(cpu, memory, disk I/O, Network 등)로 제한.

 

1-1. 장점

이러한 컨테이너 기술을 사용하면 ... 장점은?

  • 표준화에 따른 이식성 : OS 플랫폼 간 및 클라우드 간 이식 가능
  • 경량화 및 민첩성 : 일반 가상화에 비해 가벼워 더 빠른 빌드 가능
  • 신속한 확장성 : 같은 인프라에 더 많은 컨테이너 지원 가능 / 신속한 스케일링 지원

 

Agile한 운영 환경

Container 환경은 DevOps와 동일한 목적성을 가지고 있어서 Agile한 운영 환경을 추구한다.

MSA 기술을 적용하려면 컨테이너 환경이 가장 최적합.

 

📌 컨테이너 관련 서비스들 (AWS 기준)

  • ECS (Elastic Container Service) : 컨테이너화된 어플리케이션을 효율적으로 배포, 관리
  • Copilot : 로컬 개발환경에서 ECS를 기반으로 컨테이너화된 어플리케이션을 모델링, 관리해주는 cli 툴
  • EKS (Elastic Kubernetes Service) : 쿠버네티스 오케스트레이션 서비스를 관리형 형태로 제공
  • Fargate : 서버리스 컨테이너를 구현해서 컨테이너가 구동되는 호스트의 관리 오버헤드를 줄여줌.
  • AppRunner : 컨테이너 서비스를 어플리케이션 코드 하나로 배포해서 사용 가능.
  • ECR (Elastic Container Registry) : 컨테이너 이미지를 보관하는 레지스트리 서비스
  • AppMesh : 서비스 매쉬를 관리형 형태로 제공하는 서비스
  • Cloudmap : IP 기반 구성요소 상태를 모니터링, 디스커버리 제공

2. Docker 개념

docker란? 컨테이너 가상실행 환경을 제공해주는 대표적인 오픈소스 플랫폼.

docker 아키텍쳐

  • client : docker API를 통해서 docker host에 명령을 내림.
  • daemon : host에 설치가 되어 실제 docker container를 관리하는 역할, client 역할 수행
  • registry : container를 생성하는데 필요한 이미지를 저장하는 저장소.

예를들어, client가 'docker build' 라는 명령을 내리면 daemon이 그 명령을 수행하여 image로 build한다.

또, 'docker run'이라는 명령이 하달되면 parameter로 같이 전달된 image로 container로 띄우게 된다.

 

docker image란? 가상 머신을 띄우기 위한 기반 템플릿(이미지)

container 환경으로 생성하기 위한 과정

 

  • image : 컨테이너가 실행되기 위해 필요한 프로그램이나 소스코드, 라이브러리 및 종속성에 대한 정의가 포함된 데이터 파일. 즉, 컨테이너를 정의하는 읽기 전용 템플릿이다.
  • Dockerfile : 컨테이너에 설치해야되는 패키지, 소스코드, 명령어, 환경변수 설정 등을 기록해서 이 기반으로 이미지를 생성함. 즉, 도커 이미지를 실행하기 위한 명세서이다.

Dockerfile 예시

  1. ubuntu:latest 버전의 이미지를 가져온 후, 그 위에 nginx 미들웨어를 설치한다.
  2. index.html 파일을 /usr/share/nginx/html/ 경로에 파일을 복사, CMD 명령을 통하여 nginx를 실행시킨다.

 

Docker  Workflow

 

1. 관리자가 Dockerfile을 정의, 작성

2. docker cli 명령을 통해 image build

3. image가 완성이 되면, local에서 잘 생성이 되었는지 'docker run' 등 명령을 통해 테스팅.

4. 문제가 없다면, 이미지 저장소(ex: docker hub)로 image를 push

5. 실제 어플리케이션이 구동되는 환경에서 이미지 저장소에서 image를 pull 해온다. (가져온다)

 


3. Docker 설치 및 간단한 실습

필자 환경 : Macbook M2 pro

설치 링크 : Mac | Docker Docs

 

Mac

Install Docker Desktop for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

 

설치 후 검증.

terminal에서 해당 명령을 통해 설치 버전 확인.

 

 

container image pull

 

■ search [image 검색]

docker search nginx

  • docker hub에서 image를 가져올 경우 검색용으로 사용되는 명령어.
  • image의 이름, 설명, STARS 정보(신뢰성, 공식적인 이미지인지) 등이 포함되어 있다.

■ pull [image download]

docker image pull [name]:[version] 의 형태로 사용되며, version 입력 안할 시 latest 버전

 

■ download 받은 list 확인

docker image list

 

[응용] Container 실행

 

■ 포트 바인딩 : host port를 container port와 맵핑

docker run -p 8080:80 nginx
docker ps

nginx 이미지의 기본 포트인 80을 컨테이너 포트로 지정후, 호스트 포트 8080으로 맵핑하였으므로 local에서 8080포트로 접근 시 nginx 접근 가능

 

■ ubuntu 환경에서 백그라운드 옵션으로 container 실행

  • bash 쉘인 ubuntu 특성상 컨테이너가 실행되고 있지 않으면 컨테이너 상태가 필요없다고 판단되고 종료됨.
  • -it 옵션을 사용하여 컨테이너가 사용되게 해보자.
  • 컨테이너를 백그라운드 상태로 돌려서 종료시키지 않게끔 ‘-d’ 옵션 사용
docker run -it -d --name test2-ubuntu ubuntu:20.04

test-ubuntu 라는 컨테이너의 이름을 사용하여 ubuntu 이미지의 20.04 버전을 사용. 가상 터미널 환경으로 입출력 허용, 백그라운드 상태로 test2-ubuntu 라는 컨테이너 실행

 

3-1. Dockerfile 작성

Docker가 image를 빌드하면서 Layer를 쌓아 나가므로 문법 및 Layer 순서대로 작성 중요.

 

 

주의사항!!

  1. Dockerfile을 작성 시 파일 이름도 무조건 ‘Dockerfile’ 이여야 한다.
  2. COPY 명령어 에서 로컬에 있는 index.html 파일을 컨테이너 안의 /var/www/html 경로에 놓기 때문에, Dockerfile과 index.html의 위치가 같아야 한다.

 

[실습하기]

 

1. image build

docker image build -t ssunghwan/sample-apache:0.1 .
docker run -d -p 8080:80 --name test-server ssunghwan/sample-apache:0.1
  • 현재 위치에 있는 Dockerfile, index.html 파일을 sample-apache 이름과 0.1 버전으로 빌드하겠다.
  • 이미지를 저장소에서 불러와서 컨테이너로 실행시키기.

2. Local에서 확인

3. image를 repository에 build

  • 'images' 명령을 통해 빌드 확인 & Repo도 확인해보기!
docker push ssunghwan/sample-apache:0.1
docker images

 


 

[ 결론 ]

 

Docker란? 여러 계층의 Application을 container로 분리, 연결하여 실행하는(API 라고 함) MSA 프로젝트에 유용.

  • Application의 Infra(runtime)는 Image를 통해 제공하고, Public, Private 하게 공유 가능.
  • 제공된 Image를 기반으로 Application을 제공하고, 이를 컨테이너화 하여 어플리케이션 배포를 할 수 있다.

Docker build flow를 간략하게 말씀드리자면!!

  1. Dockerfile로 Application infra 구성 (이미지를 실행하기 위한 명세서)
  2. Application 패키징 하여 build → Docker image 만들기
  3. image를 Repository에 저장 하여 공유 (Docker hub, ECR 등..)
  4. Docker run을 통해 Container화 된 Application 배포