DevOps/Docker

[시작하세요! 도커/쿠버네티스] 도커란?

Grace 2022. 11. 14. 12:57

도커는 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트입니다. 도커는 Go 언어로 작성돼 있습니다. 기존에 쓰이던 가상화 방법인 가상 머신과는 달리 도커 컨테이너는 성능의 손실이 거의 없어서 차세대 클리우드 인프라 솔루션으로서 많은 개발자들에게 주목받고 있습니다.

도커와 관련된 프로젝트는 도커 컴포즈, 레지스트리, 도커 허브 등 여러가지가 있지만 일반적으로 도커라고 하면 도커 엔진 혹은 도커에 관련된 모든 프로젝트를 의미합니다. 보통 도커 엔진이라는 의미로 더 많이 쓰이는데 도커 엔진은 컨테이너를 생성하고 관리하는 주체로서 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 주 프로젝트이기 때문입니다.

도커와 관련된 모든 프로젝트들을 능숙하게 다루기 위해 핵심인 도커 엔진을 사용하는 방법을 익혀보도록 하겠습니다.

가상 머신과 도커 컨테이너

기존의 가상화 기술은 하이퍼바이저를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식이었습니다. 이러한 여러 개의 운영체제는 가상 머신이라는 단위로 구별되고, 각 가상머신에는 우분투(Ubuntu), CentOS 등의 운영체제가 설치되어 사용됩니다. 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제(Guest OS)라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용합니다. 이러한 가상화 방식을 사용할 수 있는 대표적인 가상화 툴로 VirtualBox, VMWare 등이 있습니다.

그러나 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 떄문에 일반 호스트에 비해 성능의 손실이 발생합니다. 그뿐만 아니라 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기 또한 커집니다. 즉, 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있습니다.

이에 비해 도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없습니다. 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 떄문에 컨테이너를 이미지로 만들었을 때 이미지 용량 또한 가상 머신에 비해 대폭 줄어듭니다. 따라서 컨에이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있습니다.

도커를 시작해야 하는 이유

컨테이너는 OpenVZ, LXC, cri-o 등 몇 가지가 존재하지만, 특히 그중에서도 도커는 컨테이너 생태계에서 사실상 표준으로서 사용되고 있습니다. 따라서 쿠버네티스, 메소스와 같은 오픈소스 프로젝트에서도 도커를 기준으로 개발되고 있으며 이에 발맞춰 점점 더 많은 회사들이 서비스 개발 및 운영 환경에 도커 컨테이너를 도입하고 있습니다. 그렇다면 왜 그렇게 많은 회사와 프로젝트가 도커를 선택했는지, 왜 도커를 시작해야 했는지에 대해 먼저 이야기해보도록 하겠습니다.

애플리케이션의 개발과 배포가 편해집니다.

서버를 부팅할 떄 실행되는 운영체제를 일반적으로 ‘호스트 OS’라고 부르며, 도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간입니다. 따라서 컨테이너 자체를 특별한 권한을 주지 않는 한, 여러분이 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정해도 호스트 OS에는 영향을 끼치지 않습니다. 즉, 여러분만의 독립된 개발 환경을 보장받을 수 있다는 것입니다.

여러분이 컨테이너 내부에서 여러 작업을 마친 뒤 이를 운영 환경에 배포하려고 한다면, 해당 컨테이너를 ‘도커 이미지’라고 하는 일종의 패키지로 만들어 운영 서버에 전달하기만 하면 됩니다. 컨테이너에서 사용되던 운영 서버에서 새롭게 패키지를 설치할 필요도 없으며, 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요도 없습니다. 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있기 때문에 개발/운영 환경의 통합이 가능해집니다.

게다가 도커 이미지는 가상 머신의 이미지와 달리 커널을 포함하고 있지 않기 때문에 이미지 크기가 그다지 크지 않습니다. 또한 도커의 이미지 내용을 레이어 단위로 구성하며, 중복되는 레이어를 재사용할 수 있어서 애플리케이션의 배포 속도가 매우 빨라진다는 장점이 있습니다.

여러 애플리케이션의 독립성과 확장성이 높아집니다.

소프트웨어의 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 방식을 모놀리스(Monolith) 애플리케이션 이라고 합니다. 소규모 서비스는 이 방식이 어울릴지도 모르지만, 서비스의 기능이 복잡해지고 거대해질수록 소프트웨어 자체의 확장성과 유연성이 줄어든다는 단점이 있습니다. 이러한 모놀리스 방식을 대체하기 위해 최근 새롭게 떠오른 개념이 바로 마이크로서비스 구조 입니다.

마이크로서비스 구조는 여러 모듈을 독립된 형태로 구성하기 때문에 언어에 종속되지 않고 변화에 빠르게 대응할 수 있으며, 각 모듈의 관리가 쉬워진다는 장점이 있습니다. 컨테이너는 수 초 내로 생성, 시작이 가능할 뿐만 아니라 여러 모듈에게 독립된 환경을 동시에 제공할 수 있기 때문에 마이크로서비스 구조에서 가장 많이 사용되고 있는 가상화 기술입니다.

컨테이너 기반의 마이크로서비스는 개발자가 그 구조를 직접 구현하기보다는 도커 스웜 모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용하는 것이 일반적입니다.

이 외에도 프로젝트 자체의 성숙도나 확장성, 편의성 등이 좋기 때문에 도커 컨테이너를 많이 사용합니다.

도커 엔진 설치

도커는 다양한 운영체제에서 사용할 수 있습니다. 리눅스 컨테이너를 제어하는 API를 Go언어로 구현한 libcontainer를 사용하기 때문에 대부분의 리눅스 운영체제에서 사용할 수 있습니다. 대표적인 리눅스 운영체제로는 CentOS, 우분투 등이 있습니다. 어느 운영체제를 선택하든 상관없지만, 가능하다면 지원이 중단되지 ㅇ낳은 최신 버전의 운영체제 배포한을 사용하는 것이 좋습니다. 마이크로소프느 윈도우, 맥 OS X에서도 도커를 사용할 수 있지만 윈도우10, 맥 OS X 10.10.3 Yosemite 이전 버전의 운영체제를 사용한다면 도커를 사용하기 위해 가상화 공간을 별도로 생성해야 합니다. 그러나 도커가 어느 운영체제에 설치되든 사용법은 거의 같습니다.

도커 엔진의 종류 및 버전

도커 엔진은 도커 EE(Docker Enterprise Edition)와 도커 CE(Community Edition)으로 구분되어 제공되고 있으며, 버전 이름 또한 (출시 년도)-(출시 월)-(도커 엔진 종류)의 형태로 변경되었습니다.

도커 EE는 유료로 제공되는 기업용 솔루션이며, 각종 기술 지원 및 실제 서비스 단계에서 필요한 각종 부가 기능들을 도커 엔진과 함께 제공합니다. 도커 CE는 무료로 제공되는 도커 엔진으로서, 별도의 기술 지원 및 서비스를 제공하지는 않지만 도커 엔진 자체의 핵심적인 기능을 무료로 사용할 수 있다는 장점이 있습니다. 또한 도커 EE는 3개월마다 안정화된 버전으로서 릴리스되는 반면 도커CE는 stable과 edge 버전으로 구분해 각각 3개월, 1개월 단위로 릴리스 된다는 차이점도 있습니다.

도커CE edge 버전은 새로운 기능을 먼저 사용해 볼 수 있다는 장점이 있지만 각종 버그가 발생할 수 있기 때문에 가능하면 도커 CE의 stable 버전을 사용하는 것을 권장합니다.

리눅스 도커 엔진 설치

리눅스에서 도커를 설치할 때 확인해야 할 사항은 아래와 같습니다.

  • 최신 버전 커널을 사용하고 있는지 확인합니다
    호스트 운영체제가 최소한 3.10 이상을 사용해야 도커 컨테이너를 정상적으로 사용할 수 있습니다. 터미널에서 uname -r 명령어를 입력해 커널의 버전이 이를 만족하는지 확인합니다. 오래된 버전의 커널을 사용한다면 도커가 정상적으로 작동하지 않을 수 있습니다.
  • 지원 기간 내에 있는 배포판인지 확인합니다.
    일부 오래된 리눅스 배포판은 업데이트 등의 지원을 받지 못할 수 있습니다. 현재 사용 중인 리눅스 배포한의 지원 종료 여부는 각 리눅스 운영체제의 공식 웹사이트에서 확인할 수 있습니다.
  • 64비트 리눅스인지 확인합니다.
    도커는 64비트에 최적화돼 있습니다. 32비트 버전에서 도커를 실행하는 방법이 없는 것은 아니지만 권장하지 않습니다.
  • sudo 명령어를 통해 설치하거나 root 권한을 소유한 계정에서 설치를 진행해야 합니다.

위 조건을 모두 만족한다면 도커 설치를 진행합니다. 각 리눅스 운영체제에서 설치하는 방법은 아래와 같습니다.

Ubuntu

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# apt-get update

# apt-get install docker-ce

CentOS, RHEL

# yum install -y yum-utils
# yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# yum install -y docker-ce
# systemctl start docker

현재 어떤 운영체제를 사용 중인지 잘 모르거나 도커 설치 방법을 찾을 수 없다면 도커에서 제공하는 설치 스크립트로 손쉽게 설치할 수 있습니다. 대부분의 리눅스 운영체제에서 사용할 수 있는 간단한 방법이지만 우베에서 신뢰할 수 없는 셸 스크립트를 받아 실행하는 것은 좋은 습관이 아닙니다.

아래의 명령어는 현재 사용가능한 최신 버전의 도커 엔진을 설치합니다.

# wget -q0- get.docker.com | sh

설치가 완료된 후 도커가 정상적으로 동작하는지 확인하려면 docker info 명령어를 입력합니다. docker info는 설치된 도커 엔진의 각종 정보를 출력하는 명령어입니다.

최신 버전의 도커 엔진은 새로운 기능을 사용할 수 있다는 장점은 있지만, 안정화되지 않아 각종 버그가 발생할 수 있으므로 가능하면 출시되고 어느 정도 시간이 흐른 버전의 도커 엔진을 사용하는 것을 권장합니다.

윈도우, 맥 OS에 도커 설치

도커의 기능을 완전하게 사용하려면 리눅스에서 사용하는 것이 가장 바람직하지만 윈도우와 맥에서도 간단한 테스트나 개발 용도로 도커를 사용할 수 있습니다. 윈도우와 맥에서 설치하는 도커를 일반적으로 Docker Desktop이라고 부르며, 윈도우용은 Hyper-V 가상화 기술을, 맥은 xhyve 기술을 이용해 리눅스 커널 기능과 도커 엔진 환경을 구성합니다.

단 Docker Desktop에서는 도커에서 제공하는 네트워크, 볼륨 기능 등이 일부 지원되지 않을 수 있으며, 예상치 못한 버그를 마주칠 가능성이 높습니다. 따라서 가능하다면 Docker Desktop보다는 완전한 리눅스 환경에서 도커를 사용하는 것을 권장합니다.

Docker Desktop for Windows 설치

Docker Desktop for Windows

윈도우용은 Hyper-v를 이용해 가상화 환경을 제공하기 때문에 도커 툴박스와 호환되지 않으며, 버추얼박스와도 호환되지 않습니다. 기존에 도커 툴박스나 버추얼박스를 사용했다면 가상 머신 내용일 미리 백업해 두는 것이 좋습니다.

설치하고 나면 Hyper-V 기능을 활성화하기 위해 PC를 재시작합니다. PC를 재시작하고 나면 트레이 아이콘에서 도커가 작동 중인지 확인할 수 있습니다.

설치가 정상적으로 완료되면 명령 프롬프트나 파워셸 등의 셸을 실행해 도커를 사용할 수 있습니다.

docker -v명령어를 이용하면 도커 버전을 확인할 수 있습니다.

Docker Desktop for Mac 설치

Docker Desktop for Mac

다운로드한 Docker.dmg 파일을 실행해 가이드에 따라 설치합니다. 설치 도중 권한을 묻는 창이 나요면 사용자 이름과 암호를 입려갑니다.

설치한 후 도커를 시작하면 우측 상단에서 도커 아이콘을 확인할 수 있습니다.

설치가 정상적으로 완료되면 터미널을 실행해 도커를 사용할 수 있습니다.

💡 Docker Desktop for Mac과 Docker Desktop for Windows는 가상 환경을 생성하기 위해 리눅스킷(LinuxKit)이라고 불리는 툴을 이용합니다. 리눅스킷은 최소화된 리눅스 커널만을 탑재한 뒤 필요한 작업만 컨테이너 기반의 서비스로 정의해 사용합니다. 따라서 Docker Desktop for Mac, Docker Desktop for Windows의 커널은 리눅스킷의 커널을 따르게 되며, 가상 환경에서 실행되는 도커 엔지 또 한 해당 커널을 사용하게 됩니다.

리눅스 환경에 도커 마련하기

도커는 원래 리눅스에서 작동하는 데 최적화돼 있으므로 윈도우, 맥에서 도커를 사용하면 일부 기능이 제약될 수 있습니다. 아직까지는 여러 커뮤니티에서 리눅스로 도커를 실행하는 것을 권장하지만 도커로 개발하기 위해서 리눅스 물리 서버를 직접 구하기는 쉽지 않습니다. 이를 위해 리눅스 개발 환경을 만들기 위해 버추얼박스와 아마존 웹 서비스의 EC2를 사용하는 방법을 알아봅시다.

버추얼박스, VMWare

도커를 공부할 때 사용하는 가장 일반적인 방법은 버추얼박스, VMWare 같은 가상화 도구로 리눅스 환경을 생성한 뒤 도커를 설치하는 것입니다. 이 방법은 별도의 리눅스 서버 없이 윈도우, 맥에서 마치 실제 리눅스를 사용하는 것처럼 도커를 연습할 수 있으므로 컨테이너 애플리케이션을 개발하는 용도로 많이 사용합니다.

VirtualBox에서 각 운영체제에 맞는 설치 파일을 내려받아 설치할 수 있습니다.

설치를 마치면 가상 머신에 사용될 이미지 파일(.iso)을 다운받습니다.

리눅스를 사용하는 데 익숙하다면 서버 버전을, 그렇지 않다면 데스크톱 버전을 사용합니다.

💡 도커와 가장 잘 호환되며 관련 자료가 많은 리눅스는 우분투입니다. CentOS 등 다른 리눅스를 사용해도 도커 엔진을 사용하는 데는 큰 문제가 없지만 도커를 처음 사용한다면 우분투를 설치하는 것을 권장합니다.

아마존 웹 서비스 EC2

AWS는 클라우드에서 인스턴스를 제공받아 사용하는 EC2 서비스를 제공합니다. 이 서비스를 이용하면 AWS 사이트에서 새로운 인스턴스를 생성해 IP를 할당받아 PuTTY, XShell 등의 SSH 클라이언트로 해당 서버에 접속해 리눅스 환경을 사용할 수 있습니다. EC2 서비스는 원하는 성능의 서버를 생성해 사용한 시간만큼만 요금을 지불하기 때문에 필요할 때마다 간편하게 리눅스를 사용할 수 있다는 장점은 있지만 AWS의 모든 서비스는 사용한 만큼 요금을 지불하는 방식이므로 오랜 기간 동안 높은 성능의 서버를 사용하면 요금을 많이 지불해야 하니 주의해야 합니다.

💡 AWS는 최초 가입 시 월 750시간의 프리티어를 1년간 제공하며, AWS EC2의 t2.micro 인스턴스를 무료로 사용할 수 있습니다. 인스턴스를 1개만 사용한다면 한 달 내내 켜둬도 요금이 발생하지 않는데, 이는 24시간*31일 = 744시간으로 750시간을 넘지 않기 때문입니다.

AWS 사이트에 접속해 [콘솔에 로그인] 버튼을 눌러 로그인하면 Management Console(관리 콘솔)을 볼 수 있습니다. 왼쪽 상단에 있는 컴퓨팅 항목의 [EC2]를 클릭합니다.

[인스턴스 시작] 버튼을 클릭해 새로운 인스턴스를 생성합니다.

💡 인스턴스를 생성하기 전, AWS 사이트 오른쪽 상당의 Region(리전)을 Seoul로 변경하면 인스턴스를 AWS 서울 리전에 생성할 수 있습니다. US, EU 등의 리전에 인스턴스를 생성하면 인스턴스에 SSH로 접속했을 때 반응 속도가 느려질 수 있습니다.

인스턴스에서 사용할 운영체제를 선택합니다. RHEL, Amazon Linux 등을 사용할 수 있지만 Ubuntu Server LTS를 선택합니다.

생성할 인스턴스의 성능을 선택합니다. 목록의 아래에 위치할수록 높은 성능의 인스턴스이며, 더 많은 요금을 지불해야 합니다. AWS의 프리티어를 통해 무료로 사용 가능한 t2.micro 항목을 선택합니다.

t2.micro 항목을 선택한 후 [검토 및 시작]을 클릭하면 바로 인스턴스 생성 확인 페이지로 넘어갑니다. 단, 세부 옵션을 설정하려면 [다음: 인스턴스 세부 정보 구성]을 클릭해서 설정합니다.

인스턴스 생성 정보를 확인하는 화면에서 [시작하기] 버튼을 클릭하면 인스턴스에 접속할 때 필요한 키를 발급받을 수 있습니다.

‘키 페어 이름’에 키의 이름을 입력하고 [키 페어 다운로드] 버튼을 클릭해 키를 내려받습니다. 이 키는 인스턴스에 접근할 때 필요한 키이므로 잃어버리지 않도록 주의합니다. 키 파일을 내려받았다면 [인스턴스 시작] 버튼을 클릭해 인스턴스를 생성합니다.

인스턴스를 생성한 후 조금 기다리면 인스턴스 상태가 running으로 바뀝니다.

내려받은 키 파일(.pem)과 인스턴스의 Public IP를 사용하면 해당 인스턴스에 접근할 수 있습니다. 아래는 커맨드라인에서 SSH 클라이언트를 사용해 접근하는 예입니다. SSH 클라이언트로는 커맨드라인뿐 아니라 PuTTY, XShell 등 다양한 프로그램을 사용할 수 있으므로 각자의 취향에 맞는 클라이언트를 선택해서 사용하길 바랍니다.

# ssh -i mykey.pem ubuntu@52.78...

'DevOps > Docker' 카테고리의 다른 글

[시작하세요! 도커/쿠버네티스] 도커 엔진 ①  (0) 2022.11.21