Container / Docker / Kubernetes

강버섯·2022년 1월 5일
0
post-custom-banner

👉 Container

격리된 공간에서 프로세스가 동작하는 기술이다.
다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.

  • 과거 : 각각의 app을 가상 머신에 배치
  • 현재 : container 활용 → 운영체제 커널을 공유하는 가벼운 실행 환경으로 app 분리

컨테이너는 가상 머신이 아니다.

  • 기본 컴퓨터(baremetal)
  • virtual desktop/VM ,,,,, → OS 안에 OS를 띄우는 가상화 서비스
  • lxc(linux container) : 사용자에 따라서 접근하는 곳이 달라짐 → 운영 시스템 가상화 기법

👉 Docker

컨테이너 관리 서비스로 agile 기반 프로젝트 수행에 용이하다.

도커는 가상화를 위해서 사용하며 기본적으로 가상 머신처럼 사용한다.

  1. 만든 프로그램을 실행한 컴퓨터가 아닌 다른 컴퓨터에서도 잘 동작하도록 함
    → 동일한 환경 구축을 하지 않아도 된다.
  2. physical 컴퓨터에 프로그램을 설치하지 않고 도커를 실행시킨 뒤에 활용 가능
    → 도커에 환경 설정이 되어있기 때문에 추가적인 설정을 하지 않아도 된다.

즉, 도커를 사용하면 환경 설정에 용이하다.

👉 사용하기

  • 이미지 : 실행되지 않은 상태
  • 컨테이너 : 이미지가 실행된 상태
  1. docker file을 이용하여 이미지 생성

    docker file 은 Dockerfile이라는 이름으로 생성한다.

  • FROM → ex. FROM ubuntu:version
    -> FROM절에 있는 것을 상속 받아서 쓴다고 보면 된다.(= Base image)
    -> version 대신 latest를 쓸 수도 있지만 latest라는 것은 상대적인 개념이기 때문에 쓰지 않는 것이 좋다.
    -> : 뒤에 버전명이 적히지 않는다면 latest를 가져다가 쓴다.

  • MAINTAINER : 이미지 관리자 명시 - email ID 작성

  • RUN 실행 명령어 : 이미지와는 다른 것을 실행시키고자 할 때 사용
    -> 작성된 명령어를 수행하면서 이미지가 변경될 수 있다.

  • COPY : 파일을 이미지에 추가

  • CMD, ENTRYPOINT

    • ENTRYPOINT : 이미지가 실행되었을 때 기본적으로 실행되는 진입점
    • CMD : ENTRYPOINT 뒤로 붙어서 실행
      -> 작성하지 않는 경우도 있는데 이럴 때는 FROM에서 불러온 것을 사용하는 것이다.
      -> 만일 작성한다면 값을 덮어쓰는 것이다.

docker file은 base image와 다른 추가적인 파일들을 이용하여 이미지를 생성해낸다.
docker file로부터 도커 이미지 생성 👇

$> docker build [-t] [ImageName:TagName] [dir]
  • -t : 이미지에 태그 달기
  • ImageName : image 이름 지정
  • TagName : image 태그 지정
  • dir : 도커 파일이 위치할 dir

Docker file을 수정하여 이미지를 재생성할 경우, docker는 변화를 추적하여 동일한 부분은 재사용하기 때문에 경량적으로 사용할 수 있다.

생성한 이미지는 docker registry에 옮겨 놓고 사용하고 싶을 때 가져다가 쓰면 된다.
registry는 docker를 사용할 수 있도록 하기 위한 외부 저장소를 의미한다.
AWS에서는 ECR(Elastic Container Registry)라는 registry 서비스를 별도로 제공한다.

  1. 컨테이너로 만들어서 사용 = 이미지 실행
    컨테이너 실행 👇
$> docker run image이름
# + 환경 변수(설정)
# + 파일 (= volume mount)
# + 네트워크 관리 -> ex. docker 설정을 통해 컴퓨터에서 해당 net으로 접근시 docker 실행

기본적인 명령어는 위와 같고, 추가적인 환경 설정을 원한다면 option으로 달아서 명령어를 실행하면 된다.

Docker를 실행시키고 종료할 때 저장된 정보가 날아가는 경우가 발생할 수 있는데, 이를 방지하기 위해서 영구적인 저장소를 mapping 해두고 사용하면 데이터가 보관되는 것처럼 동작이 가능하다.

Docker 명령어👇

$> docker ps #docker로 존재하는 container들을 확인 가능

$> docker top ContainerID #해당 container 내의 top process 확인

$> docker rm ContainerID #삭제

$> docker stats ContainerID #통계 확인

$> docker stop ContainerID #종료

$> docker pause ContainerID #정지
$> docker unpause ContainerID #재시작

$> docker kill ContainerID #강제 종료

👉 Kubernetes(K8S)

도커를 이용하여 서비스를 제공하는 방법은

  1. local computer에서 docker run으로 단일 도커 실행
  2. docker compose를 사용하여 여러개의 도커를 실행하고 관리
  3. EC2와 같은 가상 컴퓨터 사용
  4. ECS와 같은 컨테이너 관리 프로그램 사용
  5. 쿠버네티스 활용

등이 존재한다.
이 중 쿠버네티스는 컨테이너 오케스트레이션 서비스컨테이너를 편하게 관리할 수 있도록 한다.

👉 구성 요소

✅ pod

컴퓨팅 자원을 쓰는 것들로 컴퓨터라고 보면 된다.
도커 컨테이너가 돌아가는 곳으로 한 개 이상의 컨테이너로 구성되어있다.

✅ deployment

사용할 pod에 대한 설정이 작성된다. (= pod 생성을 위한 설계도)
deployment를 이용해서 pod를 생성하면 생성 및 관리가 편리하다.
deployment를 통해 생성된 pod에는 label이 달리게 되고, 이 label 별로 pod가 관리되게 된다.

✅ service

label로 구성된 것들을 하나의 그룹으로 관리하여 로드 밸런싱을 진행해준다.
네트워크의 접근 제어를 가능하도록 한다.
Service만 존재할 경우, 내부에서의 접근만이 가능하다.

✅ ingress

외부에서 들어오는 접근을 처리해준다.

Service를 이용해서 외부 노출이 되도록할 수 있으나 관리하기가 힘들고 private한 network를 만드는 것에 어려움이 있기 때문에 ingress를 사용하는 것이 좋다.

profile
무럭무럭 버섯농장
post-custom-banner

0개의 댓글