본문 바로가기
Infra/Docker

도커를 배우자01 - 도커란?

by 윤루트 2021. 11. 16.

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

 

컨테이너는 다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 준다. 백엔드 프로그램, DB 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화가 가능하며 AWS, Azure, Google cloud 등 어디에서든지 실행할 수 있다.

 

컨테이너

컨테이너는 가상화 기술의 하나로, 격리된 공간에서 프로세스가 동작하는 기술이다.

 

기존의 가상화 방식은 추가적인 OS를 설치하여 가상화하는 방식이다. 이 방법은 성능 문제가 있었고 이를 개선하기 위해 프로세스를 격리하는 방식이 등장한다.

 

리눅스에서 해당 방식을 리눅스 컨테이너라고 하고 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작한다. CPU나 메모리는 프로세스가 필요한 만큼만 추가로 사용하기 때문에 성능적으로 거의 손실이 없다.

 

하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 Virtual Machine을 사용하는 느낌을 준다.

1. 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고

2. apt-get이나 yum으로 패키지를 설치할 수 있으며

3. 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있다.

4. CPU나 메모리 사용량을 제한할 수 있고

5. 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있다.

 

* 도커의 기본 네트워크 모드는 Bridge 모드로 약간의 성능 손실이 있다. 네트워크 성능이 중요한 프로그램의 경우 --net=host 옵션을 고려해야 한다.

 

이미지

이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다(immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 해당 컨테이너에 저장된다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

 

ubuntu 이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 잇고 MySQL 이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등을 가지고 있다. Gitlab 이미지는 centOS 기반으로 ruby, go, database, redis, gitlab source, nginx 등을 가지고 있다.

 

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 여러 파일들을 설치할 필요가 없다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운로드하고 컨테이너를 생성만 하면 된다. 한 서버에 여러 개의 컨테이너를 실행할 수 있고, 여러 대의 서버도 문제없다.

 

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.

 

레이어 저장 방식

 

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백 MB에 이른다. 처음 이미지를 다운로드할 땐 크게 부담되지 않지만, 기존 이미지에 파일 하나 추가 시 전체 파일을 다시 다운로드한다면 매우 비효율적이다.

 

도커는 이러한 문제를 해결하기 위해 레이어라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해 준다. 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

 

ubuntu 이미지가 'A+B+C'의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 'A+B+C+nginx'가 된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 'A+B+C+nginx+source' 레이어로 구성된다. webapp 소스를 수정하면 'A+B+C+nginx' 레이어를 제외한 새로운 source(v2) 레이어만 다운로드하면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

 

컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만을 사용한다.

 

이미지 경로

 

이미지는 url 방식으로 관리하며 태그를 붙일 수 있다. ubuntu 14.04 이미지는

'docker.io/library/ubuntu:14.04' 또는

'docker.io/library/ubuntu:trusty'이고

'docker.io/library'는 생략 가능하여 'ubuntu:14.04'로 사용할 수 있다.

이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다.

 

Dockerfile

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSL(Domain-Specific-Language) 언어를 이용하여 이미지 생성 과정을 적는다.

서버에 어떤 프로그램을 설치하기 위해 다양한 의존성 패키지를 설치하고 설정 파일을 만들었던 경험이 있다면 그것을 이제 Dockerfile로 관리할 수 있다. 해당 파일은 소스와 함께 버전 관리되며 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있다.

 

자세한 내용은 추후에 다시 다루도록 하겠다.

 

 

* 참고

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이

subicura.com

 

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

도커를 배우자03 - 기본 명령어  (0) 2021.11.18
도커를 배우자02 - 설치 및 실행  (0) 2021.11.17

댓글