docker-Get started 공식 도큐먼트를 번역하고 정리합니다.
❗️ Docker
어플리케이션을 개발하고 제공하고 실행하기 위한 오픈 플랫폼.
Docker를 사용하면...
dockerd
커맨드)라고 불리는 장기 실행 프로그램 타입docker
커맨드) dockerd
docker
docker
명령은 Docker API를 사용한다.docker run
과 같은 명령을 사용하면 client가 이 명령을 dockerd
(Docker daemon)에 전송하여 실행한다.❗️ Docker Client와 Docker Daemon 🤔
- Docker Client는 Docker Container를 빌드, 실행, 배포하는 등의 무거운 작업을 수행하는 Docker Daemon과 통신한다.
- Docker Client와 Docker Daemon은 동일한 시스템에서 실행될 수 있으며, Docker Client를 원격 Docker Daemon에 연결하는 것도 가능하다.
- Docker Client와 Docker Daemon은 UNIX socket 혹은 Network Interface를 통해 REST API를 사용하여 통신한다.
docker pull
또는 docker run
커맨드를 사용하면 구성된 레지스트리에서 필수 이미지를 가져온다.docker push
커맨드를 사용하면 이미지가 구성된 레지스트리로 푸시된다.Image : Docker Container를 만들기 위한 읽기 전용 템플릿
이미지는 몇 가지의 추가적인 사용자 정의와 함께 다른 이미지를 기반으로 한다.
타인이 말들어서 레지스트리에 게시한 이미지를 사용하거나, 직접 이미지를 만들 수 있다. 고유한 이미지를 빌드하기 위해서는 Dockerfile을 이용하여 이미지를 만들고 실행하는데 필요한 단계를 정의해야한다.
Dockerfile의 각 명령어는 이미지에 레이어를 만든다.
Dockerfile을 변경하고 이미지를 재빌드하면 변경된 레이어만 다시 빌드된다. 이는 다른 가상화 기술과 비교하였을 때 이미지를 매우 가볍고, 작고, 빠르게 만들 수 있음을 의미한다.
Container : 이미지의 실행 가능한 인스턴스
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동, 삭제 할 수 있다. 컨테이너는 하나 이상의 네트워크에 연결하거나 스토리지 연결하는 것도 가능하며 현재 상태를 기반으로 새로운 이미지를 만들 수도 있다.
컨테이너는 이미지 및 사용자가 생성 혹은 시작할 때 제공하는 구성 옵션에 의해 정의된다.
👉 Example
$ docker run -i -t ubuntu /bin/bash
ubuntu
이미지가 없으면 Docker는 docker pull ubuntu
를 수동으로 실행 한 것처럼 구성된 레지스트리에서 이미지를 가져온다.docker container create
명령을 수동으로 실행 한 것처럼 새 컨테이너를 생성한다./bin/bash
를 실행한다. 컨테이너가 대화형으로 실행되고 터미너에 연결(-i
, -t
플래그로 인해)되어 있으므로, 출력이 터미널에 기록되는 동안 키보드를 사용해 입력을 제공 할 수 있다./bin/bash
종료하기 위해 exit
커맨드를 입력하면 컨테이너는 중지되지만 제거되지는 않는다. 따라서 이를 수동으로 재시작하거나 제거 할 수 있다.Service : 여러 manager와 worker가 swarm으로써 함께 작업하여 여러 Docker Daemon에 걸쳐 Container를 확장 할 수 있다.
swarm의 각 구성원은 Docker Daemon이며 모든 Docker Daemon은 Docker API를 사용하여 통신한다.
서비스를 사용하면 원하는 상태를 정의 할 수 있다. (이를테면, 주어진 시간에 사용 가능한 서비스 복제본 수와 같은 것들이 있다.)
기본적으로 서비스는 모든 worker node에서 로드 밸런싱된다.
consumer에게 Docker 서비스는 단일 애플리케이션으로 보인다.
Docker | VM |
---|---|
❗️ VM(Virtual Machine)
hypervisor를 통해 호스트 리소스에 가상으로 엑세스 가능한 "Guest" 운영 체제를 실행한다. 일반적으로 VM은 어플리케이션 로직에서 소비하는 것보다 많은 오버 헤드를 발행시킨다.
컨테이너의 이점
Docker Image는 컨테이너화된 프로세스가 실행될 private filesystem을 캡처하므로 어플리케이션을 실행하는데 필요한 것만 포함하는 이미지를 만들어야한다.
docker build --tag ${image_name}:${image_version} ${Dockerfile}
docker image ls
로 확인docker run --publish ${host_port}:${container_port} --detach --name ${container_name} ${image_name}:${image_version}
--publish
: ${host_port}
에서 들어오는 트래픽을 ${container_port}
로 전달하도록 요청한다. 컨테이너에는 자체 전용 포트 집합이 있으므로 네트워크로부터 도달하기 위해선 이런 방식으로 트래픽을 전달해야한다. 그렇지 않으면 방화벽에 의해 모든 네트워크 트래픽이 컨테이너에 도달하지 못하도록 차단된다.--detach
: Docker에게 백그라운드에서 컨테이너를 실행하도록 요청한다.--name
: 컨테이너를 참조 할 수 있는 이름을 지정한다.docker rm --force ${container_name}
--force
: 실행중인 컨테이너 중지 (docker stop ${container_name}
)