AWS Dev Tools & Container Basic - Container & Docker

2024. 1. 19. 13:17클라우드/AWS

1월 AWS Dev Tools & Container Basic (1/19)

  1. AWS Dev Tools
  2. AWS Development with IDE
  3. Container & Docker
  4. AWS Container Services

 


 

 

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
Namespaces Control groupes Union filesystem

 

 

도커 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