도커와 CI 환경 - 1

지원·2024년 3월 9일
0

Docker

목록 보기
1/7

모든 과정을 거치면 프로그램의 일부분을 수정하고 Git 에 push 만 하면 알아서 배포가 되는 자동화 시스템을 구축할 수 있다!

도커를 쓰는 이유?

  • 어떠한 프로그램을 다운로드하는 과정을 간단하게 만들어주기 떄문이다.

예를 들어 도커 없이 Redis 를 다운 받는다고 생각해보자.

  • Redis 홈페이지로 이동해서 wget http://... 명령어를 입력해서 실행한 후 파일 압축 해제까지 해야한다.
  • 이때 wget 이 없으면 오류가 발생하고 또 wget 을 받기 위해서 부수적인 것들을 해야한다.
  • 그 과정이 복잡하고 에러도 많이 생길 수 있다.

하지만 도커가 있다면?

  • docker run -it redis 명령어 하나로 Redis 를 가져올 수 있다.

예상치 못한 에러도 덜 발생하며, 설치하는 과정도 훨씬 간단해지기 때문에 도커를 사용한다.

도커란 무엇인가?

  • 컨테이너를 사용하여 응용 프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구 이며 컨테이너 기반의 오픈소스 가상화 플랫폼

서버에서의 컨테이너란?

  • 다양한 프로그램 , 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.
  • 일반 컨테이너의 개념에서 물건을 손쉽게 운송해주는 것 처럼 프로그램을 손쉽게 이동 배포 관리를 할 수 있게 해준다.
    -> AWS , Azure , Google Cloud 등 어디에서든 실행 가능하게 해준다.

도커 이미지와 도커 컨테이너 정의

  • 컨테이너는 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위이다.
    -> 간단하고 편리하게 프로그램을 실행시켜주는 것
  • 컨테이너 이미지는 코드 , 런타임 , 시스템 도구 , 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지 입니다.
  • 컨테이너 이미지는 런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.

간단하게 설명하면 도커 이미지는 프로그램을 실행하는데 필요한 설정이나 종속성을 갖고 있고 도커 이미지를 이용해 컨테이너를 생성하며 도커 컨테이너를 이용하여 프로그램을 실행한다!

도커를 사용할 때 흐름

  1. 먼저 도커 CLI 에 커맨드를 입력
  2. 1번이 실행되면 도커 서버(도커 Daemon) 이 그 커맨드를 받아서 그것에 따라 이미지를 생성하든 컨테이너를 실행하든 모든 작업을 하게된다.

실제 CLI 커맨드 작성

  • 터미널에서 docker run hello-world 를 실행해보자.
  • 그렇게 되면 맨 처음에는 hello-world 라는 이미지를 찾을 수 없다고 나오다가 Pull complete 가 나오면서 텍스트가 정상적으로 실행된다.

docker run hello-world -> 도커 클라이언트 -> 도커 서버 -> 이미지 캐시 보관 장소

  • 이미지 캐시 보관 장소에서 hello-world 라는 이미지가 있는지 확인하고, 만약 있다면 바로 가져오지만 만약 없다면 도커 허브에서 가지고 온다.
  • 도커 허브는 이미지들을 보관하는 곳이라고 생각하면 된다.

도커와 기존의 가상화 기술과의 차이를 통한 컨테이너 이해

가상화 기술 나오기 전

  • 한대의 서버를 하나의 용도로만 사용
  • 남는 서버 공간은 그대로 방치
  • 하나의 서버에 하나의 운영체제 , 하나의 프로그램만을 운영
  • 안정적이기는 하지만 비효율적

하이퍼 바이저 기반의 가상화 출현

  • 논리적으로 공간을 분할하여 VM 이라는 독립적인 가상 환경의 서버 이용 가능
  • 하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS 를 구동할 수 있게 하는 소프트웨어
  • 하드웨어를 가상화하면서 하드웨어와 각각의 VM 을 모니터링 하는 중간 관리자
  • 하이퍼 바이저에 의해 구동되는 VM 은 각 VM 마다 독립된 가상 하드웨어 자원을 할당
  • 논리적으로 분리되어 있어서 한 VM 에 오류가 발생해도 다른 VM 으로 퍼지지 않다는 장점

하이퍼 바이저 VM 기술을 가지고 도커로 발전


https://geekflare.com/docker-vs-virtual-machine/

  • 도커의 컨테이너는 하이퍼바이저와 게스트 OS 가 필요하지 않으므로 더 가볍다.
  • 도커에서는 애플리케이션을 실행할 때 호스트 OS 위에 애플리케이션의 실행 패키지인 이미지를 배포하기만 하면 된다.
  • 하지만 하이퍼 바이저 VM 은 VM 띄우고 자원을 할당한 게스트 OS 를 부팅하여 애플리케이션을 실행해야 해서 훨씬 복잡하고 무겁게 실행해야 한다.

공통점과 차이점

  • 공통점은 도커 컨테이너와 가상 머신은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법
  • 차이점은 격리된 환경을 얼마나 격리를 시키는지의 차이

도커

  • 도커 컨테이너는 돌아가는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다.
  • 만약 도커와 함께 몽고 DB 컨테이너를 시작하면 호스트의 일반 쉘에 ps-e grep 몽고를 실행하면 프로세스 표시가 된다.

가상 머신(VM)

  • VM 내부에서 실행되는 모든 것은 호스트 운영체제 또는 하이퍼바이저와 독립되어 있다.

즉 컨테이너를 격리시키는다는 것은 만약 컴퓨터에 실행되고 있는 프로세스가 카카오톡 , 노션이 있을때 카카오톡을 실행하기 위한 파일 시스템은 카카오톡의 컨테이너에서만 존재하고, 노션을 실행하기 위한 파일 시스템은 노션의 컨테이너에서만 존재한다는 것이다.

도커 컨테이너 격리 시키는 방법

  • 리눅스에서 쓰이는 Cgroup(Control groups) 와 네임스페이스에 대해 알아야한다.

C Group

  • CPU , 메모리 , HD i/o 등 프로세스 그룹의 시스템 리소스 사용량을 관리
  • 어떤 어플이 사용량이 너무 많다면 그 어플리케이션 같은 것을 C gorup 에 집어넣어서 CPU 와 메모리 사용 제한을 할 수 있다.

네임스페이스

  • 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술
  • 별개의 독립된 공간을 사용하는 것 처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술

카카오톡을 위한 컨테이너가 있다면 여기에 카카오톡 -> 커널 -> 하드디스크 , 네트워크 , CPU 등 프로세스를 작동시키는데 필요한 것들이 있고 하나의 컨테이너끼리 독립적으로 존재한다.

이미지로 컨테이너 만들기

위에서 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다고 했다.

필요한 모든 것?

  1. 컨테이너가 시작될 때 실행되는 명령어 : ex) run kakaotalk
  2. 파일 스냅샷 : ex) 컨테이너에서 카카오톡을 실행하고 싶다면 카카오톡 파일 스냅샷

이미지 컨테이너 만드는 순서

  1. Docker 클라이언트에서 docker run IMAGE 입력
  • 현재 이미지에는 위에서 말한대로 시작시 실행되는 명령어 + 파일 스냅샷이 존재
  1. 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮긴다.
  • 그중 파일 스냅샷이 먼저 컨테이너의 하드 디스크 부분으로 옮겨진다.
  1. 이미지에서 가지고 있는 명령어를 이용해서 카카오톡을 실행
  • 이미지에 있던 명령어가 컨테이너로 가게되고 그렇게 되면 커널을 통해 2번에서 옮겨진 하드 디스크 부분에 가서 파일 스냅샷에 있는 실행 파일이 실행된다.

정리하면 이미지 안에는 위에 있는 필요한 모든것에 해당하는 1번 , 2번이 모두 존재하고 명령어가 시작이 되면 해당 이미지가 실행하기 위해 필요한 파일들이 하드 디스크 부분에 들어가고 명령어가 실행되면서 커널을 통해 하드 디스크에 있던 실행 파일이 실행된다!

C-group , 네임스페이스를 도커 환경에서 쓸 수 있는 이유

  • 한 컴퓨터 안에서 카카오톡을 위한 컨테이너 , 노션을 위한 컨테이너로 나눌 수 있도록 해주는것이 C-group , namespace 이라고 했다.
  • 하지만 C-group , namespace 는 리눅스에서만 가능한데 현재 우리는 윈도우나 macOS 를 사용하고 있다.
  • 카카오톡 , 노션이 있는 컨테이너 부분은 리눅스 VM 에 깔려있기 때문에 리눅스 환경에서 돌아가는 것이다.
  • (카카오톡 , 노션이 있는 컨테이너) 리눅스 커널 -> 리눅스 VM -> MacOS / Window -> 하드웨어
  • 위와 같은 구조로 이루어져있기 떄문에 C-group , namespace 을 사용할 수 있다.

참고자료

profile
덕업일치

0개의 댓글