2024. 1. 19. 13:17ㆍ클라우드/AWS
1월 AWS Dev Tools & Container Basic (1/19)
Container & Docker
Container 개념과 Docker 기능 소개 및 Container Application 배포 실습
애플리케이션 환경 구성 요소
Runtime Engine | ↔ | Code |
↕ | ↕ | |
Dependencies | ↔ | Configuration |
내 PC에서는 잘 되었는데 왜 prod에서는 안되나요?
v6.0.0 Local Laptop |
v7.0.0 Staging/QA |
v4.0.0 Production |
v7.0.0 On-Prem |
컨테이너가 해결해드립니다.
Runtime Engine |
Dependencies |
Code |
컨테이너 Container
소프트웨어 서비스를 실행하는 데 필요한
특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은
종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지
어떤 환경에서나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지 |
다른 프로세스와 격리된 상태로 OS에서 소프트웨어를 실행하는 기술 |
컨테이너 환경
Container 1 | Container 2 | Container 3 |
App 1 | App 2 | App 3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Container Engine | ||
OS | ||
Physical Hardware (Server) |
컨테이너 환경
Container 1 | Container 2 | Container 3 | Container 4 | Container 5 | Container 6 | |||
↓ | ↓ | ↓ | ↓ | ↓ | ↓ | |||
Container Runtime | ||||||||
↓ | ↓ | ↓ | ||||||
Linux Kernel
|
도커 Docker
- dotCloud (현재는 Docker, Inc)에서 개발한
경량화된 컨테이너 가상화 플랫폼
"Build, Ship, Run" - 애플리케이션 관리와 배포를 위한 툴의 생태계(EcoSystem)
- 오픈 소스 프로젝트: Moby
- Apache 2.0 license
도커와 컨테이너
- LXC (2008)
- OpenShift (2011)
- Docker (2013)
- Amazon ECS (2015)
- Kubernetes (2015)
- CNCF (2016)
- Containerd (2016)
- OCI (2017)
- CRI-O (2017)
- Amazon EKS (2018)
컨테이너 런타임 Container Runtime
도커 이미지와 컨테이너
Dockerfile → Build →Docker Image → Run ↔ Docker Container
Docker Repository ↗
도커 이미지
- 컨테이너를 만드는 데 사용되는 읽기 전용 템플릿
- Dependency를 포함한 기본 이미지로 시작
쓰기 전용 영역에 커스텀 코드를 추가 - Union 파일 시스템이 여러 개의 이미지를 단일 이미지로 병합(merge)
- Dockerfile로 쉽게 동일한 컨테이너를 생성
Dockerfile과 도커 이미지
FROM ngnix\:latest
COPY index.html /usr/share/nginx/html
FROM ubuntu:18.04
RUN apt-get update -y
RUN apt-get install -y nodejs
RUN apt-get install -y nginx
COPY index.html /usr/share/nginx/html
가상 머신(Virtual Machine) vs 도커(Docker)
VM | ||
App1 | App2 | App3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Guest OS | Guest OS | Guest OS |
Hypervisor | ||
Host OS | ||
Server (Host) |
Container | ||
App1 | App2 | App3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Docker | ||
Host OS (Linux OS) | ||
Server (Host) |
가상 머신(Virtual Machine) vs 도커(Docker)
도커 컨테이너 | 가상 머신 |
OS에 적은 영향 빠른 구동 속도 최소한의 저장 공간 사용 |
OS에 많은 영향 느린 구동 속도 많은 저장 공간 사용 |
공유, 재구축, 배포가 쉬움 | 공유, 재구축, 배포가 쉽지 않음 |
애플리케이션과 환경을 캡슐화 App and Environment Encapsulation |
전체 머신을 캡슐화 Whole machine Encapsulation |
도커 on Mac & Windows
Container | ||
App1 | App2 | App3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Docker - Linux OS |
||
HyperKit | ||
MAC OS | ||
Server (Host) |
Container | ||
App1 | App2 | App3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Docker - Linux OS |
||
Hyper-V | ||
Windows OS | ||
Server (Host) |
실제 컨테이너 구성
Container | ||
App1 | App2 | App3 |
Bins/Libs | Bins/Libs | Bins/Libs |
Docker | Docker | Docker |
Guest OS | Guest OS | Guest OS |
Hypervisor | ||
Host OS | ||
Server (Host) |
Docker - VM만 구동시키는 것보다 더 많은 자원을 사용
GuestOS, Hypervisor, Host OS, Server(Host) - 이식성(Portability)을 최대화 하기 위해 안정적인 IaaS를 구축
도커 컴포넌트 Component
docker(CLI)
dockerd(daemon)
Docker Hub
컨테이너 생성
컨테이너 생애 주기 Lifecycle
컨테이너 실행
docker run IMAGE [COMMAND]
--name 컨테이너_이름
-d (--detach, 백그라운드 실행)
-i (--interactive, 컨테이너 터미널 연결)
-t (--tty, 가상 TTY 할당)
-p host_port:dontainer_port
-v host_directory:container_directory
예)
dockr run --name test -it debian
docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
docker run -d -p 8080:80 --name nginx nginx\:latest
도커 컨테이너 기본 작업
이미지 생성 docker build
이미지 목록 docker image ls
이미지 삭제 docker rm
이미지 업로드 docker push
컨테이너 실행 docker run
이미지 획득 docker pull
컨테이너 로그 docker logs
컨테이너 정지 docker stop
도커 네트워크 드라이버
- Bridge
- Host
- None
- Container
- Overlay
- Network Plug-in
- Weave
- Flannel
- Openvswitch
컨테이너 네트워킹 - 브리지 모드
- bridge : 기본 네트워크 모드
- 호스트에 가상 네트워크 브리지 (docker0) 자동 생성
- 컨테이너의 가상 네트워크 인터페이스(veth)가 docker0에 연결
- 생성되는 컨테이너에 순차적으로 IP 할당
docker run -d -p 8080:80 --name Container1 nginx
docker run -d -p 8306:3306 --name Container2 mysql
docker network create --driver bridge mybridge
docker run --net=mybridge --name Container1 nginx
docker run --net=mybridge --name Container2 mysql
컨테이너 네트워킹 - 컨테이너 모드
- container
- 참조하는 기존 컨테이너의 네트워크 공유
- 동일한 IP, MAC 주소 사용
docker run –it -d --name Container1 ubuntu
docker run –it -d --name Container2 mysql --net container:Conatiner1 ubuntu
컨테이너 네트워킹 - MacVLAN 모드
- MacVLAN
- 호스트 NIC를 가상화
- 동일한 물리 네트워크 환경 제공
- 호스트와 컨테이너간 통신 가능
docker network create --driver=macvlan --subnet=192.168.0.0/24 my_macvlan
docker run –it –d --name Container1 --network my_macvlan ubuntu
docker run –it –d --name Container2 --network my_macvlan ubuntu
컨테이너 네트워킹 - 오버레이 모드
- overlay
- multi host networking
- 다수의 도커 데몬 호스트간 네트워킹
- 도커 스웜(Docker swarm) 필요
docker swarm init
docker swarm join
docker network create --driver=overlay over-net
docker run –it –d --name Container1 --network over-net ubuntu
docker run –it –d --name Container2 --network over-net ubuntu
도커 데이터 저장 - Persistancy
- 볼륨 마운트 (Volume Mount)
- 도커 엔진 관리 영역 내 볼륨을 디스크로 마운트
- 임시 사용, 자주 쓰지 않는 파일
docker volume create my-vol
docker run –d –name devtest \
--mount source=myvol,target=/app nginx
- 바인드 마운트 (Bind Mount)
- 호스트 영역 내 디렉토리를 컨테이너에 마운트
- 자주 사용하는 파일
docker run –name apatest –d –v /home/user/apa_folder:/usr/local/apache2/htdocs httpd
- 임시 메모리 마운트 (tmpfs Mount)
- 도커 엔진 주 메모리 영역 마운트
- 접근 속도를 높이기 위해 사용
- 호스트 재부팅, 도커 정지 시 데이터 소멸
컨테이너들로 서비스 구성 - 도커 컴포즈 Compose
도커 명령어들을 단일 파일에 기재하여 일괄 실행
컨테이너 오케스트레이션
대규모의 컨테이너 구성 및 관리 - 원하는 상태(Desired State)로 동작하도록 관리(Schedule)
- 스케줄링
- 배치 Placement
- 확장 Scaling
- 업그레이드
- 복구 Rollback
- 서비스 관리
- 가용성 Avaliability
- 생명 주기 Lifecycle
- 서비스 탐색 Discovery
- 리소스 관리
- Memory / CPU / Ports
컨테이너 오케스트레이션 도구
Hands-On Docker
'클라우드 > AWS' 카테고리의 다른 글
AWS Dev Tools & Container Basic - AWS Development with IDE (0) | 2024.01.19 |
---|---|
AWS Dev Tools & Container Basic - AWS Dev Tools (0) | 2024.01.19 |
Serverless Application - Event-driven Serverless Backend 구축 (0) | 2024.01.12 |
Serverless Application - API 구성 및 Web Application 배포 (0) | 2024.01.12 |
Serverless Application - Serverless Computing 구축 (0) | 2024.01.12 |