Docker
등장 배경
- 하나의 서버에 여러 개의 프로그램 설치하는 것도 문제
- 서로 사용하는 라이브러리의 버전이 다르거나 동일한 포트를 사용하는 경우는 설치가 매우 까다로움
- 차라리 서로 다른 서버에 설치하는게 편함 → 자원 낭비
- DevOps의 등장으로 개발주기가 짧아지고 배포는 더 자주 이뤄진다.
- 마이크로서비스 아키텍쳐가 유행하면서 프로그램이 더 잘게 쪼개져 관리가 복잡해짐
- 도커 등장으로 편해짐
도커란?
- 컨테이너 기반의 오픈소스 가상화 플랫폼
- 각 컨테이너 안에는 옷, 신발, 과일 등 다양한 화물 넣을 수 있고 규격화되어 컨테이너선이나 트레일러 등 다양한 운송수단으로 쉽게 운송 가능
- 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공해 프로그램의 배포 및 관리를 단순하게 해줌
- Backend 프로그램, DB 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화 가능
컨테이너
- 컨테이너: 격리된 공간에서 프로세스가 동작하는 기술
- 기존의 가상화 방식은 주로 OS를 가상화
- 호스트 OS 위에 게스트 OS 전체를 가상화해 사용
- 사용법이 간단하지만 무겁고 느려서 사용 어려움
- 성능 문제를 개선하기 위해 프로세스를 격리하는 방식 등장
- 단순히 프로세스를 격리시키기 때문에 가볍고 빠르게 동작
- cpu나 메모리를 프로세스가 필요한 만큼만 추가로 사용
- 하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행
이미지
- 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것
- 상태값을 갖지 않고 변하지 않음(immutable)
- 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있음
- 컨테이너의 상태가 바뀌거나 삭제돼도 이미지는 변하지 않음
- 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성하면 됨
- 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리 가능
- 이미지는 url 방식으로 관리하며 태그 붙이기 가능
docker.io/library/ubuntu:14.04
형태로 사용
docker.io/library
를 생략하고 ubuntu:14.04
로 사용 가능
- 이미지 생성을 위해
Dockerfile
이라는 파일에 자체 DSL 언어를 이용해 이미지 생성 과정 적음
레이어
- 이미지는 컨테이너를 실행하기 위한 모든 정보를 갖고 있어 용량이 크다.
- 기존 이미지에 파일 하나 추가했다고 이만큼의 용량을 다시 다운 받는다면 매우 비효율적
- 이를 해결하기 위해 레이어 개념 사용
- 이미지는 여러 개의 읽기 전용 레이어로 구성
- 파일이 추가되거나 수정되면 새로운 레이어 생성
- ex) [ubuntu 이미지] = A+B+C, [ubuntu 기반 nginx 이미지] = A+B+C+nginx
- 컨테이너 생성 시에도 레이어 방식 사용
- 기존 이미지 레이어 위에 읽기/쓰기 레이어 추가
- 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장
- 매우 효율적인 설계 방법
설치
- 도커는 리눅스 컨테이너 기술이므로 macOS나 windows에 설치할 경우 가상머신에 설치
Linux
curl -fsSL https://get.docker.com/ | sudo sh
Mac/Windows
- Docker for mac 또는 Docker for windows 설치
- 파일을 다운받고 설치
- 실제로는 가상머신에 설치 됨
- 가상머신을 사용한다는 느낌이 안들게 신경써서 설계
Reference
- 초보를 위한 도커 안내서 - 도커란 무엇인가?
- 초보를 위한 도커 안내서 - 설치하고 컨테이너 실행하기