새로운 툴은 계속 나오고 클라우드의 발전으로 설치해야 할 서버가 수백, 수천대에 이르는 상황(?)
이런 노답인 상황에서 Docker가 등장하고 서버관리 방식이 완전히 바뀌게 됩니다.
도커의 역사
도커는 2013년 3월 산타클라라에서 열린 Pycon Conference에서 dotCloud의 창업자인 Solmon Hykes가 The future of Linux Containers 라는 세션을 발표하면서 처음 세상에 알려졌습니다.
도커란?
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼 입니다.
컨테이너 하면 화물 수송용 박스를 생각할 수 있는데 여기에는 여러가지 화물들이 들어 있고 규격화 되어 컨테이너선이나 트레일러 등 다양한 운송 수단으로 쉽게 옮길 수 있다.
마찬가지로 서버에서 이야기하는 컨테이너도 다양한 프로그램, 실행환경을 컨테어니로 추상화 하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다. 백엔드, 데이터베이스, 메시지큐 등 어떤 프로그램도 컨테이너로 추상화 할 수 있고 조립PC, AWS, Azure, Google Cloud등 어디서든 실행 할 수 있다.
기존 가상화 방식은 OS를 가상화!
VMware, VirtualBox같은 가상머신
무겁고 느림
컨테이너
컨테이너
프로세스를 격리하는 방식 -> 다수의 컨테이너를 OS커널에서 직접 구동.
격리된 실행환경을 제공하기 위한 인프라 기술.
하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 Virtual Machine을 사용하는 느낌을 줍니다.
실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get or yum으로 패키지 설치 가능
이미지
컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것
이미지를 실행한 상태라고 볼수 있고 추가되거나 변하는 값은 컨테이너에 저장
같은 이미지에 여러개의 컨테이너를 생성 할 수 있고 컨테이너의 상태가 변경되거나 삭제되더라도 이미지는 변하지 않고 그대로 남아 있습니다.
이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다.
이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다.
한 서버에 여러개의 컨테이너를 실행 할 수 있고, 수십, 수백, 수천대의 서버도 문제 X
레이어 저장방식
도커 이미지는 컨테이너 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 큼.(MB)
처음 이미지를 다운받을 때는 크게 부담이 안가지만 기존 이미지에 파일하나 추가했다고 다시 다운 받는다면 매우 비 효율적 일 수밖에 없다.
도커는 이런 문제를 해결하기 위해 레이어(layer)라는 개념을 사용.
유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해줍니다.
이미지는 여러개의 읽기 전용(read only) 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성 됩니다.
예를 들어 CentOS 이미지가 A라고 하자. CentOS 이미지를 베이스로 만든 톰캣 이미지는 A+tomcat이 된다. webapp 이미지를 톰캣 이미지 기반으로 만들었다고 한다면 A+tomcat+source 레이어로 구성된다. webapp 소스를 수정하면 A, tomcat 레이어를 제외한 새로운 source(v2) 레이어만 다운 받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수가 있다.
컨테이너를 생성할 때도 레이어 방식을 사용
기존 이미지 레이어 위에 읽기/쓰기 레이어를 추가
이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용.
url 방식으로 관리
이미지는 url방식으로 관리하며 태그(tag)를 붙일 수 있음.
Dockerfile
도커는 이미지를 만들기 위해 Dockerfile 이라는 파일에 자체 DSL(Domain Specific Language)언어를 이용하여 이미지를 생성 합니다.
Docker Hub
도커 이미지 용량은 보통 수백메가로 수기가가 넘는 경우도 흔합니다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해 줍니다.
FROM openjdk:8-jdk-alpine
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
* 참고
* FROM : 이미지를 생성할 때 사용할 기반 이미지를 지정한다. 예제에서는 openjdk:8-jdk-alpine 이미지를 사용했다. 이 이미지는 알파인 OS에 JDK 8을 설치한 이미지이다.
* RUN : 이미지를 생성할 때 실행할 코드를 지정한다. 예제에서는 패키지를 설치하고 파일 권한을 변경하기 위해 RUN을 사용했다.
* WORKDIR : 작업 디렉토리를 지정한다. 해당 디렉토리가 없으면 새로 생성한다. 작업 디렉토리를 지정하면 그 이후 명령어는 해당 디렉토리를 기준으로 동작한다.
* COPY : 파일이나 폴더를 이미지에 복사한다. 위 코드에서 두 번째 COPY 메서드는 entrypoint.sh 파일을 이미지에 run.sh 이름으로 복사한다. 상대 경로를 사용할 경우 WORKDIR로 지정한 디렉토리를 기준으로 복사한다.
* ENV : 이미지에서 사용할 환경 변수 값을 지정한다. 위 코드는 PROFILE 환경 변수의 값으로 local을 지정했는데 이 경우 컨테이너를 생성할 때 PROFILE 환경 변수를 따로 지정하지 않으면 local을 기본 값으로 사용한다.
* ENTRYPOINT : 컨테이너를 구동할 때 실행할 명령어를 지정한다. 위에서는 run.sh을 실행하도록 설정했다.'