리눅스데브코스 [15주차 - 2]<리눅스 컨테이너와 Docker (1)>

심우열·2023년 7월 17일
0
post-thumbnail

1. 컨테이너 기술이란?

  • OS의 관리영역을 애플리케이션 별로 격리하는 기술
  • 쉘이 여러개 있는 구조, 쉘간에는 서로의 존재를 알지 못함

1. 컨테이너란?

  • 애플리케이션을 실행할 수 있는 가상환경
  • 애플리케이션의 배포와 실행을 자동화 할 수 있음

1. 애플리케이션 캡슐화

  • 서로 다른 애플리케이션간에 필요로 하는 패키지나 라이브러리의 버전이 다를 경우,
  • 각 애플리케이션 별로 실행 환경을 격리 해주는 역할을 함

가상머신과의 차이점

  • 가상머신: 가상 하드웨어를 소프트웨어적으로 구현
    -> 하드웨어적 동작까지 에뮬레이션
    -> 소프트웨어적 비용 (오버헤드)발생
  • 컨테이너: 핵심 커널은 그대로 공유
    -> 커널을 애플리케이션 별로 격리
    -> 별도의 OS 인 것 처럼

2. 컨테이너의 종류

1. OS 컨테이너

  • 호스트의 커널을 공유하고, 유저스페이스 격리 기능 제공

1. Host

  • 컨테이너 격리를 제공하는 시스템

2. 유저 스페이스

  • 커널 스페이스와 구분되는 것
  • 커널 스페이스는 하드웨어 제어 등 시스템의 모든 일을 할 수 있는 영역
  • 유저 스페이스는 자원 분배와 관련된 영역 등과 같은 보호된 영역에 대한 권한이 없는 영역

2. 애플리케이션 컨테이너

  • 하나의 서비스를 패키지로 만들어 구동
  • 애플리케이션 컨테이너는 보통 하나의 컨테이너에 하나의 프로세스 작동

2. Docker란?

  • 최근 컨테이너 기술 중 가장 인기 있는 기술

1. Docker 의 구성

1. Docker 데몬

  • Docker 데몬은 Docker 서비스를 제공
  • 모든 컨테이너는 Docker 데몬 아래에 구성

2. Docker CLI

  • Docker 데몬을 제어하기 위한 명령줄 인터페이스 제공

2. 컨테이너의 장점

  • 마이크로서비스 아키텍쳐에서 유용함
    -> 모놀리틱 아키텍쳐에 비해 중단 없이 서비스를 업데이트 할 수 있음

1. 빠른 애플리케이션 배포

  • 컨테이너는 애플리케이션에 관련된 부분만 담고 있어 크기가 작다

2. 높은 이식성

  • OS나 호스트의 라이브러리와 독립적
    -> 의존성이 낮다

3. 쉬운 공유

  • 컨테이너를 제작해 이미지를 공용 레포지토리나 사설 레포지토리에서 쉽게 공유 할 수 있음

4. 적은 자원 사용량

  • 가상머신과 달리 애플리케이션 동작을 위한 최소한의 정보만 필요
  • 기존 HOST의 커널을 공유하기때문에, 소프트웨어적 오버헤드 작음

5. 높은 재사용성

  • 애플리케이션의 기능 개선에 따라, 사용되는 의존성이 달라질 수 있는 문제 관리 가능
  • 필요하면 언제든 이전 버전의 애플리케이션으로 재배포 가능

3. Docker 사용하는 과정

1. Dockerfile

  • Docker 이미지 생성

2. Docker 이미지 배포

  • 파일 또는 Docker registry

3. Docker 이미지를 통해 컨테이너 생성 및 실행(run)

  • Docker Deamon이 있는 machine에 전개

4. Docker 설치

1. 패키지 관리자 기능 업데이트

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

2. Docker Repository 서명 키 등록

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

3. Docker 패키지 Repository 추가

echo \
"deb [arch="$(dpkg --print-architecture)" signed-
by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. Docker 설치

sudo apt-get update
sudo apt-get install docker-ce \
docker-ce-cli \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin

5. 기본구성으로 실행

  • 리눅스 서비스 데몬 관리자인 systemd를 통해 실행
  • 처음 설치하는 경우, 설치 과정에 자동으로 위 명령이 실행
sudo systemctl start docker

6. 또는 설치 스크립트 활용하기

  • 운영체제와 구분없이 설치스크립트 활용 가능
curl -fsSL https://get.docker.com -o get-docker.sh 
sudo sh get-docker.sh

7. Docker 테스트

docker run hello-world

5. Docker 실행

1. 컨테이너 이름

docker run -d --name=mynginx nginx
  • -d: 백드라운드 실행
  • -name: 컨테이너 이름을 직접 명시
  • nginx: 이미지 이름(tag 생략)

이미 동일한 이름의 컨테이너가 있는 경우 중복 에러 발생

2. 환경변수

docker run -d -e MYENV=foo centos env | grep MYENV

컨테이너 생성시 환경변수 지정 가능

  • -e(--env) 로 환경 변수 지정
  • NAME=VALUE 형식

컨테이너 이식성을 유지

  • 컨테이너 동작을 변경하는 설정
    -> 컨테이너 외부에서 변경 가능해야 함
  • 따라서 환경변수를 활용

3. 볼륨

docker run -d --name web -v \
/root/htdocs:/usr/share/nginx/html/nginx
  • -v: 연결할 볼륨 지정
    -> <호스트 경로>:<컨테이너 내부 경로>

컨테이너 외부의 storage 연결

  • 컨테이너 볼륨
  • 볼륨
  • 호스트 경로

4. 포트

docker run -d --name web \
-p 60000-60030:60000-60030 (-p 1080:80) \
nginx
  • -p: 연결할 포트 지정
    -> <호스트 포트(범위)> : <컨테이너 내부 포트(범위)>

Port Binding 규칙

  • <호스트 포트> : <컨테이너 내부 포트>
    -> 호스트의 0.0.0.0(모든 장치) 에서 지정된 포트로 들어오는 패킷을 <컨테이너 내부 포트>로 포워딩
  • <.IP> : <호스트 포트> : <컨테이너 내부 포트>
    -> 호스트의 지정 IP에서 지정된 포트로 들어오는 패킷을 <컨테이너 내부 포트>로 포워딩

Exposed Port Publishing

  • 이미지에 이미 지정된 모든 Port 를 포워딩하도록 함

5. 컨테이너 링크

컨테이너 간 통신이 필요한 경우

docker run -d --name web nginx
docker run --link web:http centos env | grep -i_port
  • --link: 컨테이너 간 링크 설정
    -> <컨테이너 이름> : <호스트 이름>

6. 네트워크

docker run -d --net=bridge --name web nginx
  • --net: 네트워크 연결 방식을 지정
    -> host, bridge, <.network-id>, container:<컨테이너 ID>

6. Cluster 관리

  • 복수의 Docker 컨테이너 관리

1. Cluster 관리의 필요성

Docker

  • 특정 기능을 실현하는데 특화됨
  • 하지만 한개의 Daemon만 컨트롤 가능

복수의 Daemon

  • 신뢰성/가용성/유지보수성/완전성/기밀성을 위해
  • 컴포넌트(컨테이너/애플리케이션)들의 적절한 분산배치 중요
  • 이러한 목적을 위해 복수의 Daemon이 필요함
  • 복수의 Daemon을 관리하기 위해 Cluster 관리자가 필요

2. Cluster 관리자

  • Kubernetes와 같은 Cluster 관리자는 컨테이너에 대한 작업만 수행
  • 노드(호스트)에 대한 작업은 담당하지 않는다

3. KUBERNETES

1. Kubernetes의 기본 개념

1. 노드(node)

Docker Daemon 이 동작하는 호스트

  • Master: Cluster 제어용 프로그램이 동작하는 호스트
    -> K8s 제어 API 수신
  • Minion: 제어되는 호스트
    -> 컨테이너 동작

2. 팟(Pod)

Docker 컨테이너의 집합체

  • Pod는 같은 노드에 배포

3. 서비스(Service)

통신의 엔드포인트를 제공

4. 리플리케이션 컨트롤러(Replication Controller, 복제 제어)

Pod의 배포를 관리

  • Pod의 다중도 정의 -> 배포의 수 (요소의 개수)
  • 감시
  • 조정

5. 라벨(Label)

오브젝트에 부여할 수 있는 속성

  • Pod, Service, Replication Controller 등
  • 하나의 오브젝트에 복수의 Lable 설정 가능

K8s에서의 Label

  • Label Selector
    -> Label 을 기반으로 대상 오브젝트 지정
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글