애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
Docker는 소프트웨어를 컨테이너
라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
=> 프로그램의 배포 관리 단순화
Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원한다.
대충 말하면, Docker는 컨테이너를 위한 운영 체제!
도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image
라 한다.
다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치 할 필요가 없는 상태의 파일을 의미한다.
1) 따라서 도커 이미지의 용량은 보통 수백MB~수GB
가 넘는다. 하지만 가상머신의 이미지에 비하면 굉장히 적은 용량이다.
2) 이미지는 상태 값을 가지지 않고 변하지 않는다(Immutable).
3) 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.
4) 도커 이미지들은 github와 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.
5) 다양한 API가 제공되어 원하는 만큼 자동화가 가능하다.
6) 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.(그래서 누구나 이미지 생성과정을 확인할 수 있으며 수정도 할 수 있다)
기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없다. 레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다.
ubuntu 이미지
가 A + B + C
의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지
는 A + B + C + nginx
가 된다. webapp 이미지를 nginx 이미지 기반
으로 만들었다면 예상대로 A + B + C + nginx + source
레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다. 가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계이다.
이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.
1) 컨테이너는 이미지 Layer에 읽기/쓰기(read-write) Layer를 추가하는 것으로 생성/실행된다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적음
2) 컨테이너는 종료되었다고 메모리에서 삭제되지않고 남아있다. 삭제하려면 명시적으로 삭제해야 한다. 즉, 종료가 되어도 컨테이너 & 읽기/쓰기 Layer 또한 그대로 존재하기 때문에 다시 시작할 수 있다.
3) 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것. 예) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻과 동일.
4) 한 서버는 여러 개의 컨테이너를 가져도 당연히 상관없으며, 컨테이너는 각각 독립적으로 실행된다.
5) 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유한다.
도커 이미지는 Docker hub
에 등록하거나 Docker Registry 저장소
를 직접 만들어 관리할 수 있다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이른다. 누구나 쉽게 이미지를 만들고 배포할 수 있다.
(약간 Git'hub'가 소스코드 pull하고 push하고 하는 것처럼 docker 'hub'에 올리고 이미지 pull해서 run해서 컨테이너로 실행할 수 있다!)
(이미지 출처: https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=30533)
어떠한 프로그램도 컨테이너로 만들 수 있다!
가상머신처럼 독립적으로 실행되지만, 가상머신보다 빠르고 쉽고 효율적이다.
도커는 가상머신이 아니고 격리만 해주기 떄문에 성능상 하락이 없다. (성능 하락이 큰 VM과 다르다.)
확장성과 이식성
표준성
이미지
설정관리
자원관리
Docker는 단일 컨테이너 관리에 적합하도록 만들어져 있다.
수백 개로 세분화된 컨테이너와 컨테이너화된 앱을 점점 더 많이 사용하기 시작하면 관리와 오케스트레이션이 매우 어려워질 수 있다.
결국 모든 컨테이너 전체에서 네트워킹, 보안, 텔레메트리와 같은 서비스를 제공하기 위해서는 컨테이너를 그룹화를 해야한다. =>쿠버네티스
사용
https://aws.amazon.com/ko/docker/
https://wooody92.github.io/docker/Docker-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/
https://dev-youngjun.tistory.com/2
https://hoon93.tistory.com/48
https://galid1.tistory.com/324