Docker&Kubernetes

[Docker] 도커란?

랩실외톨이 2024. 1. 19. 00:32
반응형

 

 

이번 포스팅은 도커의 개념에 대해서 알아보겠습니다.

 

도커(Docker)

 

리눅스 컨테이너에 여러 기능을 추가, 애플리케이션을 컨테이너로서 쉽게 활용할 수 있게 만들어진 오픈소스.

Go 언어로 작성, 기존의 가상 머신과 달리 도커 컨테이너는 성능의 손실이 거의 없어서 차세대 클라우드 인프라 솔루션으로 주목.

 

도커는 일반적으로 도커 엔진을 의미로 쓰이는데, 도커 엔진은 컨테이너를 생성하고 관리하는 주체로 이 자체로도 컨테이너를 제어할 수 있고, 다양한 기능을 제공하는 도커의 주 프로젝트 입니다. 이 도커 엔진을 사용하는 방법에 대해 이야기해보겠습니다.

 

 

 

반응형

 

 

 

가상 머신과 도커 컨테이너

 

기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었습니다.

(*하이퍼바이저: 하나의 컴퓨터에서 서로 다른 OS를 사용하는 가상 컴퓨터를 만들 수 있는 효과적인 가상화 엔진)

 

여러 개의 운영체제는 가상 머신 단위로 구별되고, 각 가상 머신에는 우분투, Cent OS 등의 운영체제가 사용됩니다.

하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제라고 하며, 각 게스트 운영체제는 다른 게스트 운영 체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용합니다.

ex) VirtualBox, VMware

 

각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생합니다. 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 용량 또한 커집니다.

 

장점: 완벽한 운영체제를 생성할 수 있음

단점: 일반 호스트에 비해 성능 손실, 가상 머신 이미지의 용량 때문에 애플리케이션 배포에 부담

 

=> 도커 사용

 

도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스의 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없습니다.

 

컨테이너에 필요한 커널 => 호스트의 커널 공유

컨테이너 안 => 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재

 

=> 컨테이너 이미지 용량 축소

 

따라서 도커는 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있습니다.

 

 

 

 

반응형

 

 

 

 

도커를 시작해야 하는 이유

 

쿠버네티스와 같은 오픈소스 프로젝트에서도 도커를 기준으로 개발되고 있고, 이에 따라 더 많은 회사들이 서비스 개발 및 운영 환경에 도커 컨테이너를 도입하고 있습니다.

 

1) 애플리케이션의 개발과 배포가 용이

 

호스트 OS: 서버를 부팅할 때 실행되는 운영체제

도커 컨테이너: 호스트 OS 위에서 실행되는 격리된 공간

=> 독립된 개발 환경 보장(호스트 OS와 서로 영향 없음)

 

컨테이너에서 작업을 마치고 운영 환경에 배포하기 위해서는 도커 이미지(일종의 패키지)를 만들어 운영 서버에 전달

컨테이너에서 사용되던 운영 서버에서 새롭게 패키지를 설치할 필요 X

각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요 X

사용했던 환경 설정을 다른 서버에서도 컨테이너로 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능

 

도커 이미지는 커널을 포함X (이미지 크기가 작음)

레이어 단위로 구성해 중복되는 레이어를 재사용할 수 있어 애플리케이션 배포 속도가 매우 빠름

 

2) 여러 애플리케이션의 독립성과 확장성이 높아짐

 

모놀리스 애플리케이션: 소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식

=> 서비스의 기능이 복잡해지고, 거대해질수록 소프트웨어 자체의 확장성, 유연성이 줄어든다는 단점

 

vs

 

마이크로서비스구조(MSA): 여러 모듈을 독립된 형태로 구성. 언어에 종속되지 않고 변화에 빠르게 대응. 각 모듈의 관리가 쉬워짐.

=> 컨테이너는 수 초 내로 생성, 시작이 가능 + 여러 모듈에게 독립된 환경 동시 제공 => 마이크로서비스 구조에서 가장 많이 사용되는 가상화 기술

 

ex) 웹 서비스 => 데이터베이스 컨테이너 + 웹 서버 컨테이너

웹 서비스에 부하 발생 시 MSA 웹 서버 컨테이너만을 동적으로 늘려 부하 분산처리

웹 서버와 데이터베이스 이미지 버전을 독립적으로 관리 => 유지보수 용이

 

컨테이너 기반 MSA는 도커 스웜 모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용함.

 

그럼 저는 맥을 사용하고 있기 때문에 맥 환경에서 도커를 설치해 보겠습니다.

 

윈도우와 맥을 사용하면 도커를 사용하기 위해 가상화 공간을 별도로 생성해야 해서 리눅스 환경에서 사용하는 것이 가장 좋습니다.

최근엔 Docker for Mac OS X은 xhyve 기술을 이용해 리눅스 커널 기능과 도커 엔진 환경을 구성합니다.

 

https://docs.docker.com/desktop/install/mac-install/

 

Install Docker Desktop on Mac

Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.

docs.docker.com

 

위의 주소에서 자신에게 맞는 파일을 다운로드합니다.

파일을 설치하고 실행시킨 후 로그인을 하면 도커를 시작할 수 있습니다.

 

 

 

 

 

 

도커가 잘 실행되면 상단바에 고래 아이콘이 뜨게 됩니다.

 

 

설치가 정상적으로 완료되었다면 터미널에서 도커를 사용할 수 있습니다.

 

 

 

반응형

 

 

 

 

원래 윈도우와 맥환경에서 사용한다면 도커 툴박스로 도커를 사용하게 됩니다.

도커 툴박스로 설치된 도커와 자체 가상화 기술로 설치된 도커는 동일한 도커 엔진으로 동작합니다.

 

툴박스: 리눅스 가상 머신을 생성해 그 내부에 도커를 설치

Docker for Mac: 호스트 자체에 가상화 기술을 적용

 

=> 도커 컨테이너를 생성한 뒤 외부에서 접근하는 방법의 차이

 

도커 툴박스: PC에 리눅스 가상 머신을 생성한 뒤 도커를 설치

=> 가상 네트워크 2개 생성

내부 IP를 가진 가상 머신 안에 NAT IP를 할당받은 도커 컨테이너가 생성, 외부에서 컨테이너에 접근하기 위해서는 2중 포워딩이 필요

1: PC와 가상 머신 사이의 포트 포워딩

2: 가상머신과 컨테이너 사이의 포트 포워딩 => 도커에서 컨테이너를 생성할 때 쉽게 설정할 수 있음

 

호스트 PC의 웹 브라우저 등으로 컨테이너에 접근하기는 쉽지만,

외부 컨테이너에서 접근하기 위해서는 호스트와 가상 머신 사이의 포트 포워딩이 별도로 필요합니다.

 

Docker for Mac은 가상 머신을 생성하지 않고 자체 가상화 기술로 리눅스 환경을 만들어 컨테이너를 생성합니다.

=> 포트 포워딩을 설정하는 것만으로 외부에서 컨테이너에 접근 가능(2중 포워딩 필요 없음)

 

리눅스 환경에서 도커 사용하기

 

도커는 리눅스에서 작동하는데 최적화되어 있습니다. 하지만 이를 위해 리눅스 물리 서버를 직접 구하기는 쉽지 않습니다.

이를 위해 가상으로 리눅스 개발 환경을 구축하는 방안이 있습니다. 

 

  1. 버추얼박스, VMWare
  2. 아마존 웹 서비스(AWS) EC2

 

1)

 

버추얼박스와 VMWare는 흔히 말하는 가상머신으로 가상화도구로 리눅스 환경을 생성한 뒤 도커를 설치하는 것입니다.

이러한 가상머신에 우분투(리눅스 OS)를 이미지 파일(.iso)로 설치해 환경을 구축해서 사용할 수 있습니다.

 

2)

 

AWS는 클라우드에서 인스턴스를 제공받아 사용하는 EC2(Elastic Computing Cloud) 서비스를 제공합니다.

이 서비스를 이용하려면 AWS 사이트에서 새로운 인스턴스를 생성해 IP를 할당받아 PuTTY, Xshell 등의 ssh 클라이언트로 해당 서버에 접속해 리눅스 환경을 사용할 수 있습니다.

 

 

 

 

출처: 시작하세요! 도커 / 쿠버네티스

반응형