도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 소프트웨어를 컨테이너라는 표준화는 유닛으로 패키징하며, 컨테이너는 코드, 시스템 도구, 라이브러리 등 애플리케이션을 실행하는데 필요한 모든 것이 포함되어 있다.
즉, 도커는 컨테이너 환경에서 독립적으로 애플리케이션을 실행할 수 있도록 컨테이너를 만들고 관리하는 것을 도와주는 도구이다. 도커를 통해 애플리케이션을 실행하면 독립적인 환경에서 일관된 결과를 보장한다. 도커의 핵심 개념은 이미지와 컨테이너다. 먼저 컨테이너에 대해 알아보자.
컨테이너는 격리 된 공간에서 프로세스가 동작하는 기술이다. 기존의 가상화 방식인 OS를 가상화하는게 아닌 프로세스를 격리하는 방식으로 동작한다. 리눅스에서 프로세스를 격리하는 방식을 리눅스 컨테이너라고 한다. 단순히 프로세스를 격리하기 때문에 가볍고 빠르다. 또한 CPU나 메모리는 프로세스가 필요한 만큼한 추가로 사용하고 성능적으로도 거의 손실이 없다.
아래 그림은 도커(왼쪽)와 기존의 가상화 방식(오른쪽)을 나타낸 것이다.

( 출처 : https://www.docker.com/resources/what-container )
컨테이너는 다음과 같은 특징이 있다.
apt-get 이나 yum으로 패키지를 설치 할 수 있고 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있다.이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는것으로 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.
도커 이미지는 Docker Hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.
이미지는 다음과 같은 특징이 있다.
도커는 완전히 새로운 기술은 아니며 이미 존재하는 기술을 잘 포장했다고 볼 수 있다.
컨테이너, 오버레이 네트워크, 유니온 파일 시스템 등 이미 존재하는 기술을 도커처럼 잘 조합하고 사용하기 쉽게 만든 것은 없었고 사용자들이 원하는 기능을 간단하지만 획기적인 아이디어로 구현하였다.

( 출처 : https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)
도커 이미지는 보통 용량이 수백 MB ~ 수 GB이다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나를 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없다.
도커는 이런 문제를 해결하기 위해 "레이어" 라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다. 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.
위 그림에서 ubuntu 이미지가 A + B + C 의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx가 된다.
web app 이미지를 ngnix 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A + B + C + nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 이미지를 효율적으로 관리할 수 있다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소환의 용량만 사용한다.
도커 이미지를 만들기 위해 Dockerfile이라는 파일에 DSL(Domain Specific Language) 언어를 이용해 이미지를 생성할 수 있다. 단순 텍스트 파일로 일반적으로 소스와 함께 관리한다. 서버에서 프로그램을 설치하려고 할 때 Dockerfile을 통하여 관리하면 된다. Dockerfile에서 사용할 수 있는 키워드는 20개 정도 있다. 여기서 중요한 건 FROM과 RUN이다. FROM과 RUN으로 이미지를 만들 수 있다.
FROM <image>:<tag>
FROM ubuntu:16.04
베이스 이미지를 지정한다. 반드시 베이스 이미지를 지정해야 하며 어떠한 이미지도 베이스 이미지가 될 수 있다. tag는 버전을 지정하는 것으로 가능하면 구체적인 버전을 지정하는 것이 좋다.
RUN <command>
RUN bundle install
가장 많이 사용하는 구문 중 하나로 말 그대로 명령어를 실행한다.
도커를 실행하는 명령어는 다음과 같다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
자주 사용하는 옵션

run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고, 없다면 이미지를 다운받은 후 컨테이너를 생성하고 시작 한다.
docker run --rm -it ubuntu:16.04 /bin/bash
-it 옵션 : 컨테이너 내부에 들어가기 위해 뒤에 /bin/bash 를 붙이고 키보드 입력을 위해 -it 옵션을 준다--rm 옵션 : 프로세스가 종료되면 컨테이너를 자동으로 삭제한다.컨테이너 목록을 확인하는 명령은 다음과 같다.
docker ps [OPTIONS]
ps 명령어는 실행 중인 컨테이너 목록을 보여준다.-a 옵션은 종료된 컨테이너까지 목록으로 보여준다. 컨테이너는 종료되어도 삭제되지 않고 남아있다.실행 중인 컨테이너를 중지하는 명령어, 실행 중인 컨테이너를 하나 이상 중지할 수 있다.
docker stop [OPTIONS] CONTAINER [CONTAINER...]
종료된 컨테이너를 제거하는 명령어, 종료된 컨테이너를 하나 이상 삭제 할 수 있다.
docker rm [OPTIONS] CONTAINER [CONTAINER...]
컨테이너가 정상적으로 동작하는지 가장 좋은 방법이다.
docker logs [OPTIONS] CONTAINER
--tail 마지막 줄부터 몇 줄을 출력할지 설정할 수 있다. ( ex, --tail 10)-f 실시간으로 생성되는 로그를 볼 수 있다.실행중인 컨테이너에 들어가보거나 컨테이너 파일을 실행하고 싶을때 사용한다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG..]
도커가 다운로드한 이미지 목록을 보는 명령어
docker images [OPTIONS] [REPOSITORY[:TAG]]
이미지를 다운로드 하는 명령어
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
run 명령어를 입력하면 이미지가 없을 때 자동으로 이미지를 다운받는다. pull 명령어는 최신 버전을 다운로드 할 경우 사용한다.
이미지를 삭제하는 명령어
docker rmi [OPTIONS] IMAGE [IMAGE...]