도커 개요
- 애플리케이션의 개발, 배포, 실행을 위한 오픈 플랫폼이다.
- 애플리케이션과 인프라를 분리하여 어느곳에서든 빠르게 애플리케이션을 실행할 수 있게 해준다.
- 코드를 작성하는 것과 실제로 프로덕션에서 애플리케이션을 구동하는 사이의 딜레이를 최소화해준다.
도커 플랫폼
애플리케이션을 패키징하고 느슨하게 분리된 환경인 컨테이너에서 구동시켜준다. 한 호스트에서 여러 개의 컨테이너를 실행시킬 수도 있다. 컨테이너는 실행에 필요한 모든 것을 포함하고 있어서 호스트에 무엇이 설치되었는지에 의존할 필요가 없다. 컨테이너는 쉽게 공유도 가능해서, 다른 동료와 같은 방식으로 동작하는 컨테이너를 쉽게 공유할 수 있다.
도커는 컨테이너의 라이프사이클을 관리할 수 있는 도구와 플랫폼을 제공한다.
- 컨테이너를 이용하여 컴포넌트와 애플리케이션을 개발한다.
- 컨테이너는 애플리케이션의 배포와 테스팅을 위한 구성 단위가 된다.
- 준비가 되면, 운영 환경에 컨테이너로 혹은 잘 구성된 서비스(orchestrated service)로 애플리케이션을 배포한다.
- 컨테이너로서의 애플리케이션은 운영 환경이 로컬 데이터 센터이든 클라우드 제공자이든 두개 하이브리드이든 항상 동일하게 동작한다.
도커로는 무엇을 할 수 있는가?
빠르고 일관된 배포를 제공한다.
개발자가 표준화된 환경에서 작업할 수 있도록 해준다. 컨테이너는 지속적 통합(CI)과 지속적 배포(CD)에 유리하다.
다음 시나리오를 살펴보자.
- 도커를 이용하는 개발 그룹에서 앱의 테스트를 수행한다.
- 앱의 수동 테스트 중 버그를 찾았다.
- 개발 그룹의 일원이 해당 버그를 고쳤다.
- 다시 테스트를 마쳤을 때, 버그의 수정사항을 반영하려면 업데이트된 이미지를 푸시하기만 하면 된다.
스케일링과 배포에 빠르게 대응할 수 있다.
도커에서 작업된 내용은 빠르게 반영이 가능하다. 도커 컨테이너는 개발자의 로컬 랩탑이나 데이터 센터의 물리, 가상 머신 혹은 클라우드 제공자에 상관없이 잘 작동한다.
도커의 이동성과 가벼움은 워크로드를 동적으로 관리하기 쉽게 만들어주며 스케일링 업다운을 편하게 만들어준다.
같은 하드웨어에서 더 많은 일을 하게 해준다.
가상 머신에 비교했을 때 하드웨어를 더 알뜰하게 사용할 수 있도록 만들어준다. 적은 리소스를 가진 컴퓨팅 환경에 배포를 해야할 경우, 도커가 좋은 선택이 될 수 있다.
도커 아키텍처
도커는 클라이언트 서버 아키텍처를 사용한다. 도커 클라이언트는 도커 데몬에게 명령을 전달한다. 도커 데몬은 빌드, 구동, 배포와 같은 무거운 작업을 수행한다. 도커 클라이언트와 데몬은 같은 시스템에서 동작할 수도 있고 도커 클라이언트를 원격 도커 데몬에 연결하여 사용할 수도 있다. 도커 클라이언트와 데몬은 REST API 를 이용해 UNIX 소켓 혹은 네트워크 인터페이스를 통해 통신한다. 도커 클라이언트인 Docker Compose 는 컨테이너의 집합으로 이루어진 애플리케이션 작업을 할 수 있게 해준다.
도커 데몬 (The Docker Deamon)
도커 데몬(dockerd
)은 API 요청을 받아들이고 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 오브젝트를 관리한다. 데몬은 도커 서비스를 관리하기 위해 다른 데몬과 소통할 수도 있다.
도커 클라이언트 (The Docker Client)
도커 클라이언트(docker
)는 사용자가 도커와 소통하기 위해 주로 사용하는 방법이다. docker run
과 같은 명령어를 사용할 때, 클라이언트는 명령어를 실제로 수행하는 dockerd
로 명령을 넘긴다. docker
명령어는 Docker API 를 사용한다. 도커 클라이언트는 1개 이상의 데몬과도 소통할 수 있다.
도커 데스크탑 (Docker Desktop)
컨테이너화된 애플리케이션과 마이크로 서비스를 빌드하고 공유할 수 있도록 해준다. 도커 데스크탑에는 Docker Deamon
, Docker Client
, Docker Compose
, Docker Content Trust
, Kubernetes
, Credential Helper
가 포함되어 있다.
도커 데스크탑 설명 웹사이트 에서 더 자세한 설명을 볼 수 있다.
도커 레지스트리 (Docker Registries)
도커 레지스트리는 도커 이미지를 보관한다. 도커 허브는 누구나 사용할 수 있는 Public registry 로 볼 수 있다. 도커는 기본값으로 도커 허브에서 이미지를 찾도록 설정되어 있다. 원한다면 Private registry 를 만들고 운영할 수 있다.
docker pull
, docker run
명령어를 사용할 때, 설정된 레지스트리에서 필요한 이미지를 끌어온다. docker push
명령어를 입력하면, 설정된 레지스트리에 이미지가 올라간다.
도커 오브젝트
도커를 이용할 때 이미지, 컨테이너, 네트워크, 볼륨, 플러그인과 다른 오브젝트를 만들고 사용한다. 이 섹션에서는 몇몇 오브젝트에 대한 간단한 개요만 알아본다.
이미지
도커 이미지는 도커 컨테이너를 만들기 위해 명령어를 가진 읽기 전용 템플릿이다. 많은 이미지는 다른 이미지 위에 몇몇 커스터마이징만을 더해서 만들어진다. 만일 내 앱이 설치된 우분투 이미지를 만들고 싶다면, 우분투 이미지에 앱을 설치하고 몇가지 설정만 더해서 이미지를 만들면 될 것이다.
레지스트리에 올라온 이미지를 그대로 사용하거나 자체적으로 이미지를 만들 수 있다. 이미지를 만들려면, 이미지를 만들고 구동하기 위한 몇가지 단계를 간단한 문법으로 정의하는 Dockerfile
을 작성하면 된다. 도커 파일을 변경하고 이미지를 다시 빌드할 때는 변경된 레이어만 다시 빌드된다. 이러한 이유 때문에 다른 가상화 기술과 비교했을 때 도커 이미지가 가볍고 작고 빠르다.
컨테이너
컨테이너는 이미지의 실행 가능한 인스턴스이다. 도커 API 혹은 CLI 를 이용하여 컨테이너를 만들고, 시작하고, 정지하고, 옮기고, 삭제할 수 있다. 컨테이너를 하나 혹은 그 이상의 네트워크에 연결할 수 있다. 또는 컨테이너에 저장소를 연결하거나 현재의 상태를 기반으로 하여 새로운 이미지를 만들어낼 수도 있다.
기본값으로, 컨테이너는 호스트 머신과 다른 컨테이너들과 상대적으로 잘 격리되어 있다. 컨테이너의 네트워크, 스토리지 혹은 호스트 머신이나 다른 컨테이너가 제공하는 서브 시스템들이 어떻게 격리될지 제어할 수도 있다.
컨테이너는 이미지와 만들거나 시작 시에 설정하는 옵션들에 의해 정의된다. 컨테이너가 지워지면, 컨테이너에 저장된 상태 값은 날아간다.
예시 docker run
명령어
아래의 명령어는 ubuntu
컨테이너를 실행한다. 로컬 커맨드라인 세션과 붙어 상호작용한다. 그리고 /bin/bash
를 실행한다.
$ docker run -i -t unbuntu /bin/bash
이 명령어를 실행하면, 아래와 같은 일이 일어난다. (이 경우 기본 레지스트리 설정값을 상정한다.)
- 로컬에서
ubuntu
이미지를 갖고 있지 않다면, 도커는docker pull ubuntu
를 수동으로 실행시킨 것처럼 설정된 레지스트리에서 이미지를 가져온다. docker container create
명령어를 수동으로 입력한 것처럼 도커는 새로운 컨테이너를 만든다.- 도커는 마지막 레이어로 읽기-쓰기 파일시스템을 할당한다. 동작하는 컨테이너가 로컬 파일시스템에서 파일과 디렉토리를 생성하거나 수정할 수 있도록 만들어준다.
- 네트워킹 옵션을 명시하지 않았다면, 도커는 기본 네트워크에 연결하기 위해 네트워크 인터페이스를 생성한다. 이는 컨테이너에 IP 주소를 할당하는 것을 포함한다. 기본 값으로, 컨테이너는 호스트 머신의 네트워크 커넥션을 이용하여 외부 네트워크에 연결할 수 있다.
- 도커는 컨테이너를 시작하고,
/bin/bash
명령어를 실행한다. 컨테이너는-i
와-t
옵션에 의해 터미널에 붙어서 상호작용하게 된다. 우리는 터미널을 통해 컨테이너에 명령어를 전송할 수도 있고 결과를 받아볼 수도 있다. /bin/bash
명령을 종료하기 위해exit
을 입력하면, 컨테이너는 멈추지만 제거되진 않는다. 컨테이너가 멈춘 이후에 컨테이너를 다시 실행할지 제거할지 결정할 수 있다.
기저에 깔린 기술들
도커는 Go 프로그래밍 언어 로 쓰여졌고, 기술을 제공하기 위해 리눅스 커널의 여러 기능을 가져다 썼다. 도커는 컨테이너라 불리는 고립된 워크스페이스를 제공하기 위해 namespaces
라 불리는 기술을 사용한다. 컨테이너를 실행할 때, 도커는 그 컨테이너를 위한 여러 네임스페이스를 만든다.
이러한 네임스페이스가 레이어간의 고립을 제공해준다. 컨테이너의 각각 다른 부분이 개별 네임스페이스에서 실행된다. 또한 접근 권한 자체도 해당 네임스페이스에 제한되어 있다.
다음으로 알아볼만한 것들
레퍼런스
'인프라 > 도커' 카테고리의 다른 글
하이퍼바이저 (Hypervisor) 란 무엇인가? (1) | 2024.02.04 |
---|---|
도커 실무 - Mariadb 를 사용하는 스프링부트 프로젝트 배포해보기 (0) | 2022.06.07 |
도커 명령어의 run -it 옵션은 어떤 의미일까? (0) | 2022.06.04 |
도커 자주 쓰이는 명령어 정리 (Docker Cheat Sheet) (0) | 2022.06.03 |
도커 (Docker) 가 무엇인지 알아보자. (0) | 2022.05.24 |