이 글은 도커 공식문서를 번역한 글입니다. 오역이 존재할 수 있다는 점 참고 부탁드립니다.
공식문서 링크 : https://docs.docker.com/get-started/overview/
도커는 개발, 전송, 그리고 어플리케이션을 실행하기 위한 오픈 플랫폼이다. 도커는 어플리케이션을 인프라와 분리하므로써 소프트웨어를 더 빨리 전달할 수 있도록 한다. 도커와 함께라면, 어플리케이션을 관리하던 것과 동일한 방법으로 인프라를 관리할 수 있다. 코드를 빠르게 전송, 테스트, 배포하는 도커의 장점을 활용하면, 코드를 작성하고 배포환경에서 실제 실행하는 과정의 딜레이를 상당히 줄일 수 있다.
도커는 ‘컨테이너’라고 불리는 느슨하게 결합된 환경에서 어플리케이션을 패키징하고 실행시키는 능력을 제공한다. 결합성과 보안성은 여러 컨테이너를 주어진 호스트에서 동시에 실행시킬 수 있도록 한다.
컨테이너는 가볍고, 어플리케이션을 실행하기 위한 모든 것을 포함하고 있다. 따라서, 호스트에 현재 어떤 것이 설치되있는지 신경쓰지 않아도 된다. 도커를 사용한다면 일을 하는 중에 컨테이너를 쉽게 공유할 수 있다. 그리고 컨테이너를 공유하는 모든 사람들은 동일한 방식으로 동작하는 컨테이너를 얻을 것이다.
도커는 컨테이너의 생성주기를 관리할 수 있도록 도구와 플랫폼을 제공한다.
어플리케이션의 빠르고 일관된 배포
도커는 개발자가 어플리케이션 및 서비스를 제공하는 로컬 컨테이너를 사용하여, 표준화된 환경에서 작업할 수 있도록 함으로써 개발 생명주기를 간소화 한다. 컨테이너는 CI/CD workflow에 적합하다.
예시 시나리오
신속한 구현 및 확장
도커의 컨테이너 기반 플랫폼은 이동성이 높은 워크로드를 가능케 한다.도커 컨테이너는 개발자의 로컬 랩탑, 데이터 센터의 가상 머신, 클라우드 환경 등에서 실행될 수 있다.
동일한 하드웨어에서 더 많은 워크로드를 실행
도커는 가볍고 빠르다. 다시말해, 하이퍼바이저 기반 가상 머신에 대한 실행 가능하고 비용 효율적인 대안을 제공하므로, 비즈니스 목표를 달성하기 위해 서버 용량을 더 많이 사용할 수 있다. 도커는 더 적은 리소스로 더 많은 작업을 수행해야 하는 고밀도 환경과 중소규모 구축에 이상적이다.
도커는 클라이언트-서버
아키텍처를 사용한다. 도커 클라이언트
는 도커 데몬
과 대화한다. 도커 데몬은 도커 컨테이너를 만들고, 실행시키고, 분산시키는데 중요한 역할을 수행하는 녀석이다. 도커 컨테이너와 도커 데몬은 동일한 시스템에서 함께 실행될 수 있으며, 혹은 서로 다른 시스템에서 원격으로 연결될 수도 있다. 위 두 대상은 UNIX 소켓
또는 네트워크 인터페이스
위에서 REST API를 사용하여 통신한다. 또다른 도커 클라이언트로는 Docker compose
가 있으며, 컨테이너로 구성된 어플리케이션을 다룰 수 있도록 한다.
도커 데몬(dockerd
)은 도커 API 요청을 듣고 있으며, 이미지 or 컨테이너 or 네트워크 or 볼륨 과 같은 도커 오브젝트를 관리한다. 또한 데몬은 도커 서비스를 관리하기 위해 다른 데몬과 통신할 수 있다.
도커 클라이언트(docker
)는 많은 도커 사용자가 도커와 상호작용하기 위해 사용하는 방식이다. 만약 docker run
과 같은 명령어를 사용할 경우, 클라이언트는 해당 명령어를 dockerd
에게 전송하게 된다. 도커 데몬이 명령어를 위임받아 수행할 것이다. docker
명령어는 도커 API를 사용한다. 도커 클라이언트는 하나 이상의 데몬들과 통신할 수 있다.
도커 데스크탑은 Mac, Windows, Linux 환경에서 컨테이너화된 어플리케이션과 마이크로서비스를 생성하고 공유하도록 하는 ‘설치하기 쉬운’ 어플리케이션이다. 도커 데스크탑은 도커 데몬, 도커 클라이언트, 도커 컴포즈, 도커 컨텐트 트러스트, 쿠버네티스, 크레덴셜 헬퍼를 포함한다.
도커 레지스트리는 도커 이미지들을 저장한다. 도커 허브는 누구나 사용할 수 있는 public registry
이며, 도커는 기본적으로 도커 허브에서 이미지로서 찾아지도록 구성된다. 물론, private registry
를 실행 시킬 수도 있다.
docker pull
또는 docker run
명령어를 사용한다면, 요청된 이미지는 사전에 정의된 레지스트리 장소에 당겨질(갱신될) 것이다. docker push
를 사용한다면, 레지스트리에 도커 이미지가 push
될 것이다.
도커를 사용할 때, 당신은 이미지, 컨테이너, 네트워크, 볼륨, 플러그인,그리고 그외 다른 객체들을 생성하고 사용할 것이다. 이번 섹션은 그러한 객체에 관한 overview이다.
이미지는 도커 컨테이너를 생성하는 방법이 포함된 읽기 전용 템플리이다. 보통, 이미지는 다른 이미지를 기반으로 하며, 추가적인 커스텀 요소가 더해져 만들어 진다. 예를 들어, ubuntu
이미지를 기반으로한 이미지를 만들었지만, 아파치 웹 서버와 어플리케이션을 설치하고 어플리케이션의 실행을 위한 구성 세부 정보를 추가 설치할 수 있다.
당신은 당신만의 고유한 이미지를 만들거나, 다른 이들이 만들거나 레지스트리에 배포된 이미지만을 사용할 수 있다. 고유한 이미지를 만들기 위해서는, 이미지를 생성하고 실행시키기 위해 필요한 과정을 정의해 놓은 간단한 문법의 Dockerfile
을 만들어야 한다. Dockerfile
을 수정하거나 이미지를 재생성할 경우, 수정된 layers
만 재생성 될 것이다. 위와 같은 특징은 다른 가상화 기술과 비교했을 때, 이미지가 가볍고 and 작고 and 빠르게 하는 요인 중 하나이다.
컨테이너는 이미지의 실제 실행가능한 인스턴스이다. 도커 API or CLI를 사용하여 컨테이너를 생성, 시작, 정지, 이동, 삭제를 할 수 있다. 당신은 하나 이상의 네트워크와 컨테이너를 연결 시킬 수 있으며, 스토리지에 컨테이너를 부착할 수 있고, 심지어 현재 상태를 기반으로 새로운 이미지를 만들 수도 있다.
기본적으로, 컨테이너는 다른 컨테이너
와 컨테이너가 실행되는 호스트 머신
과 상대적으로 잘 고립되어있다. 당신은 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템과 얼마나 분리되어 있는지 제어할 수 있다.
컨테이너는 이미지뿐만 아니라 컨테이너를 생성하거나 시작할 때 제공하는 모든 구성 옵션에 의해 정의된다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태의 모든 변경 사항은 사라진다.
다음에 올 명령어는 ubuntu
컨테이너를 실행하고, 당신의 command-line session
과 양방형적으로 부착되며, /bin/bash
를 실행한다.
$ docker run -i -t ubuntu /bin/bash
위 명령어를 실행하면, 아래 사항들이 수행된다. (기본 레지스트리 설정을 사용한다고 가정한다.)
ubuntu
이미지가 없다면, 도커는 수동으로 docker pull ubuntu
를 실행한 것처럼 사전 정의된 레지스트리에서 이미지를 가져온다.docker container create
명령어를 실행한 것처럼 새로운 컨테이너를 만든다./bin/bash
를 실행한다. 컨테이너는 양방향으로 실행되고 있으며 당신의 터미널에 부착되기 때문에, 터미널에 출력문이 로깅되는 동안에 키보드를 사용하여 터미널에 입력을 수행할 수 있다.exit
명령어를 사용하여 /bin/bash
명령어를 종료하려고 한다면, 컨테이너는 정지되지만 삭제되지는 않는다. 다시 시작하거나 삭제할 수 있다.도커는 Go
언어로 만들어 졌다. 그리고 리눅스 커널의 여러 기능을 활용하여 기능을 제공한다. 도커는 namespace
라고 불리는 기술을 사용하여 컨테이너
라고 불리는 고립된 워크스페이스를 제공한다. 컨테이너를 실행하면, 도커는 해당 컨테이너에 대한 네임스페이스 집합을 만든다.
이 네임스페이스들은 고립층을 제공한다. 컨테이너의 각 측면은 분리된 네임스페이스에서 실행되며, 컨테이너에서의 접근은 컨테이네의 네임스페이스로 한정된다.