Docker 개요

2019-11-28

.

Data_Engineering_TIL_(20191128)

[학습한 Contents]

1) 주제 : 컨테이너 기반 가상화 플랫폼 ‘도커(Doker)’의 이해 - 도커 개요 및 소개 / SK T아카데미 온라인강의

2) URL : https://tacademy.skplanet.com/live/player/onlineLectureDetail.action?seq=125

[필기노트]

[목차]

  • 도커의 등장

  • 컨테이너

  • 이미지

  • 아키텍처

도커도 서버가 있고, 클라이언트가 있다. 그리고 맥에서 사용하는 경우도 있고, 윈도우에서 사용하는 경우가 있다. 이런 여러가지 경우에 따른 아키텍처가 다양하다.

  • 컨테이너 가상화가 필요한 이유

도커의 등장

솔로몬 하이크라는 개발자가 파이콘 2013 라이트닝 토크에서 처음 선을 보였다.

그래서 도커가 등장했는데 그래서 왜 도커가 필요한거지?? 라는 의문이 들 수 있다.

그래서 간단한 데모를 통해 “Hello, Docker”를 실행해보려고 하는데 이 헬로우 도커가 어떤의미인지 알아야 한다.

도커가 설치되어 있는 리눅스 터미널에서 아래 그림과 같이 명령어를 실행하면 hello world가 출력이 된다.

두번째 명령어를 실행하면 내 로컬 pc의 커널을 사용한 명령어인 반면에 docker run -it ubuntu:latest echo “hello, world”에서 echo “hello, world”가 도커에서 실행하는 명령어가 되겠다.

1

만약에 아래 그림과 같이 bash를 입력하면 bash가 실행된다. 위에 그냥 echo “hello,world”를 한 곳은 내 로컬 리눅스의 터미널이었는데 아래 그림과 같은 상태는 우분투 터미널에 있는 것이다.

2

아래 그림과 같은 명령을 실행한 결과를 봤을때 지금 있는 환경이 우분투이고, 16.04버전이라는 것을 알 수 있다. 그리고 exit 명령어를 실행하면 다시 내 로컬 리눅스 터미널로 나오게 된다. 결론적으로 위의 환경과 아래의 환경은 다른 환경이다.

3

이번에는 centos 이미지를 가져와서 실행을 해봤다. 그러면 이번에는 centos 환경으로 들어온것을 알 수 있다. 그런 다음에 hello world를 입력하면 역시 헬로우 월드가 출력이 된다. 그러나 지금 세번에 걸쳐서 명령어를 날린 hello world는 같은 명령어에 같은 결과지만 각각 다른 환경에서 실행되었다는 것을 우리는 알 수 있다.

4

이번에는 비지박스 이미지를 통해 hello world를 실행해보겠다. 우분투나 비지박스는 이미지가 그래도 수백메가바이트 단위인데 비지박스는 십메가바이트 대의 초소형 리눅스 이미지라고 할 수있다.

비지박스는 리눅스 커널을 위한 최소한의 파일만을 모아놓은 이미지이다. 또한 비지박스는 리눅스 배포판이 아니라 리눅스 커널을 실행할 수 있는 환경에다가 몇가지 툴들이 추가된 것이다.

5

따라서 docker run -it busybox:latest echo “hello,world”, docker run -it ubuntu:latest echo “hello,world”, docker run -it centos:latest echo “hello,world”는 단순히 헬로우 월드를 찍는 것이 아니라 각각 다른 환경에서 헬로우 월드를 출력한다는 것이다.

도커는 이런식으로 이미지를 통해 다양한 환경을 제공한다. 그리고 이러한 환경에서 실행되는 어떤 프로그램을 컨테이너라고 한다.

컨테이너는 가상머신인가라는 의문이 또 들 수 있다.

각각의 가상머신 = 서로 다른환경

각각의 컨테이너 = 서로 다른환경

이라는 점에서는 두개가 같은 것이라고 생각할 수 있다.

그러나 아래 그림과 같이 분명한 차이들이 있다.

우리가 오라클 버츄얼박스 같은거를 사용하는 것은 소프트웨어로 구현된 하드웨어를 사용하는 것이라고 보면된다. 그래서 내 컴퓨터위에 소프트웨어로 구현된 컴퓨터를 하나 만들고 그 위에 내가 원하는 운영체제를 설치하고 프로그램들을 설치하는 것이다.

그러나 적어도 리눅스만 봤을때는 도커는 하드웨어 가상화가 포함되어 있지 않다. 결론적으로 컨테이너는 프로세스인데 어떤 격리된 환경에서 실행되는 프로세스라고 생각하면 된다. 즉, 하드웨어 가상화가 없는 격리된 환경에서 실행되는 프로세스이다.

그래서 결국에는 위에서 실행한 우분투도 프로세스였고, 센트오에스도 프로세스였고, 비지박스도 프로세스라는 것이다.

6

컨테이너는 그래서 버츄얼머신이 아니고, 아래 그림과 같이 리눅스 커널에서 제공하는 다양한 프로세스를 격리할 수 있는 기능이 있는 것이다. 프로세스 격리라는 것은 루트디렉토리부터, 시작해서 네트워크 등을 각각의 환경에 따라 격리시키는 것이다. 아래 그림에서 빨간색 글씨들이 리눅스에서 제공하는 루트디렉토리 격리나 네트워크 격리 등 이런 프로세스 격리 도구들이다.

도커 초기에는 lxc(리눅스 컨테이너의 줄임말)을 이용하여 프로세스 격리를 해주었는데, 현재는 libcontainer라는 것을 라이브러리를 도커에서 아예 별도로 개발해서 사용하고 있다. 실제로는 빨간색으로 쓰여진 리눅스에서 제공하는 격리 도구들을 통해 프로세스를 격리하는 것이고 libcontainer나 lxc 같은거를 이용해서 이런것들을 접근을 하는 것이다.

7

그래서 컨테이너는 프로세스일 뿐이다.

이해를 위해 데모를 진행해보자.

실제로 작동하는 어플리케이션을 구동하는 컨테이너를 띄워보자

아래 그림과 같이 명령어를 실행하여 mysql 컨테이너를 띄웠다.

8

그 다음에 아래와 같이 명령어를 입력하여 워드프래스를 실행하려고 하는데 link를 사용해서 앞서 실행한 mysql을 그대로 사용하여 도커 내부적으로 포트를 연결시켜주겠다는 명령어이다.

9

도커에서 이미지는 특정 프로세스를 실행하기 위한 환경이다. 이미지는 계층화된 파일시스템으로 파일들의 집합이라고 할 수 있다. 리눅스에 어떤 파일이 있느냐에 따라서 어떤 프로세스가 돌아갈지 다르게 될 것이고 이미지는 어떤 프로세스를 띄우기 위해 파일들을 모아놓은 것이라고 할 수 있다.

도커 아키텍처는 아래 그림과 같다.

검정색 박스의 docker run 부분이 클라이언트라고 생각하면 되고, 실제 도커 서버를 머신에 실행을 시키고 나면 서버는 클라이언트에서 오는 명령에 따라 컨테이너를 동작시킨다.

13

컨테이너가 필요한 이유

보편적 물리법칙이라고 언제 어디서든지 동일하게 적용이 된다. 하지만 컴퓨터의 환경은 보편적이지 않다. 다양한 컴퓨터 환경이 있고, 같은 환경이더라도 환경설정이 다른 경우도 수없이 많다.

개인별 또는 조직별로 특수한 환경이 당연히 존재하고 특정하드웨어 특정 os, 소프트웨어 버전 각각 다른 경우가 많다.

도커를 사용하면서 장점을 얻을 수 있는 것은 깨끗한 환경을 구성할 수 있다는 점이다. Dockerfile이라는게 있는데 이거는 우리가 실행시킬 프로세스를 실행하기 위한 최소한의 파일을 모아놓는 작업이라고 이해하면 된다. 리눅스를 처음 설치했을때의 깨끗한 환경에서부터 내가 사용하고 싶은 어플리케이션을 사용하기 위한 최소한의 명령어들을 실행시키라는 것이 도커파일이라는 것이고 그걸로 만든것이 이미지라고 생각하면 된다.

이미지를 만들게 되면

이미지 = 작동되는 상태

라고 생각하면 된다.

이미지는 이미 작동이 되는게 보장되어 있다.

우리가 현재 로컬피시에서 당장 mysql을 실행하라고 하면 실행이 될지 안될지 보장이 안되어 있는데, 도커 이미지를 만들고 내가 실행시키고 싶은 프로세스를 미리 지정해놓게 되면 그 도커이미지는 작동한다는 걸 보장하는 상태가 된다.

따라서 10명의 서로다른 컴퓨터 환경이 있는데 하나의 이미지는 이 10명의 서로다른 환경에서 실행해도 같은 환경에서 같은 상태로 실행이 되는 것을 보장해준다.

그래서 이미지를 만들면 공유가 가능하고 도커가 깔린 어디서든지 실행이 된다.

개발관점에서는 개발피시에서 작업한 내용을 프로덕션 어플리케이션에서 동작한다는 것을 미리 보장해 놓고 사용할 수 있게된다.

Q) 가상화를 하게되면 메모리나 CPU 등 환경을 설정하게 되는데 도커는 그런거 설정없이 시스템 전체를 쓸 수 있는가?

기본적으로 도커는 시스템 전체를 사용하게 된다. 단 위에 슬라이드에 보면 cgroups라는 빨간색 글씨가 있는데 이게 리눅스 자원을 제어할 수 있는 기능을 제공한다. 그래서 우리가 리눅스에서 프로세스를 띄울때 그 프로세스가 얼마만큼의 자원을 사용할지 제약을 걸 수 있다. 그것과 마찬가지로 컨테이너를 띄울때도 그런 제약을 줄 수 있다. 그러나 그런설정을 하지 않고 사용하면 시스템 전체의 자원을 사용한다고 생각하면 된다.

그래서 오케스트레이션 툴과 같이 도커를 가지고 실제 서버를 운영할때는 이러한 제약들을 통상적으로는 설정을 해준다.