Chapter 2. Docker란? [Container opensource platform]
01. Container 개념
컨테이너(Container)란?
애플리케이션 레벨에서 필요한 소스 코드, 라이브러리 등 모든 파일을 하나의 런타임 환경으로 패키징하는 기술.

가상화 환경에서 컨테이너 환경으로 변화 하면서 바뀐점
01. 하이퍼바이저 → 컨테이너 런타임(Docker)으로 변경.
02. vm → container : 경량화 되어있으므로 빠른 실행속도와 가볍다는 장점이 있다.
따라서 컨테이너 환경은, 시스템을 가상화 하는것이 아닌 어플리케이션을 구동할 수 있는 환경 자체를 가상화 기술
Container 기반 기술은 아래와 같다.

- namespace : 컨테이너에 대한 격리 계층을 제공
- cgroup : 어플리케이션을 특정 리소스 사용 세트(cpu, memory, disk I/O, Network 등)로 제한.
1-1. 장점
이러한 컨테이너 기술을 사용하면 ... 장점은?
- 표준화에 따른 이식성 : OS 플랫폼 간 및 클라우드 간 이식 가능
- 경량화 및 민첩성 : 일반 가상화에 비해 가벼워 더 빠른 빌드 가능
- 신속한 확장성 : 같은 인프라에 더 많은 컨테이너 지원 가능 / 신속한 스케일링 지원
■ Agile한 운영 환경
Container 환경은 DevOps와 동일한 목적성을 가지고 있어서 Agile한 운영 환경을 추구한다.

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

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

- ubuntu:latest 버전의 이미지를 가져온 후, 그 위에 nginx 미들웨어를 설치한다.
- 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
설치 후 검증.

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

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

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

주의사항!!
- Dockerfile을 작성 시 파일 이름도 무조건 ‘Dockerfile’ 이여야 한다.
- 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에서 확인
- 브라우저에서 localhost:8080 또는, localhost:8080/index.html 경로로 확인해보기!

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를 간략하게 말씀드리자면!!
- Dockerfile로 Application infra 구성 (이미지를 실행하기 위한 명세서)
- Application 패키징 하여 build → Docker image 만들기
- image를 Repository에 저장 하여 공유 (Docker hub, ECR 등..)
- Docker run을 통해 Container화 된 Application 배포