본문 바로가기
개발/DevOps

Docker 내용, 기반 기술 정리

by ny0011 2021. 6. 21.
반응형

클라우드 환경이 나타난 배경

  • 기존 : 서버 1개 서비스 1개
  • 하드웨어 기반 가상화(virtualbox) : 서버 1개, OS 여러개, 서비스 여러개
  • OS 기반 가상화(도커) : 서버 1개, OS 1개, 서비스 여러개
  기존 하드웨어 기반 가상화OS 기반 가상화
특징
  • 구성이 단순
  • 문제 원인을 파악하기 쉬움
  • Hypervisor라는 가상화 솔루션을 사용해 가상머신 운영 
  • 하드웨어 장치(CPU, Memory, Storage, Network)를 논리적인 형태로 만듦
  • 장치 중 일부만 가상머신에 할당

  • 컨테이너 : 호스트 OS에 논리적인 구획(컨테이너)를 만들고
앱을 실행하기 위한 라이브러리, 앱 등을 하나로 모아서
마치 별도의 서버인 것 처럼 사용할 수 있게 만든 것
  • 게스트 OS를 설치하지 않아서 성능 이슈가 적음
  • read-only image 레이어 위에 read-write container를 올림
→ 같은 이미지를 여러 컨테이너가 사용할 수 있어서 공간 효율이 좋음
예시 - ubuntu 서버에 웹 서버를 실행한다
- ubuntu 서버에 웹 서버 2개, 메일 서버, opengrok 서버를 실행한다
- Virtual Box를 사용해서 Window 호스트 서버에 ubuntu 게스트 OS를 생성한다
-> CPU는 4코어 중 2코어 할당, 메모리는 8GB 중 4GB 할당
- 게스트 OS에 웹 서버 등을 실행한다
- Docker를 사용해서 웹 서버를 구축하는데 필요한
httpd image를 만들고 container를 만들어서 httpd 웹 서버를 실행한다
단점
  • CPU, Memory 등 자원을 효율적으로 사용하기 어려움
  • 가상화 없이 서비스 여러 개를 실행하면
1) 자원 분배가 어려움
2) 같은 파일 시스템을 사용해서 다른 앱 간 데이터 덮어 씌우기 가능
- 가상화를 위한 자원 할당이 필요함
- I/O 속도가 느림
 

 

docker?

- 리눅스 컨테이너 + 기능

- 가상 머신과 다르게 성능 손실이 거의 없음

- docker engine, docker와 관련된 모든 프로젝트를 의미.

- docker engine?

  - 컨테이너를 생성하고 관리함

 

docker container 구조

- Host의 OS를 사용함.

- 리눅스 자체 기능인 chroot, namespace, cgroup을 사용.

=> 프로세스 단위 격리 환경 만듦

 

docker 특징

  • 컨테이너 외부 Host의 커널 사용
  • 컨테이너 내부에는 앱 실행에 필요한 라이브러리 및 실행파일만 존재.
  • 컨테이너를 배포할 때 컨테이너 => 이미지로 패키징해서 전달.
  • 마이크로서비스로 구성한다면 기능 별로 컨테이너 분리 가능
    • ex) 웹 서비스의 경우 DB 컨테이너/ 웹 서버 컨테이너 분리
    • => 컨테이너가 많아질 때 docker swarm이나 k8s를 사용

chroot

: root directory 격리 기술

  • 컨테이너 생성 시 실행할 파일을 미리 컨테이너에 저장해두는 용도

출처 : https://www.44bits.io/ko/post/change-root-directory-by-using-chroot

위 그림을 기준으로 프로세스 K에서는 /, /B, /C 폴더에 접근할 수 없으니

기존 시스템을 변경하지 않고 프로세스 수행하게 됨.

그래서 /A로 루트를 변경하게 되면 /A에 /처럼 파일시스템을 구성해줘야함.

/A/bin/bash 가 있어야 chroot /A /bin/bash가 실제로 실행됨.

(ldd로 프로그램이 사용하고 있는 라이브러리를 추적해서

/bin/bash가 사용하는 라이브러리도 /A 밑으로 위치 변경해줘야 함)

namespace

: 프로세스를 격리하는 가상화 기술

  • 격리되는 자원 : mount, uname, PID, network, IPC, root user
  • 시스템 콜 함수 unshare()를 사용해 현재 프로세스를 새로 지정된 네임스페이스에 연결
  • 컨테이너는 하나의 커널을 공유해서 사용하기 때문에 각 컨테이너마다 격리된 사용자 환경을 제공

cgroup

: Control group

  • 특정 프로세스가 자원을 독점하는 것을 제한
  • 프로세스 그룹의 CPU, memory, network, storage 자원 할당과 제어를 하는 커널 기능

iptables

  • 패킷 필터링(방화벽 역할)
  • NAT : 패킷 포워딩(전달)

 

도커 엔진 설치

  • docker EE : 유료 기업용 솔루션
  • docker CE : 무료. 기술 지원이나 서비스 제공 없음. ✅ 무료니까 이거씀

ubuntu OS에서 도커 설치

공식 문서를 보자

 sudo apt-get update
 sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# x86_64
echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io

아래 명령어로 docker 설치 확인할 수 있음

 sudo docker info

 

도커 엔진

- 기본 단위 : image, container

 

docker image

  • image를 기반으로 container가 생성됨.
  • 여러 계층으로 된 binary 파일로 돼 있고 컨테이너를 생성하고 실행할 때 읽기 전용을 사용됨
  • => 컨테이너가 이미지를 바꿀 수 없다는 말인듯
  • 이미지 이름 형식 : <저장소 이름>/<이미지 이름>:<태그> 
    • 저장소 이름 : 없을 수도 있음. docker 원격 저장소의 이름.
    • 태그 : 이미지 버전 관리 or revision 관리에 사용됨. 태그가 없으면 default 값은 latest

 

docker container

  • image에서 컨테이너를 생성
    • 컨테이너의 역할에 필요한 파일시스템을 사용(chroot)
    • 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립 공간이 생성(namespace)

댓글