docker - 5

이영준·2024년 5월 31일

docker 정리

docker 관련 용어

  • docker image
  • Docker file
  • docker Containter
  • Dcoker Hub
  • docker Compose
    • 다수의 docker container 관리
    • docker-compose.yml
      • Services
      • Networks
      • Volumes

docker를 실제 production 환경에서 사용할 때 주의사항

  • docker volumes
    • host volume은 보통 개발시 source code를 바로 container안으로 마운트 하기 위함
    • Production에서는 named volumes를 사용해야함
  • Docker container는 read-only로 사용
    • 내용을 바꿔야한다면 실행 중인 컨테이너를 수정하지 말 것
    • 항상 이미지를 새로 빌드하고 다시 컨테이너들을 새로 런치
    • 자동화가 중요하다
  • 다수의 docker container들을 다수의 호스트들에서 실행이 필요
    • 용량 문제와 Fail-over

docker를 개인 생산성을 향상을 위해 사용

  • 개발시 필요한 모듈을 docker 이미지로 받아와서 container로 실행
  • 여러 소프트웨어를 연동해서 개발 시 이 것들을 docker-compose로 설정

장점:

  • 일관된 방식으로 소프트웨어 설치(문서화하고 메뉴얼하게 설치 불필요)
  • 분리된 충돌없는 환경에서 소프트웨어 설치/실행

서버 관리의 어려움

복잡한 다수의 서버로 구성된 시스템을 효율적으로 관리한다는 것은 어려운 일임.

관리해야하는 서버의 수가 늘어나면 겪는 문제

  • 어느 서버가 문제가 있는지
  • 어느 서비스가 문제를 갖고 있는지
  • 이런문제들을 얼마나 빨리 알고 해결할 수 있을지
  • 새로 들어온 사람이나 주니어를 잘 온보딩하려면?
  • 문제들은 밤낮없이 연휴에도 발생

해결법

  • 문서화

    • 지금 서비스 상황과 셋업 방법 문서화
    • 다양한 문제 발생시 해결 방법 문서화
  • 문서화가 아닌 코드로 대신하기

    • 문서보다는 자동화된 스크립트로 해결
    • Puppet,Terraform같은 툴이 존재
    • 그러나 소프트웨어 충돌 문제에서는 도움이 안됨
  • Virtual Machine

    • 실행 공간을 분리하자는 취지(소프트웨어 충돌 때문에)
    • 근데 이 방법은 리소스 소비가 너무 크고 느리다..
  • Docker의 도입

    • 모든 소프트웨어를 docker image로 만들면 어디서든 동작
    • VM에 비해 리소스 낭비도 적고 실행 시간도 빠름
    • 근데 container의 수가 많아지면 관리가 힘듬

    Container Orchestration tool

  • docker container의 수가 많아질때 관리하기 위함

기능

배포 자동화

  • 자동 배포
    • 컨테이너 수가 많아지면 수동으로 배포,관리하는 것이 어려움. 컨테이너 배포를 자동화하여 인적 오류를 줄이고 일관된 배포 보장
  • 스케일링
    • 애플리케이션의 부하에 따라 자동으로 컨테이너 수를 늘리거나 줄이는 스케일링 기능 이는 리소스를 효율적으로 사용이 가능함

관리

  • 서비스 디스커버리 및 로드 밸런싱
    • 서비스 간의 통신을 원할하게 하기 위함
  • 상태 관리
    • 지속적으로 모니터링하고 문제가 발생한 컨테이너를 자동으로 재시작하거나 교체

네트워킹

  • 네트워크 관리
    • 컨테이너 간의 네트워킹을 관리 및 정책 관리
  • 보안
    • 네트워크 트래픽 보호, 네트워크 격리 등 보안 기능 제공

모니터링 및 로깅

  • 모니터링
    • 성능 모니터링, 리소스 사용량 추적
  • 로깅
    • 컨테이너 로그를 수집하고, 분석할 수 있는 기능 제공

결론

컨테이너의 수가 증가하면 관리의 복잡성이 기하급수적으로 증가하기 때문에 오케스트레이션 도구를 통해 복잡성을 관리하고, 시스템으 효율성, 안전성, 보안성을 높이며, 개발 및 운영 팀이 더 효과적으로 일할 수 있도록 도와줌

그렇다면 이 오케스트레이션 툴은 뭘 많이 쓸까?

k8s (kubernetes)

  • 컨테이너 기반 서비스 배포/스케일/관리 자동화를 해주는 오픈 소스 프레임워크

    • 어느 컨테이너던 가능하지만 주로 docker container들이 대상이 됨
    • 물리서버나 가상서버 위에서 모두 동작
  • 가장 많이 사용되는 컨테이너 관리(Orchestration) 시스템

    • 카카오나 네이버 등등.. 다씀
  • 다수의 서버 컨테이너 기반 프로그램을 실행하고 관리

    • 보통 docker와 k8s는 같이 사용
    • Pod : 같은 디스크와 네트워크를 공유하는 1+컨테이너들의 집합

    k8s architecture

  • 기본 구조는 마스터-노드로 이뤄져 있음

  • Master 안에는 여러 프로세스가 돌고 있다.

    • API Server (container로 동작) : kube apiserver
      • Entrypoint of K8S cluster
      • web UI, CLI(kubectl),API
    • Scheduler
      • Pods 생성과 할당
    • Controller Manager
      • 전체 상황을 모니터링하고 fault tolerance 보장
    • Master는 high Availability가 중요
  • Controller runtime

    • 대부분 docker가 사용

Kubectl : 커맨드라인 툴

  • kubectl run hello-minikube
  • kubectl cluster-info
  • kubectl get node

Pod

  • 막 직접적으로 컨테이너를 바로 다루는 것은 아님
  • Pod는 K8S 사용자가 사용하는 가장 작은 빌딩 블록
  • 1Pod = 보통은 하나의 container로 구성
  • Pod는 network address를 갖는 self-contained server

Pod 생성 예

# 리소스 api 버전 지정, apps/v1이 버전임
apiVersion: apps/v1
#생성할 kubernetes 리소스 종류 지정(여기선 pod)
kind: Pod
#리소스의 이름 및 라벨 등의 메타데이터, 여기서 Pod의 이름은 nginx
metadata:
  name: nginx
#리소스의 구체적인 스펙 정의
spec:
  # pod 내에서 실행될 컨테이너 목록 지정
  containers:
#컨테이너 이름
  - name: nginx
  #컨테이너에서 실행될 도커 이미지 지정
    image: nginx

해당 예시는 Kubernetes에서 Pod를 정의하는 yaml 파일의 예시임. 이 Yaml 파일은 nginx 컨테이너를 실행하는 Pod를 정의함

생성 방법 예시

  • kubectl create -f pod-definition.yml : -f 옵션으로 파일 경로를 지정.

  • kubectl get pods 이 명령어는 모든 포드의 이름 상태 시작 시간 등을 요약하여 표시

  • kubectl describe pod nginx - 특정 Pod으의 상세 정보를 확인

  • kubectl run nginx --image=nginx 명령어를 사용하여 Pod 실행.

profile
개인공부용(업데이트 중단)

0개의 댓글