Docker(도커)

Beomsun·2022년 6월 28일
0

Devops

목록 보기
4/4

hello dokcer

Docker란??

리눅스 컨테이너 기반의 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램이며 컨테이너를 다루는(컨테이너 런타임) 도구이다. 즉 컨테이너를 쉽게 내려받거나 공유하고 구동할 수 있도록 해주는 도구이다.

가상머신과 도커 컨테이너

Docker는 지금까지 사용해왔던 VMware, Microsoft Hyper-V(Virtual PC), Xen 등의 같은 가상 머신과 비슷하다. 가상 머신에 리눅스를 설치한 뒤 각종 서버와 DB를 설치하고, 개발한 어플리케이션이나 웹사이트를 실행했습니다. 이렇게 세팅한 가상 머신 이미지를 여러 서버에 복사해서 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있다.

가상머신

가상머신

가상머신은 하이퍼바이저를 이용해 Guest OS를 만들어낸다. 예를 들어, 윈도우 운영체제를 메인으로 쓰고 있다면 이는 Host OS가 되는 것이고 이 위에 Ubuntu를 가상머신위에 구동시킨다면 이는 Guest OS가 되는 것이다. Guest OS를 구동시키려면 Host OS에서 자원을 일부 사용해야 한다. 따라서 Host OS도 느려지고, Guest OS도 성능이 그리 좋은 편은 아니다.

    Server → Host OS → Hypervisor → 각각의 Guest OS 가 설치된 VM 구동

도커

도커

가상머신가 무엇이 다를까? 도커는 그림과 같이 Geust OS를 설치하지 않으며 Docker 이미지에 서버 운영에 필요한 프로그램과 라이브러리만 격리해서 설치할 수 있고, OS 자원은 호스트와 공유한다. 이렇게 되면서 이미지 용량이 대폭 줄어든다.

    Server → Host OS → Docker Engine → Container 구동
  • 장점

    • 애플리케이션 독립성이다. 호스트 OS와도, 다른 컨테이너와도 독립된 공간을 보장받을 수 있기 때문에 충돌 발생 염려가 전혀 없다.
    • 컨테이너 내부에 작업을 한 후에 배포하려고 한다면 도커 이미지라는 패키지로 만들어서 운영서버에 전달만 하면 된다. 즉, 배포가 쉬워진다.
    • 모놀리식 애플리케이션 방식에서 마이크로서비스 구조로 변화가 쉽다. 즉, 컨테이너 하나당 하나의 기능만을 제공하는 모듈로 만들어서 부하가 많은 모듈은 여러개 더 만들고 하는 조정이 가능해진다.

가상머신과의 차이점

  • 프로세스를 격리할뿐 OS를 띄우지 않는다.
  • 가상머신의 효과는 낼수 있다.

Docker 주요개념

들어가기에 앞서 리눅스 컨테이너란?

리눅스는 운영체제 레벨에서 가상화를 제공했습니다. OS를 통째로 가상화하는 것이 아닌 리눅스 커널 레벨에서 제공하는 일종의 격리(Isolate)된 가상 공간입니다.

OS가 설치되지 않기 때문에 가상 머신이라고 하지 않고, 컨테이너라고 부릅니다.

리눅스 컨테이너는 격리된 공간만 제공할 뿐 개발 및 서버 운영에 필요한 부가기능이 부족했습니다. Docker는 리눅스 컨테이너를 기반으로 하여 편리하게 이미지를 관리하고 배포할 수 있도록 해줍니다.

이미지(Image)

도커이미지

  • 이미지는 필요한 프로그램과 라이브러리, 소스를 설치한 뒤 파일로 만든 것이며. 이 이미지를 저장소에 올리고, 받을 수 있다.

  • 이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않음(Immutable)

  • 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됨.

  • 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 존재

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

컨테이너(Container)

컨테이너

컨테이너란 애플리케이션과 애플리케이션을 구동하는 환경을, Host OS 로부터 격리한 공간을 의미합니다.

  • 이미지를 실행한 상태

  • 이미지로 여러개의 컨테이너를 만들 수 있다

  • 운영체제로 보면 이미지는 실행파일이고 컨테이너는 프로세스이다.

  • 격리된 공간에서 프로세스가 동작하는 기술

  • 컨테이너는 하나의 가상환경처럼 움직인다


Dockerfile

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여 이미지 생성 과정을 적습니다.

# Docker 환경 구성
FROM java:8

# 해당 이미지를 관리하는 사람
LABEL maintainer="park"

# 컨테이너가 필요한 데이터를 저장하는 곳
VOLUME /tmp

# 외부에 노출되는 포트 번호
EXPOSE 8080

# 현재 JAR 파일 변수 설정
ARG JAR_FILE=build/lib/*.jar

# app.jar의 이름으로 JAR 파일 추가
ADD ${JAR_FILE} app.jar

# 컨테이너 실행 시 실행될 명령어 "java -jar app.jar"
ENTRYPOINT ["java", "-jar", "app.jar"]

Docker Hub

도커 이미지의 용량은 보통 수백메가로 수기가가 넘는 경우도 흔합니다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해 줍니다. 하루에도 엄청난 용량의 이미지가 전세계에서 다운로드 되고 트래픽 비용만 해도 어마어마 할 것 같은데 그것이 다 무료이다.

Reference

  • [http://pyrasis.com/Docker/Docker-HOWTO]
  • [https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html]

0개의 댓글