dev

Docker

Docker

Wonny (워니)
Wonny (워니)·생성일 2020년 08월 31일 09:30·마지막 수정일 2020년 08월 31일 09:30

What is Docker?

컨테이너 생태계의 de facto로, 리눅스 컨테이너 기술을 활용하여 애플리케이션 실팽에 필요한 환경을 하나의 이미지로 모아두고, 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하게 해주는 오픈소스 프로젝트이다.

What is Container?

docker 1

호스트 OS상에 논리적인 구획(컨테이너)를 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 컴퓨터인 것처럼 사용할 수 있게 만든 것이다.

기존의 가상 머신 방식 vs 도커 컨테이너 방식

기존의 가상 머신 방식

기존에는 VirtualBox, VMware 같은 하이퍼바이저를 이용하여 여러 개의 운영체제를 하나의 호스트에서 생성하여 사용하는 방식으로 가상화가 이루어졌다. 이 방식은 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업이 반드시 하이퍼바이저를 거치기 때문에 일반 호스트에 비해 성능의 손실이 발생한다. 더불어 가상 머신에 게스트 운영체제를 사용하기 위한 모든 것이 포함되어야 하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기가 크다.

도커 컨테이너 방식

리눅스 자체 컨테이너 기능을 사용하여 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용하고, 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량이 가상 머신에 비해 대폭 줄어든다.

Why use Docker?

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

  • 도커 컨테이너는 호스트 OS 위에서 실행되는 격리된 공간이기 때문에 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정해도 호스트 OS에 영향을 끼치지 않는다.
  • 작업한 컨테이너를 도커 이미지라고 하는 일종의 패키지로 만들어 운영 서버에 전달하기만 하면 된다. 운영 서버에서 새롭게 패키지를 설치할 필요도 없고, 각종 라이브러리 설치 등으로 인한 의존성을 걱정할 필요가 없다. 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있어서 개발/운영 환경의 통합이 가능해진다.
  • 도커 이미지는 가상 머신의 이미지와 달리 커널을 포함하고 있지 않아 이미지 크기가 그다지 크지 않다. 또한 도커는 이미지 내용을 레이어 단위로 구성하며, 중복되는 레이어를 재사용할 수 있어서 애플리케이션의 배포 속도가 매우 빨라진다.
  • 개발할 때와 동일한 환경을 유지하기 때문에 개발/테스트 환경에서는 움직이지만 제품 환경에서는 움직이지 않는다는 리스크를 줄일 수 있다.
  • 애플리케이션 개발부터 테스트~제품 환경에 대한 전개를 모두 애플리케이션 엔지니어가 수행할 수 있게 되어 CD가 가능해지고 변화에 강한 시스템을 구축할 수 있다.

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

  • 소프트웨어 여러 모듈이 상호 작용하는 로직을 하나의 프로그램 내에서 구동시키는 모놀리스 애플리케이션 방식은 서비스의 기능이 복잡해지고 거대해질수록 소프트웨어 자체의 확장성과 유연성이 줄어든다는 단점이 있다. 이를 해결하기 위해 마이크로서비스 구조가 떠올랐다. 마이크로서비스 구조는 여러 모듈을 독립된 형태로 구성하기 때문에 언어에 종속되지 않고 변화에 빠르게 대응할 수 있으며 각 모듈의 관리가 쉬워진다는 장점이 있다. 컨테이너는 수 초 내로 생성, 시작이 가능할 뿐만 아니라 여러 모듈에게 독립된 환경을 동시에 제공할 수 있게 때문에 마이크로서비스 구조에서 가장 많이 사용되고 있는 가상화 기술이다.

도커 엔진 설치하기

도커 툴박스

  • 버추얼박스의 가상화 기술을 이용해 리눅스 가상 환경을 구축한 뒤 도커를 설치하는 방식
  • PC에 리눅스 가상 머신을 생성한 뒤 도커를 설치하므로 가상 네트워크가 2개 생성된다. 내부 IP를 가진 가상 머신 안에 NAT IP를 할당 받은 도커 컨테이너가 생성되므로 외부에서 컨테이너에 접근하기 위해서는 2중 포트 포워딩이 필요하다. PC와 가상 머신 ㄴ사이의 포트 포워딩, 가상 머신과 컨테이너 사이의 포트 포워딩이다.

Docker for Windows/Mac OS X

  • 최근 윈도우와 맥 OS X의 자제 가상화 기술을 사용한 도커가 출시되어 버추얼박스에 의존하지 않고도 도커를 설치할 수 있게 되었다. 맥에서는 xhyve 기술을 이용해 리눅스 커널 기능과 도커 엔진 환경을 구성한다.
  • 가상 머신을 생성하지 않고 자체 가상화 기술로 리눅스 환경을 만들어 컨테이너를 생성하기 때문에 도커에서 컨테이너를 생성할 때 포트 포워딩을 설정하는 것만으로 외부에서 컨테이너 접근이 가능하다.

도커 이미지

이미지는 컨테이너를 생성할 때 필요한 요소이며 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념입니다. 이미지는 여러 개의 계층으로 된 바이너리 파일로 존재하고 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용됩니다.

도커에서 사용하는 이미지의 이름은 기본적으로 [저장소 이름]/[이미지 이름]:[태그] 형태

  • 저장소 이름은 생략 가능하고 생략하는 경우 도커 허브의 공식 이미지를 뜻함
  • 이미지 이름은 해당 이미지가 어떤 역할을 하는지 나타내며 생략할 수 없음
  • 태그는 이미지의 버전 관리, 혹은 리비전 관리에 사용. 버전을 생략하면 latest로 인식함

도커 컨테이너

이미지로 먼테이너를 생성하면 해당 미이미지의 목적에 맞는 파일이 들어 잇는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성되고 이것이 바로 도커 컨테이너가 됩니다. 컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 컨테이너에서 무엇을 하든지 원래 이미지는 영향을 받지 않는다. 또 독립된 파일시스템을 제공받기 때문에 어떤 애플리케이션을 설치하거나 삭제해도 호스트에 변화가 없다.

도커 기능

Build: 도커 이미지를 만드는 기능

Docker는 애플리케이션 실행에 필요한 프로그램 본체, 라이브러리, 미들웨어, OS나 네트워크 설정 등을 하나로 모아서 Docker 이미지를 만든다.

도커에서는 하나의 이미지에는 하나의 애플리케이션만 넣어 두고, 여러 개의 컨테이너를 조합하여 서비스를 구축한다는 방법을 권장하고 있다.

Ship: 도커 이미지를 공유하는 기능

도커 이미지는 도커 레지스트리(ex: Docker Hub)에서 공유할 수 있다.

Run: 도커 컨테이너를 작동시키는 기능

도커의 경우는 이미 움직이고 있는 OS 상에서 프로세스를 실행시키는 것과 거의 똑같은 속도로 빨리 실행시킬 수 있다.

도커 컴포넌트

  • Docker Engine: 도커의 핵심 기능, 도커 이미지를 생성하고 컨테이너를 가동시키고 도커 명령의 실행이나 Dockerfile에 의한 이미지도 생성한다.
  • Docker Registry: 이미지 공개 및 공유, 도커의 공식 레지스트리 서비스인 Docker Hub도 이 도커 레지스트리를 사용한다.
  • Docker Compose: 컨테이너 일원 관리, 여러 개의 컨테이너 구성 정보를 코드로 정의하고, 명령을 실행함으로써 애플리케이션의 실행 환경을 구성하는 컨테이너들을 일원 관리하기 위한 툴이다.
  • Docker Machine: 도커 실행 환경 구축, 클라우드 환경에 도커의 실행 환경을 명령으로 자동 생성하기 위한 툴이다.
  • Docker Swarm: 클러스터 관리, 여러 도커 호스트를 클러스터화하기 위한 툴이다. 클러스터를 관리하거나 API를 제공하는 역할은 Manager가, 도커 컨테이너를 실행하는 역할은 node가 담당한다. 오픈소스인 쿠버네티스도 이용할 수 있다.

CLI

# 버전 확인 $ docker -v # 컨테이너 생성 # -i: 컨테이너와 상호 입출력 # -t: tty를 활성화해서 배시 셸을 사용하도록 설정 $ docker run -i -t <이미지이름> $ docker run -i -t ubuntu:14.04 root@ek320fjsk3f:/# # -> 이렇게 하면 컨테이너 생성 및 실행과 동시에 컨테이너 내부로 들어옴 # 컨테이너 나오기 - 첫 번째 방법: 나옴과 동시에 컨테이너 정지 시키는 방법 Ctrl+D 혹은 root@ek320fjsk3f:/# exit # 컨테이너 나오기 - 두 번재 방법: 정지하지 않고 빠져나오기: Ctrl+P,Q # 컨테이너 작성 및 실행 $ docker container run <이미지이름> <실행할명령> ex) $ docker container run ubuntu:lastest /bin/echo 'Hello World' # 실행 환경(컨테이너 수, 도커 버전, 스토리지 드라이버 종류 등) 확인 $ docker system info # 디스크 이용 상황 $ docker system df # 이미지 내려받기 $ docker pull centos:7 # 이미지 확인하기 $ docker images # 컨테이너 다른 방식으로 생성하기 $ docker create -i -t --name mycentos centos:7 # create로 생성하면 run과는 달리 컨테이너 내부로 들어가지 않음 # 컨테이너 시작 $ docker start mycentos # 컨테이너 내부로 들어가기 $ docker attach mycentos # 정리 # run 명령어는 pull, create, start 명령어 일괄 실행 후 attach가 가능하면 컨테이너 내부로 들어감 # 컨테이너 목록 확인 $ docker ps # 정지되지 않은 컨테이너만 출력
© 2020 Wonny.