2022년 6월 25일 토요일

Docker란 그리고 windows 11,10 Home 에서 Docker 설치, Docker Hub에서 이미지 설치

0. Docker란

도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 이건 번역한 내용인데 ??? 뭔말인지 한국말이지만 이해하기 어렵습니다.

좀 더 알기 쉽게 설명하자면 A사용자가 자신만의 환경 설정한 linux가 있다면 그것을 다른 사람도 가져다가 사용할 수 있게 하는것이 Docker입니다. 즉 window용 Docker를 사용하더라도 linux이용만 가능합니다.

언제 왜 사용할까요? 저의 경우는 TensorFlow를 사용하기 위해서 설치합니다. TensorFlow는 버전별 변동 사항도 많고 CUDA와 Python 버전등 잘맞아야 하는데 환경 설치하는데 너무 스트레스를 받습니다.

용어 : 호스트(로컬PC), 컨테이너(가상머신)


1. 설치 문서

참고 : https://docs.docker.com/desktop/windows/install/


2. 설치전 확인사항

- Windows 64bit 

- RAM 4G 이상

- 가상화 지원 확인

가상화 기능을 제공하는지 확인 필요합니다.


한글로는 작업 관리자 > 성능 > 가상화: 사용 으로 나와야합니다.


가상화 관련 두가지 방법이 존재하며,

Hyper-V backend and Windows containers

  • Windows 11 64-bit: Pro version 21H2 or higher, or Enterprise or Education version 21H2 or higher.
  • Windows 10 64-bit: Pro 21H1 (build 19043) or higher, or Enterprise or Education 20H2 (build 19042) or higher.

Hyper-V 방식은 HOME 버전에서는 설치 할 수 없음

WSL 2 backend

  • Windows 11 64-bit: Home or Pro version 21H2 or higher, or Enterprise or Education version 21H2 or higher.
  • Windows 10 64-bit: Home or Pro 21H1 (build 19043) or higher, or Enterprise or Education 20H2 (build 19042) or higher.

WSL 2 방식을 사용해서 설치해야 합니다. 여기서는 WSL 2방식으로 진행하였습니다.


3. Docker Desktop설치

WSL 2를 설치하기전에 Docker Desktop을 설치해줍니다.

https://docs.docker.com/desktop/windows/install/ 페이지 중간 링크가 있음

https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe

설치 후에 재부팅이 일어나는데 Docker를 실행시키면 잠시 후 아래와 같은 팝업이 뜨면서 WSL 2를 설치하라고 합니다.

Restart 버튼은 WSL 2를 설치한뒤 눌러줍니다.


4. WSL 2 설치

- 용도 : 윈도우에서 linux 의 shell과 파일 시스템을 사용할 수 있게 해줌

참고용 링크 (https://docs.microsoft.com/en-us/windows/wsl/install)

Docker 가 띄워주는 팝업에 링크가 있는데 아래 링크로 이동 시켜줍니다.

이전 버전 WSL의 수동 설치 단계 | Microsoft Docs

중간에 WSL2 Linux 커널 업데이트 MSI 패키지를 다운받아서 실행 시켜줍니다.

아래쪽 가이드가 있긴한데 그건 설치안해도 됩니다.

Docker 아래 팝업창의 Restart 버튼을 눌러줍니다. (Docker가 재시작합니다.)


5. Docker 제대로 설치되었는지 확인

Docker가 제대로 설치되었는지 혹은 지금 실행중인지는 cmd line 명령(docker version)으로 알 수 있습니다.

아래는 docker daemon(deamon이란 메모리에 계속 남아있는 서버라고 생각하면 됩니다.) 이 중지되어 있어서 에러가 나오고 있습니다.

PS C:\Users> docker version
error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.
Client:
 Cloud integration: v1.0.25
 Version:           20.10.16
 API version:       1.41
 Go version:        go1.17.10
 Git commit:        aa7e414
 Built:             Thu May 12 09:17:07 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

만약 Docker Desktop을 정상적으로 실행시켰다면 아래와 같이 에러 없이 정보가 출력될것입니다. docker가 부팅할때 자동 실행하는 옵션은 기본값 입니다.

PS C:\Users> docker version
Client:
 Cloud integration: v1.0.25
 Version:           20.10.16
 API version:       1.41
 Go version:        go1.17.10
 Git commit:        aa7e414
 Built:             Thu May 12 09:17:07 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.9.1 (81317)
 Engine:
  Version:          20.10.16
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.10
  Git commit:       f756502
  Built:            Thu May 12 09:15:42 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.4
  GitCommit:        212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
 runc:
  Version:          1.1.1
  GitCommit:        v1.1.1-0-g52de29d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0


6. Docker Hub에서 이미지 다운로드 받기

앞에서 Docker를 사용하는 목적은 다른 사람의 환경을 가져오기 위한 용도라고 설명드렸습니다. 그럼 간단하게 이미지를 Docker hub에서 가져오도록 하겠습니다.

docker hub에서 tensorflow/tensorflow 를 검색하면 https://hub.docker.com/r/tensorflow/tensorflow 여기 페이지가 검색됩니다.

그중에 어떤 버전을 받을지 결정하는게 tag입니다. tag에 대한 자세한 설명은

https://www.tensorflow.org/install/docker?hl=ko 여기를 읽어보면 도움이 됩니다. 기본으로 받아버리면 CPU 버전으로 다운받습니다. 

NVIDA GPU를 가지고 있어서 아래 버전으로 다운로드 해봤습니다.

수많은 이미지가 검색됨
그중에 아래 이미지를 다운로드 했습니다. cmd line에 입력하면 됩니다.

docker pull tensorflow/tensorflow:2.9.1-gpu-jupyter

이미지는 Docker내에 다운로드 되기 때문에 아무 폴더에서 진행해도 됩니다.


7. Docker 이미지 관리하기

docker images : 현재 보유하고 있는 docker images들 나타내기

PS C:\Users> docker images
REPOSITORY              TAG                 IMAGE ID       CREATED       SIZE
tensorflow/tensorflow   2.9.1-gpu-jupyter   5f9e07bacf1d   3 weeks ago   6.07GB

이미지 받아오기
docker pull <이미지 이름>:<태그>

이미지 검색하기
docker search [검색 단어]

다운 받았던 이미지 삭제하기
docker rmi <이미지 이름>

8. Docker 이미지 실행하기


#docker image에서 container 실행  
docker run <옵션> <이미지 이름:Tag이름> <실행할 파일> 형식입니다
예) docker run -i -t  tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash
* <실행 파일>이 없으면 컨테이너만 실행됩니다. 컨테이너에 따라 특별한 동작을 하는 컨테이너도 있습니다.

# Container 시작
 docker start [컨테이너 이름 or ID]

# Container 접속
 docker attach [컨테이너 이름 or ID]

# 실행중인 컨테이너 삭제하기
docker rm <container-id>

# 실행중인 도커들 보기
docker ps


# 실행중인 도커 중지
docker stop <container-id>

9. Docker 이미지 실행하기 예제

앞에서 다운받은 tensorflow 이미지를 실행시켜봅니다.
docker run -i -t tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash

-i (--interactive                    Keep STDIN open even if not attached)
-t (--tty                            Allocate a pseudo-TTY)
이미지를 실행시키면서 bash shell을 실행시키면 되는데 shell안에서 명령을 내리고자 한다면 -i, -t 옵션을 추가로 넣어줍니다.

C:\Users>docker run -i -t  tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash

________                               _______________
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ /
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

root@0395a93a38b3:/tf# pwd
/tf
root@0395a93a38b3:/tf#
C:\Users>docker ps
CONTAINER ID   IMAGE                                     COMMAND       CREATED          STATUS          PORTS      NAMES
0395a93a38b3   tensorflow/tensorflow:2.9.1-gpu-jupyter   "/bin/bash"   48 seconds ago   Up 47 seconds   8888/tcp   compassionate_yalow

위의 예제를 보면 docker 사용중에 Ctrl+C 강제로 빠져나와도 docker ps 를 해보면 실행중인 docker의 컨테이너가 그대로 존재함을 알 수 있습니다. (run의 --rm 옵션 사용하면 지워짐)
실행중인 컨테이너 삭제는 docker rm 을 이용합니다.

빠져나왔던 docker에 다시 접속하기 위해서는 attach를 이용합니다.
C:\Users>docker ps
CONTAINER ID   IMAGE                                     COMMAND       CREATED          STATUS          PORTS      NAMES
0395a93a38b3   tensorflow/tensorflow:2.9.1-gpu-jupyter   "/bin/bash"   48 seconds ago   Up 47 seconds   8888/tcp   compassionate_yalow

C:\Users>docker attach 0395a93a38b3
root@0395a93a38b3:/tf# 

docker를 사용중에 빠져나왔다면 docker내에서 process가 계속 돌게 됩니다.

모든 사용이 끝났으면 docker를 삭제 해줘야하는데 삭제전에는 stop으로 docker 컨테이너를 멈추고 rm으로 삭제 하도록 합니다.

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker rm 0395a93a38b3
Error response from daemon: You cannot remove a running container 0395a93a38b3fe9ae50b892a3e97ca5c8b050fb13fa74011c5da9055a09d2f8a. Stop the container before attempting removal or force remove

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker ps
CONTAINER ID   IMAGE                                     COMMAND       CREATED          STATUS          PORTS      NAMES
0395a93a38b3   tensorflow/tensorflow:2.9.1-gpu-jupyter   "/bin/bash"   13 minutes ago   Up 13 minutes   8888/tcp   compassionate_yalow

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker stop 0395a93a38b3
0395a93a38b3

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker rm 0395a93a38b3
0395a93a38b3

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


9. 볼륨 설정을 해서 실행하기

docker이미지 내에서 shell을 실행시킨다던가 프로세서를 실행하는건 run 명령으로 간단하게 실행이 가능합니다.

그런데 어떤 프로그램이 혼자 동작하는건 아닙니다. 굉장히 많은 입력 파일이 필요하게 되고  출력 파일 또한 생성이 될겁니다. 이것을 어디에서 할것인지 정하는게 볼륨 설정을 하는 과정입니다. 

호스트와 연결되는 통로를 만드는것이 -v (볼륨설정) 입니다.

-v (로컬 폴더명)/(컨테이너 볼륨명 : 존재하지 않아도 됩니다.)


# 로컬 volume을 container의 /conainer_volume  로 마운트

docker run -i -t -v /home/host_volume:/conainer_volume  tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash

즉 아래와 같이 실행한다면 
C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker run -i -t -v C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master:/work tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash

컨테이너의 /work 폴더와 로컬의 C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master 폴더가 연결됩니다. 한쪽에서 파일을 write하면 한쪽에서는 읽는 것이 가능합니다.

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker run -i -t -v C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master:/work tensorflow/tensorflow:2.9.1-gpu-jupyter /bin/bash

________                               _______________
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ /
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


WARNING: You are running this container as root, which can cause new files in
mounted volumes to be created as the root user on your host machine.

To avoid this, run the container by specifying your user's userid:

$ docker run -u $(id -u):$(id -g) args...

root@6900ed9b34c5:/tf#

접속해서 /work 폴더를 들어가 봤더니 여러가지 로컬에서 작업하던 내용들이 보입니다.

root@6900ed9b34c5:/work# ls
License.txt  data         midi_util.py  nottingham_util.py  rnn_separate.py  ununt_venv
README.md    dataset.zip  model.py      rnn.py              rnn_test.py      util.py
__pycache__  main.py      models        rnn_sample.py       sampling.py      venv
root@6900ed9b34c5:/work#


10. port 매핑하기

지난번에 받은 컨테이너에 접속해보니 기본 폴더가 tf 폴더이고 안쪽에 tensorflow-tutorials/를 열어보니 ipynb가 보입니다. 이것은 주피터노트북 파일입니다.

root@6900ed9b34c5:/tf# ls tensorflow-tutorials/
README.md             overfit_and_underfit.ipynb  save_and_load.ipynb        text_classification_with_hub.ipynb

주피터 노트북을 실행시키기 위해서는 당연히 주피터노트북 실행파일이 실행되어야합니다. 이건 간단하게 docker를 실행시킬때 shell 실행 시켰던 내용을 삭제합니다.

그전에 동작중이던 docker를 삭제하고 다시 시작합니다.
C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker ps
CONTAINER ID   IMAGE                                     COMMAND       CREATED         STATUS         PORTS      NAMES
6900ed9b34c5   tensorflow/tensorflow:2.9.1-gpu-jupyter   "/bin/bash"   2 minutes ago   Up 2 minutes   8888/tcp   naughty_ptolemy

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker stop 6900ed9b34c5
6900ed9b34c5

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker rm 6900ed9b34c5
6900ed9b34c5

포트 매핑은 -p 옵션을 합니다. 즉 해당 포트가 설정이 되면 -v와 마찬가지로 한쪽에 접속이 되면 다른 쪽으로 포워딩 되는 원리라고 생각하면 됩니다. 즉 컨테이너 내부에서 실행된 server가 포트만 열려 있으면 접속이 가능합니다. jupyter notebook의 경우 8888 이 기본 포트이므로 아래와 같이 실행시켜줍니다.
-p 8888:8888 (8888 포트를 연결해줍니다.)

docker run -i -t -v C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master:/work -p 8888:8888 tensorflow/tensorflow:2.9.1-gpu-jupyter

docker가 실행되면 자동으로 jupyter notebook 서버가 실행됩니다.
마지막 설명에 접속 주소를 알려줍니다.

C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master>docker run -i -t -v C:\Users\jun\Documents\ai_composer\AI-Music-Composer-master:/work -p 8888:8888 tensorflow/tensorflow:2.9.1-gpu-jupyter
[I 06:43:40.804 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
jupyter_http_over_ws extension initialized. Listening on /http_over_websocket
[I 06:43:41.040 NotebookApp] Serving notebooks from local directory: /tf
[I 06:43:41.040 NotebookApp] Jupyter Notebook 6.4.11 is running at:
[I 06:43:41.040 NotebookApp] http://41814de83333:8888/?token=e037c91cab11c41ce20e03d2fda4bd6a07b1734311835691
[I 06:43:41.040 NotebookApp]  or http://127.0.0.1:8888/?token=e037c91cab11c41ce20e03d2fda4bd6a07b1734311835691
[I 06:43:41.040 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 06:43:41.043 NotebookApp]

    To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://41814de83333:8888/?token=e037c91cab11c41ce20e03d2fda4bd6a07b1734311835691
     or http://127.0.0.1:8888/?token=e037c91cab11c41ce20e03d2fda4bd6a07b1734311835691

로컬에서 브라우저를 열어줍니다.
아래 주소의 토큰값은 바뀌니까 출력되는 값을 보고 진행 바랍니다.
GPU를 사용한다면 이것도 추가해줍니다.
docker run --gpus all

http://127.0.0.1:8888/?token=e037c91cab11c41ce20e03d2fda4bd6a07b1734311835691

지금까지 윈도우 docker를 설치해서 jupyter notebook 실행 하는것까지 진행했는데
다음에는 이것을 이용해서 tensorflow 이것저것 예제를 돌려보도록 하겠습니다.



댓글 없음:

댓글 쓰기