Windows에서 Docker Toolbox로 Docker 사용하기
[ google drive에서 복사 해 온거라 ;;; 이미지가 깨질 수 있습니다. ]
[ 바로 보기 : https://docs.google.com/document/d/1-yNddpgu71tbFaupqrOrQ23xv8SV_6Y_8OfokPuEQTk/edit?usp=sharing ]
Windows 에서
Docker Toolbox로 Docker 사용하기
작성자 : 조찬제 ( http://blog.ggaman.com )
작성일 : 2015년 11월 23일
Windows Docker Toolbox를 이용하여 Docker 환경 갖추기
Docker란?
- “도커” 라고 읽음
- Linux안에서 또 다른 Linux의 Isolate 한 환경을 만들어 줌
- Windows에서는? VirtualBox에 boot2docker 간단한 Linux 이미지를 올리고 거기에, 또 다른 Linux를 올려 줌
Docker .vs. VM
- VM : Linux 위에 가상화 환경을 처리한 Hypervisor가 뜨고, 그 위에 다시 Linux OS가 올라감
- Docker : Linux 위에 Docker Engine이 있고 그 위에 OS 없이 바로 파일이 올라감. ( 속도 빠름 )
Docker 이미지
- Linux(Host OS)위에 뜰 Linux File들의 집합
- 해당 Docker 이미지는 수정이 불가능 한 Read Only 상태이다.
- Docker 이미지를 이용하면, 똑같은 환경의 여러 Linux를 띄울 수 있다.
Docker 컨테이너
- Docker 이미지를 동작 시킨 Linux 상태 ( CentOS Docker 이미지의 복사본이 Ubuntu(Host OS)에 올라간 상태 )
- 실제 동작중인 Docker 컨테이너에 접속하여 파일을 추가하거나, 삭제, 서버 실행 등을 할 수 있다.
- Docker 컨테이너에서, Apache 서버를 띄우게 되면, 그 프로세스는 실제로는 Host OS의 자원을 사용하게 된다.
- Docker 컨테이너가 종료되면, Docker 컨테이너에서 실행되던 모든 프로세스가 죽는다.
- Docker 컨테이너가 종료된다고 해도, 편집된 파일들은 컨테이너에 그대로 유지 된다.
- 종료된 Docker 컨테이너를 살릴 수도 있다. 살린 후 접속해 보면, 편집된 파일들이 유지 됨을 알 수 있다.
- 다만, 이전에 실행되었던 모든 프로세스가 죽었으므로 다시 살려줘야 한다.
- 컨테이너가 다시 살아 날 때 기본적으로 수행해야 하는 명령어를 설정해 줄 수 있다.
- 이를 이용해 컨테이너가 뜨자마자 서버를 실행하는 등의 작업을 할 수 있다.
Windows 기준 Docker 환경 만들기 ( Mac 도 비슷할거라... )
가이드 문서 진행 기준
- Windows 7
- 가용 디스크 용량 50GByte 이상
Docker ToolBox
- Docker 사용시 필요한 이것저것이 모두 묶여 있음.
- Docker Toolbox(boot2docker, Kitematic)
- Oracle Virtual Box
- Git
다음의 경로에서 Docker Toolbox를 Windows용으로 다운로드 받아 설치한다.
https://www.docker.com/docker-toolbox
2015년 11월 23일 기준으로 DockerToolbox-1.9.0d.exe 다운로드를 할 수 있다.
설치 과정은 언제나처럼 OK와 Next를 연속해서 누르다가 Close 를 누르면 된다.
설치를 완료하면 아래와 같이 Quickstart Terminal 과 Kitematic을 실행할 수 있는 아이콘을 볼 수 있다.
혹시 설치를 하다가 실패하면, 시스템에 이미 설치 되어 있던, Virtual Box와 Git 등을 제거하고 다시 설치 시도해 본다.
Docker에서 사용할 VM을 만들기 전 할 일
Docker Toolbox의 제약 넘어서기
Docker를 실행할 수 있는 Terminal을 실행시키기 전에 몇가지 작업이 필요하다.
Docker를 동작시키기 위해 Docker Toolbox에서 만들어 주는 기본 VM의 Disk의 최대 용량이 약 10~18Gbyte 이기 때문에, Linux를 설치하고 HDCS등을 설치하면 용량이 부족해서 설치가 실패하는 경우가 있다. 또한 Docker용 VM Disk가 생성될 하드 디스크의 용량이 부족하면 실행시 문제가 될 수 있다.
그러므로 Docker를 동작시키기 위한 VM Disk의 위치와 용량을 변경할 필요가 있다. 여기서는 VM Disk가 생성될 하드 디스크의 위치를 "U:\_VM_\docker" 이라고 가정하고, 용량은 약 50GByte 를 잡는다고 가정하자.
Docker Toolbox 가 설치된 디렉토리로 이동해서 start.sh 파일을 문서 편집기로 수정해 준다.
start.sh 파일을 문서 편집기로 열고
DOCKER_MACHINE=./docker-machine.exe
를 찾아서 아래와 같이 두 줄로 수정한다. ( Windows 지만 경로가 / 로 구분 되는것에 주의하자. )
DOCKER_MACHINE_CMD=./docker-machine.exe
DOCKER_MACHINE="./docker-machine.exe -s U:/_VM_/docker/"
또한
if [ ! -f $DOCKER_MACHINE ] || [ ! -f "${VBOXMANAGE}" ]; then
를 찾아
if [ ! -f $DOCKER_MACHINE_CMD ] || [ ! -f "${VBOXMANAGE}" ]; then
로 수정한다.
이렇게 하면 Docker를 동작시키기 위한 VM Disk가 U:\_VM_\docker 에 disk.vmdk 파일이 생기고, 그 용량도 최대 약 50GByte까지 사용 가능해 준다. U:\_VM_\docker 디렉토리는 미리 만들어 두도록 하자.
이제 Docker 를 실행해 볼 수 있는 환경 준비가 끝났다.
Docker QuickStart Terminal을 실행 시키면 VirtualBox를 하나 띄우게 된다.
이후 조금 기다리면 아래와 같이 Docker Quick Terminal을 만날 수 있다.
여기서 뜨는 Linux 터미널은 사실상은 Windows 상에서 동작하는것이고, 단순히 Linux command를 사용할 수 있도록 되어 있는 터미널이다.
실제로 Docker 이미지가 올라갈 곳은 Virtual Box에 default 라는 VM에 올라 가게 된다. 궁금하다면 VirtualBox Manager UI를 띄워서 아래와 같이 확인할 수 있다.
이로써 docker를 실행 시킬 수 있는 기본 환경이 마련되었다.
Docker를 이용하여 Dockerfile 로 이미지 만들기 준비
Docker 이미지를 만들기 위한 준비
여기서는 CentOS 6.6과 Java(Oracle JDK)를 설정하는 것으로 진행하겠다.
로컬 컴퓨터에 적당한 디렉토리를 만들고, 아래의 경로에 접속하여 다음의 파일을 다운로드 받자.
https://drive.google.com/folderview?id=0B4JVe12NOkhxUk41RkV5aWVRVHc&usp=sharing
- Dockerfile ( Docker 자동 설치 스크립트 )
- jdk-7u80-linux-x64.rpm ( Oracle JDK )
여기서는 U:\docker 라는 디렉토리에 다운로드 받았다는 가정으로 진행된다.
위 파일을 받고 나면 아래와 같이 총 2개의 파일을 다운로드 받게 된다.
Docker 이미지 만들기
Docker Quick Terminal에서 Dockerfile이 있는 경로(u:\docker)로 이동하여 아래와 같은 명령을 내리면, Docker Image를 생성하게 된다.
docker build -t centos_oracle_java .
위 명령은 현재 디렉토리에 있는 Dockerfile 파일을 이용해서 centos_oracle_java라는 이름을 가지는 Docker Image를 생성하는 과정이다.
장비에 따라 다르겠지만, 3~5여분이 흐르면 CentOS와 Oracle Java가 설치 완료된 이미지를 생성하게 된다.
이미지가 제대로 생성되었는지 확인하기 위해 아래의 명령을 입력하여 확인하자.
docker images
centos_oracle_java는 이번에 우리가 만든 Docker 이미지이다. centos 이미지는 centos_oracle_java 이미지를 만들기 위한 기본 이미지이므로, 자동으로 받아 진 것이다. 즉, centos 이미지를 다운로드 받고, 그 이미지에다가 Oracle Java를 위한 이것 저것을 설치한 후, 그것들 다시 이미지로 만들어 둔 것이 centos_oracle_java이다. Dockerfile의 첫 번째 명령인 FROM 부분에서 centos 를 base 이미지로 사용한다고 적혀 있는 것을 발견할 수 있을 것이다.
Docker 컨테이너 만들기
이미지가 다 만들어 지고 나면, 8000 포트로 동작하는 서버를 위한 컨테이너를 만들어 보자.
docker run -i -t -p 8081:80 --name chat_server centos_oracle_java //bin/bash
위 명령은 centos_oracle_java 이미지를 이용하여 chat_server라는 이름을 가지는 컨테이너를 하나 만들게 된다.
chat_server 라는 이름을 가진 컨테이너에서 8081 포트를 Host OS에서 공개한 채로 서버가 뜰 것을이므로, 컨테이너 외부에서 접속할 포트와 컨테이너 내부 포트로 80을 연결하도록 설정하였다. 그러므로 컨테이너에 들어갈 프로그램을 작성 할 때엔 컨테이너 내부 포트인 80 포트를 기준으로 작성해야 한다.
컨테이너가 동작하고 난 직후에 자동으로 //bin/bash 명령이 수행되어 컨테이너 안에 shell로 접속할 수 있게 된다. ( 원래는 /bin/sh 처럼 제일 앞에 / 를 한개만 적어야 하나, Winodws에서 수행할 때에는 제일 앞에 / 를 두개 적어 줘야 한다. ) 컨테이너 안의 Shell로 잘 들어왔는지 확인하기 위해서 아래 명령을 쳐서 확인해 보도록 하자. Cent OS 정보를 볼 수 있을 것이다.
cat /etc/*release*
이제 컨테이너를 빠져 나오도록 하자.
exit
컨테이너에서 빠져 나오면 다시 Docker Quick Terminal 로 돌아 온 것을 알 수 있다.
Docker 컨테이너 상태 확인하기
docker 컨테이너 목록을 보고 싶다면 다음의 명령어로 확인 할 수 있다.
docker ps -a
출력은 다음을 뜻한다.
- 컨테이너 ID는 9d77b23c2910 이다.
- 컨테이너는 centos_oracle_java라는 이미지를 바탕으로 생성된 것이다.
- 컨테이너가 뜰 때 수행된 명령은 //bin/bash 이다.
- 컨테이너가 만들어 진지 7분 정도 지났다.
- 컨테이너가 2분전에 종료되었다.
- 현재 할당된 포트는 없다.
 - 컨테이너 ID가 너무 어려워서  우리가 chat_server 라는 이름을 주었다.
우리가 이전에 아래와 같은 명령을 내려서 Docker 컨테이너를 띄웠다.
docker run -d -p 8081:80 --name chat_server centos_oracle_java //bin/bash
하지만, 현재 docker 컨테이너의 상태를 확인해 본 결과 port 할당이 하나도 이루어져 있다는것을 알 수 있다. 이는 docker 컨테이너가 내려 갔기 때문에 더 이상 Host OS의 port를 mapping 하지 않게 되었기 때문에 없는 것이다.
Docker 컨테이너 살리기/죽이기/없애기
죽었던 chat_server 컨테이너를 살려 보도록 하자.
docker start chat_server
이후 docker ps -a 를 통해서 chat_server 컨테이너가 동작 중인지 확인해 보자.
그 결과 STATUS 부분에서 “Up” 이라고 적혀 있으면 컨테이너가 실행 중인 것이다.
하지만, 이상하게도 이전과는 달리 chat_server 컨테이너에 shell로 들어 간 것이 아니고, Docker Quick Terminal로 빠져 나와 있다. 또한, 빠져 나와 있는데도 chat_server 컨테이너가 죽지 않고 살아 있다는것을 알 수 있다.
여기에 대한 설명은 어려운데, 간단히 설명하면, 컨테이너는 실행 할 때 수행한 명령의 process가 종료되지 않으면 컨테이너를 살려두고, process가 종료되면 컨테이너도 같이 종료시키게 된다. 우리가 chat_server를 실행시킬 때 내부적으로 //bin/bash를 실행 시키고, 그냥 나왔기 때문에 컨테이너 안에서는 여전히 //bin/bash process가 살아 있어서 컨테이너가 종료되지 않고 살아 있는 것이다.
만약 컨테이너를 죽이고 싶다면 아래의 명령을 이용할 수 있다.
docker stop chat_server
그렇다면 컨테이너를 띄운 상태에서 shell로 접근하고 싶을때는 어떻게 해야 할까? 두가지 방법이 있다.
- 새로운 컨테이너를 만들면서 shell로 접속하기 
- 이미 만들어진 컨테이너에 shell로 접속하기 
- 만들어져는 있지만 죽은 컨테이너를 띄우면서 shell로 접속하기 
- 이미 띄워진 컨테이너에 shell로 접속하기 
1의 방법인 컨테이너를 띄우면서 shell로 접속하기는 이전에 chat_server 컨테이너를 띄울 때 사용했던 방법과 동일하다.
docker run -i -t -p 8081:80 --name chat_server centos_oracle_java //bin/bash
2.a의 방법은, 우선 chat_server 컨테이너를 띄운 뒤에 2.b 방식을 따라하면 된다.
docker start chat_server
2.b 방식은, 이미 떠 있는 chat_sever 컨테이너에 명령을 수행하고, 그 명령의 입력과 출력을 주고 받을 수 있도록 설정하면 된다. 아래의 명령으로 shell에 접속 할 수 있게 된다.
docker exec -i -t chat_server //bin/bash
-i 과 -t 옵션을 주어야만 //bin/bash 명령을 컨테이너와 주고 받을 수 있다.
chat_server 컨테이너가 더 이상 필요 없다면 삭제를 하면 된다. 만약 삭제하고자 하는 컨테이너가 실행중이라면 먼저 docker stop 으로 멈추고 아래 명령을 이용하면 삭제 할 수 있다.
docker rm chat_server
다시, centos_oracle_java 이미지에서 chat_server2 라는 컨테이너를 만들면, 완전 clean 한 상태로 새로운 컨테이너를 만들 수 있다. 만약 chat_server 에 이것저것 작업하다가 환경이 잘 못 된 경우, 이런 방식으로 쉽게 clean 한 환경을 만들 수 있는 장점이 있다.
새로운 chat_server2 컨테이너를 만들고 shell로 접근해 보자. 아래의 명령을 이용하도록 하자.
docker run -i -t -p 8081:80 --name chat_server2 centos_oracle_java //bin/bash
컨테이너의 shell에 접근한 상태에서 exit 명령으로 shell을 종료하게 되면, 컨테이너 역시 종료 된다. 그렇다면 컨테이너를 종료 시키지 않은 상태에서, Docker Quick Terminal로 나갈려면 어떻게 해야 할까? 아래의 키 조합을 순차적으로 누르면 된다.
^P ^Q ( Control + P, Control + Q )
 
docker ps -a 명령으로 확인해 보면 chat_server2가 종료되지 않고 실행 중인 것으로 발견할 수 있다.
Docker Toolbox 지우기
0. VirtualBox 에 떠 있는 모든 VM 들 내리기
1. 제어판 -> 프로그램 제거 -> Oracle VirtualBox ( Virtual Box를 사용한다면 그냥 둬도 된다. )
2. 제어판 -> 프로그램 제거 -> Docker Tool box
3. 제어판 -> 프로그램 제거 -> Git ( Git 을 사용한다면 그냥 둬도 된다. )
3. c:\Users\사용자명\.boot2docker 삭제
4. c:\Users\사용자명\.docker 삭제