Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 오픈소스 소프트웨어 플랫폼이다. 리눅스기반의 가상화기술
에서 출발한 기술이다.
Docker는 소프트웨어를 컨테이너
라는 공간에서 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 ❗격리
해서 실행해준다.
최근 클라우드로의 최신 웹확장, MSA도입 등 이런 환경에서 꼭 필요한 기술로 각광받고 있다.
Docker에서 가장 중요한 용어가 두개가 있다. 바로, 컨테이너
, 이미지
이다.
그리고 docker는 컨테이너인데 이게 ❗❗프로세스
라고 생각하면 된다.
Docker 컨테이너가 프로세스인가? 라는 것에 다음 블로그에 참고하면 좋겠다.
Dokcer를 더 자세히 이해하기 위해서는 그 전 가상화기술
을 봐야한다.
여기서 기존에 사용하던 VM기술과 Docker를 비교해서 파악해볼 필요가 있다.
Docker 이전 기술은 VM과 같은 가상화기술이었다.
서버 관리자 입장에서는 CPU사용률이 10%대 밖에 되지 않는 활용도가 낮은 서버들의 리소스 낭비들이 눈에 가시였을 것이다. 그렇다고 모든 서비스를 한 서버안에 올린다면 안정성에 문제가 생길수도 있다.
그래서 안정성을 높이며 리소스도 최대한 활용할 수 있는 방법으로 나타난게 서버 가상화이다.
모두가 아는 대표적인 가상화 플랫폼으로는 VM이 있다. VM은 누구나 아는 OS가상화프로그램이다.
VM같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진
그리고 그 위에 Guest OS
를 올려 사용한다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방하다.
OS 가상화를 보면 Host OS와 완전히 분리되는 장점은 있지만 OS위에 또 가상의 OS를 올리기 때문에 무겁고 느릴수 밖에 없다.
프로세스 격리가 되지 않은 가상화기술에 비해,
Docker는 컨테이너라는 프로세스를 격리시켜 동작하는 방식으로 한다.
컨테이너 기반 가상화는 리눅스가 설치된 Host OS 위에 Docker 엔진
를 사용하고 Application 실행에 필요한 바이너리만 올라가게 된다.
Docker를 쓰는 가장 큰이유는 성능향상(프로세스로 돌아가기 때문에, 프로세스가 필요한 만큼의 자원을 사용하고, 성능또한 손실이 거의 없으니까), 뛰어난 이식성(Dockerfile로 image만 run하면 돼), 쉽게 Scale Out을 할 수 있는 유연성(이건 docker-compose? or k8s까지 얘기할수 있어!)때문이다.
이 컨테이너 실행에 필요한 파일과 설정값들을 포함하는 것이 Docker image
이다.
결론적으로,
Docker를 사용하면, 간단하게 소프트웨어를 패키징하여 규격화하면서 OS에 독립적으로 배치가 가능하기에,
Docker를 서버 리소스 낭비를 줄이면서 이용하면서 프로그램 설치를 간편하게 할 수 있는 것이다.
Docker를 사용할려면 일단 Docker hub
를 이용해야 한다.
Docker Hub에서는 이미지를 저장하고 관리해준다.
위에서도 많은 회사들이 Docker로 소프트웨어를 배포하기 시작했고 레지스트리라는 저장소에 이미지들을 공유할 수도 있다. Docker Hub를 이용하면 손쉽게 image를 pull 받아 컨테이너에 적용 시킬 수 있는 것이다. (GitHub와 동일하게 생각해도 무관하다)
Docker Image들을 저장하고 배포하는 Docker Hub는 정말 잘 활성화 되어 있다. 이미 여러 회사들은 소프트웨어를 Docker Hub를 통해 배포하기 시작했고 사용자는 Docker hub에서 image를 pull하여 간단하게 컨테이너에 넣어 사용하면 된다.
하지만 이는 무엇인가 부족해 보일 수 있다. 만약 배포판 보다 더욱 보완하고 싶다면? 그럴때 사용 할 수 있는 것이 Dockerfile
이다.
Dockerfile 예시
# redHat 계열
FROM jdk8:latest
WORKDIR /app
RUN mkdir /app/nexus-2.14.9-01
RUN mkdir /app/sonatype-work
RUN yum -y install httpd
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.
EXPOSE 3411
ADD run.sh /app/
CMD ["/app/run.sh"]
Docker File은 다음과 같이 작성된다. 많은 명령어가 있고 이미지 생성에 있어 다양한 설정을 줄 수 있지만 이는 Docker 튜토리얼에서 잘 나와있으니 참고하길 바란다.