Docker 정리
용어
- Docker image / dockerfile
- Docker Container
- Docke Hub (Docker registry)
- Docker Compose
- docker-compose.yml (services,networks,volumes)
실제 Production 환경에서 사용 시 유의 사항
- Docker volumes
- production에서는 named volumes를 사용해야한다.
- Docker container는 read-only로 사용한다.
- 실행 중인 컨테이너를 수정하지 말고 이미지를 새로 빌드, 런치해야한다.
- CI/CD프로세스가 중요하다.
- 다수의 container들을 다수의 host들에서 실행하는 것이 필요하다.
Docker를 개인 생산성 향상을 위해 사용
- 여러 모듈과 소프트웨어를 연동해서 개발이 가능하다. (docker-compose 이용)
- 일관된 방식으로 소프트웨어 설치가 가능하다.
서버 관리의 어려움
: 복잡한 다수의 서버로 구성된 시스템을 효율적으로 관리하는 것은 어려운일!
해결 방안
- 문서화
- 시작 단계에서는 유의미하나, 서버가 커지는 경우에 의미가 없어지거나, 불가능한 일들이 많아진다.
- 코드로 관리
- Infrastructure AS Code
- Chef, Puppet, Ansible, Terraform등 다양한 툴이 많다.
- 단점 : Learning curve가 높다.
- VM도입
Docker 도입
- 장단점
- Docker Image로 만들면 어디서든 동작가능하다.
- 리소스 낭비가 적고 빠른 실행이 가능하다.
- Container의 수가 늘어나면 관리가 힘들다는 점이 있다. → 컨테이너 관리도구의 필요성
- 많은 DevOps 엔지니어들이 Docker Image로 만들어서 운영하고있다.
- Containerization : 모든 것의 컨테이너화
- Docker를 기본으로하는 서비스의 배포 과정 : 개발 → 이미지 빌드 → 이미지 등록 → 컨테이너 실행의 순서를 갖는다.
Container Orchestration
: 다수의 컨테이너들이 다수의 서버위에서 실행된 상황에서 컨테이너들을 효율적으로 관리하기 위한 도구.
기능
: 한 클러스터 안에 다양한 서비스들이 공존하는 상황에서 배포, 스케일링, 네트워크, 인사이트 등의 기능들을 제공한다.
- 소프트웨어 배포 : 서비스 이미지를 컨테이너로 배포, 롤백 기능도 수행한다.
- 스케일링 : 특정 서비스의 Container 수를 조절하는 것.
- 네트워크 : 서비스가 다수의 컨테이너로 나누어지면서 이들을 대표하는 로드 밸런서를 만들어주어야한다.
- 인사이트: 노드,컨테이너의 문제 시 해결 해야한다. Logging, 분석등의 기능도 제공한다.
다양한 Orchestration tools: Mesos, Marathon, DEIL, Rancher, Nomad, Docker Swarm, K8s
→ 현재는 K8s가 중심이되어 정리되고 있다.
K8s
: 컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈소스 프레임워크
- 확장성이 좋아 다양한 환경에서 사용된다.
- ml : Kubeflow
- CI/CD : Tekton
- Service Mesh : Istio
- Serverless : Kubeless
- 다수의 서버에 컨테이너 기반 프로그램을 실행하고 관리한다.
- Docker와 K8s가 같이 사용된다.
- Pod : 같은 디스크와 네트워크를 공유하는 하나 혹은 그이상의 컨테이너들의 집합.
K8s 아키텍처
- 기본구조 : 마스터-노드
- Node는 물리서버이거나 가상서버가 된다.
- 마스터는 클러스터를 관리하는 역할
- Kubelet: 마스터와 통신하는 에이전트
이미지 출처 : https://kubernetes.io/docs/concepts/overview/components/
- Master 내 다양한 프로세스
- API Server (Container로 동작): kube-apiserver
- Entrypoint of K8s cluster
- Web UI, CLI(kubectl), API 로 접근
- Scheduler
- Controller Manager
- 전체 상황을 모니터링하고 fault tolerance를 보장한다.
- Master는 High Availability가 중요하다.
- etcd
- K8s의 환경정보가 저장되는 key-value 스토어로 백업
Pod란?
- Pod : K8s 사용자가 사용하는 가장 작은 빌딩 블록
- 1 Pod = 1 Container가 보편적이다.
- 하나보다 많은 경우에는 helper container가 같이 사용되기도 한다.
- 같은 Pod안에는 디스크와 네트워크가 공유된다.
- Fail-over를 위해 replicas(복제본)을 지정하는 것이 일반적이다.
- Pod는 네트웍 주소를 갖는 self-contained server이다.
- Pod 생성 예시
kubectl create -f pod-definition.yml
: 해당 yml을 참고해서 pod생성
kubectl get pods
: 실행중인 pod 출력
kubectl describe pod nginx
: pod 상세정보 출력
kubectl run nginx —image nginx
: 특정 이미지를 바탕으로 pod를 생성하고 실행
K8s/Docker 사용 예#1
쏘카 데이터 그룹 - Airflow와 함께한 데이터 환경 구축기(feat. Airflow on Kubernetes)
K8s/Docker 사용 예#2
버킷플레이스 Airflow 도입기 - 오늘의집 블로그
fault tolerance
: 장애 허용, 시스템 내에 일부분이 고장나거나 결함이 있어도 정상적으로 기능을 수행할 수 있는 시스템이다.