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들을 다수의 호스트들에서 실행이 필요
docker를 개인 생산성을 향상을 위해 사용
- 개발시 필요한 모듈을 docker 이미지로 받아와서 container로 실행
- 여러 소프트웨어를 연동해서 개발 시 이 것들을 docker-compose로 설정
장점:
- 일관된 방식으로 소프트웨어 설치(문서화하고 메뉴얼하게 설치 불필요)
- 분리된 충돌없는 환경에서 소프트웨어 설치/실행
서버 관리의 어려움
복잡한 다수의 서버로 구성된 시스템을 효율적으로 관리한다는 것은 어려운 일임.
관리해야하는 서버의 수가 늘어나면 겪는 문제
- 어느 서버가 문제가 있는지
- 어느 서비스가 문제를 갖고 있는지
- 이런문제들을 얼마나 빨리 알고 해결할 수 있을지
- 새로 들어온 사람이나 주니어를 잘 온보딩하려면?
- 문제들은 밤낮없이 연휴에도 발생
해결법
기능
배포 자동화
- 자동 배포
- 컨테이너 수가 많아지면 수동으로 배포,관리하는 것이 어려움. 컨테이너 배포를 자동화하여 인적 오류를 줄이고 일관된 배포 보장
- 스케일링
- 애플리케이션의 부하에 따라 자동으로 컨테이너 수를 늘리거나 줄이는 스케일링 기능 이는 리소스를 효율적으로 사용이 가능함
관리
- 서비스 디스커버리 및 로드 밸런싱
- 상태 관리
- 지속적으로 모니터링하고 문제가 발생한 컨테이너를 자동으로 재시작하거나 교체
네트워킹
- 네트워크 관리
- 보안
- 네트워크 트래픽 보호, 네트워크 격리 등 보안 기능 제공
모니터링 및 로깅
- 모니터링
- 로깅
- 컨테이너 로그를 수집하고, 분석할 수 있는 기능 제공
결론
컨테이너의 수가 증가하면 관리의 복잡성이 기하급수적으로 증가하기 때문에 오케스트레이션 도구를 통해 복잡성을 관리하고, 시스템으 효율성, 안전성, 보안성을 높이며, 개발 및 운영 팀이 더 효과적으로 일할 수 있도록 도와줌
그렇다면 이 오케스트레이션 툴은 뭘 많이 쓸까?
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
- Controller Manager
- 전체 상황을 모니터링하고 fault tolerance 보장
- Master는 high Availability가 중요
-
Controller runtime
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 실행.