도커 사용법

윈도우에서 텐서플로우를 사용하는 과정에서 도커에 대해 배울 수 있었다.
이렇게 좋은 게 있었는데.., 이걸 모르고 살았다니..
설치 과정에 답답했던 몇 가지만 기록한다.

1. 도커 설치
도커 툴박스와 도커포윈도우 중에서 선택할 수 있다.
윈도우 10 이상의 최신 버전이라면 도커포윈도우를 쓰는 것이 낫다. 
도커 툴박스와 도커포윈도우 설치는 윈도우에서 텐서플로우 설치하기를 클릭하면 볼 수 있다.

Docker Quickstart Terminal 메뉴는 도커 툴박스를 설치하면 시작 메뉴에서 확인할 수 있다.
도커포윈도우 설치하고 이거 찾는다고 난리를 쳤다.

이 문서에서는 도커포윈도우만 다루고 있다. 도커 툴박스에 대한 정리는 아래 링크에서 확인할 수 있다.
Docker Machine을 이용하여 Mac에서 docker 운영하기

2. 도커 버전 확인
버전을 확인하는 명령으로 -v 또는 --version을 사용할 수 있다.

  docker -v

3. vm 생성
이 부분에서 에러가 발생했는데, 해결할 생각이 없어서 해결책은 모른다.
docker-machine 명령으로 가상 머신을 생성할 수 있는데, 이게 도커 이미지와 같은 역할을 한다.
성공적으로 생성하면 이 안에서 필요한 작업을 수행할 수 있다.

주의할 점은 도커포윈도우는 가상 머신이 아니라 Hyper-V를 사용하기 때문에
virtual-machine 대신 hyperv 옵션을 사용해야 한다.
검색해서 자신에게 어떤 게 맞는지 제대로 판단해서 사용하도록 하자.
나는 hyperv로 잘 했는데, 에러가 발생했다. 구글링을 해도 답이 없어서 그만 뒀다.
그리고, 이렇게 직접 만드는 것보다 다른 사람이 만든 것을 쓰는 게 훨씬 쉽다.
이미 다 만들어 놨다.

4. 도커 허브(Docker Hub)
사용자가 만들어서 올린 도커 이미지를 모아 놓은 곳이다. (https://hub.docker.com)

tensorflow라고 검색했더니 나타난 화면이다.
텐서플로우가 우분투에서 잘 돈다고 해서 ubuntu로도 검색을 해서 이미지를 받았다.

오른쪽 끝에 있는 DETAILS 버튼을 누르면 도커 명령이 있는 페이지가 나타난다.
이 명령을 복사해서 콘솔에 붙여 넣고 엔터를 누르면 설치한 리눅스를 바로 사용할 수 있다.

  docker run -it -p 8888:8888 tensorflow/tensorflow

가령, 위와 같은 명령이 DETAILS 페이지에 명시되어 있다.

5. 도커 이미지 사용
이미지 설치가 끝나면 자동으로 해당 이미지로 들어간다. 리눅스 콘솔이 나타난다.
빠져나올 때는 exit이라고 입력한다.

이미지를 사용할 때는 run 명령을 사용한다. 처음에만 한 번 사용하면 된다.
설치 이후에는 run 대신 start와 attach 옵션을 사용한다.

  docker run -it ubuntu bash

우분투의 경우에는 아래처럼 오른쪽에 bash라고 명시하면 된다.
도커 콘솔에 붙여 넣을 때, 붙여넣기가 안 된다. 이때 붙여넣은 다음에 마우스 오른쪽 버튼 누르면 된다.
이게 왜 그런 방식으로 동작하는지는 모른다. 그냥 됐다.

6. 도커 명령어
여러 개의 이미지를 사용하고 IPython Notebook을 사용하다 보면 에러가 많이 발생한다.
에러를 해결할 수 있는 기본 명령어만 정리한다.
명령어에 대한 자세한 설명은 Docker 치트 시트를 참고한다. 


docker images
설치된 모든 이미지 목록을 나열한다.
이미지 크기도 함께 나타나는데, 생각보다 크기가 크다. 필요없는 것은 지우자.
함께 표시되는 이미지 이름(REPOSITORY)은 매우 중요하다.
run 명령으로 이미지를 실행시킬 때 사용하는 이름이다.

docker rmi "이미지 이름"
설치한 이미지를 삭제한다.

docker run "이미지 이름"
도커 이미지를 사용해서 컨테이너를 생성한다.
컨테이너에서 작업한 내용은 컨테이너를 삭제하기 전까지 보존된다.
exit 명령으로 컨테이너에서 빠져나올 경우, 컨테이너는 삭제되는 것이 아니라 동작을 멈추는 것이다.


docker ps -s
삭제되지 않은 컨테이너의 목록을 보여준다.
이 안에는 현재 동작 중인 것도 있고, 동작을 멈추고 sleep 상태에 있는 것도 있다.

docker ps -a -f status=running
실행 중인 컨테이너만 보여준다.
이미지는 서버에서 가져온 것. 여기에 여러분이 무언가 추가하기 때문에 컨테이너가 된다.
우리처럼 느슨하게 사용한다면, 이 명령을 실행했을 때 아무 것도 나오지 않아야 한다.

docker stop "컨테이너 ID 또는 이름"
실행 중인 컨테이너를 종료시킨다. 컨테이너 ID와 이름은 ps 명령으로 알 수 있다.
앞의 명령으로 확인한 다음 stop 명령을 사용한다.

docker start "컨테이너 ID 또는 이름"
exit 명령으로 빠져나온 컨테이너를 다시 구동시킨다.
외부에서 멈출 때는 stop을 사용하지만, exit으로 종료하는 순간 멈추게 된다.
run 명령은 매번 새로운 컨테이너를 생성하기 때문에
이전에 작업했던 결과를 가져올 수 없다. run은 한 번만 실행하고, 항상 start를 사용해야 한다.

docker attach "컨테이너 ID 또는 이름"
구동을 시작한 컨테이너에 합류한다.
start 명령을 호출했다고 해서 바로 컨테이너에 입장할 수는 없다.

docker rm "컨테이너 ID 또는 이름" 
멈춰 있거나 동작 중인 컨테이너를 삭제한다.
도커 이미지 위에 우리가 작업한 내용이 컨테이너에 포함되어 있는데, 모두 삭제된다.

7. 파일 복사
리눅스가 일반 사용자한테 어렵게 느껴지는 것은
그래픽 환경이 일반적이지 않아서라고 생각하는 1인이다.
고수라고 하는 사람들은 항상 검정 콘솔 화면에서 일하는 것을 선호하고 그것을 최고라 칭한다.

윈도우에서 작업한 파일을 도커의 컨테이너로 전달하거나 그 반대가 가능하다.
이걸 알고는 얼마나 기뻤던지..

  docker cp test.py ubuntu:/sample.py
  docker cp ubuntu:/sample.py test.py

도커의 cp 명령으로 두 가지를 할 수 있다.
첫 번째 줄은 윈도우의 test.py 파일을 ubuntu 컨테이너의 루트(/)에 sample.py로 복사한다.
두 번째 줄은 컨테이너의 파일을 윈도우로 복사한다.
만약에 루트 아래 있는 Home 폴더에 snu라는 폴더에 복사를 한다면..

  docker cp test.py ubuntu:/Home/snu/sample.py

지금 설명하는 게 어렵다면, 도커 책임이 아니라 리눅스가 낯설기 때문이다.
콘솔에서 타이핑하는 것이 어려운 것이다. 이 부분은 리눅스 기본 명령어를 참고해야 한다.
우분투에 폴더를 만들어야 한다면, mkdir 명령이 필요하다.

cp 명령은 스택오버플로우에서 영감을 얻었다. (Copying files from host to docker container)
cp 명령에 대한 도커 공식 문서도 있다. (cp 도커 문서)

cp 명령에 사용할 수 있는 컨테이너는
docker ps -a 명령으로 보여지는 모든 컨테이너에 대해 가능하다.
다시 말해, 동작 중인 컨테이너뿐만 아니라
동작을 멈춘, 그러나 삭제되지 않은 컨테이너에도 복사할 수 있다.

8. 주의사항
이건 나한테 주는 주의사항이다.
도커에 대해 여전히 모르니까, 계속해서 run 명령만 실행시켰다.
그랬더니 ps -a 명령으로 보면 수십 개씩 있었다. 너무 많아서 히스토리라고 생각했다.
그런데, history 명령은 따로 있었다. docker라고만 입력하면 다양한 옵션과 명령을 확인할 수 있다.

이상한 것이 새벽에 설치한 파이썬이 보이질 않는 것이었다.
여러 번 해봤는데, 매번 설치하는데 다음에 들어가면 없었다.
이게 run 명령을 사용해서 그런 것이었다. 당연히 매번 새로 만드니까, 없는 것이었는데..
이 글을 보는 사람들은 나처럼 바보 짓을 하지 말자.