히비스서커스의 블로그

[Docker] 서버의 docker에서 jupyter notebook생성하여 local에서 접속하기 본문

Programming/Docker

[Docker] 서버의 docker에서 jupyter notebook생성하여 local에서 접속하기

HibisCircus 2021. 7. 9. 21:39
728x90

서버안에서 conda env를 통해서 작업을 하더라도 여러가지 환경설정이 꼬이기 쉽상이다. 이를 해결하기 위해서는 docker를 활용하는 것이 os부터 여러 환경설정들을 컨테이너에 각각 설정해줄 수 있으므로 더 좋다.

 

https://blog.samstdio.com/jupyter-notebook-on-docker/

 

이번에는 서버의 docker를 설치하고 jupyter notebook을 실행한 후 로컬에서 접속하는 방법을 전체적으로 진행해보았다.

 

도커 설치과정을 생략하겠다. 도커의 공식홈페이지를 참조하여 서버의 os에 따라 잘 설치하면 된다.

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

 

docs.docker.com

왼쪽 메뉴에서 CentOS, Debian, Fedora의 설치 방법도 확인 가능하다.

 

 

만약 NVDIA-Docker를 설치하길 원하는 경우에는 아래의 공식 홈페이지에 따라 설치하면 된다.

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

 

Installation Guide — NVIDIA Cloud Native Technologies documentation

On RHEL 7, install the nvidia-container-toolkit package (and dependencies) after updating the package listing: Restart the Docker daemon to complete the installation after setting the default runtime: Note Depending on how your RHEL 7 system is configured

docs.nvidia.com

기존의 설치과정보다 GPG key를 설정하는 과정이 들어가서 좀 더 길어지는데 이 과정에서 오류가 발생할 수 있다. 이에 관한 것은 해결하면 올려보도록 하겠다. (libssl.os.1.0.0 에 관한 오류이다.)

 

 

https://medium.com/platformer-blog/practical-guide-on-writing-a-dockerfile-for-your-application-89376f88b3b5

 

도커는 위의 그림과 같이 크게 3가지를 기억하면 좋다. 먼저 도커 파일에 실행하고 싶은 내용들(os setting 및 파이썬과 같은 언어의 파일들의 실행 명령들)을 담아 만든다.

 

 

이를 도커파일이 있는 디렉토리에서 build 할 시 docker이미지가 생성이 된다.

$ docker build -t (이미지이름):(태그) .

 

생성된 이미지는 다음과 같은 명령어를 통해 확인할 수 있다.

# 현재 docker image 확인
$ docker images

# 원하는 도커 이미지 삭제
$ docker rmi (이미지 id)

도커 이미지로 생성된 컨테이너가 존재하는 경우 삭제가 안될 수 있다.

 

 

생성된 이미지를 run하여 컨테이너를 생성할 수 있다.

$ docker run \
          -d \
          --gpus all \  # gpu 사용
          -p 8877:8888 \  # host port : jupyter의 default port
          -p 6006:6006 \  # tensorboard의 default port
          --name tensorflow_gpu \  # 컨테이너 이름을 tensorflow_gpu로 설정
          tensorflow/tensorflow:latest-gpu-jupyter \  # 이미지의 이름과 
          jupyter notebook \  # 주피터 노트북을 열라는 명령어
          --allow-root \  # 루트계정에서 서버를 여는 것을 허용
          --ip 0.0.0.0 \  # default 값으로 ip설정
          --NotebookApp.token='' \  # 서버에 등록하는 인증절차를 생략
          --no-browser  # 주피터 접속 기억 실행하지 않도록

 

 

여기서 헷갈릴 수 있는 부분이 -p 8877:8888 부분이다.  오른쪽은 보통 주피터 노트북의 default 값이 8888이므로 고정시키면 된다. 8877부분은 서버가 열어놓은 port를 지정해놓는 것이다. 만약 이미 서버에 도커가 아닌 환경의 주피터 노트북을 설정해놓았다면 그 port로 지정을 해야한다.

 

이와 같이 진행한다고 local에서 주피터 노트북으로 접속할 수 있는 것이 아니다. 로컬에서 주피터 노트북을 실행할 수 있도록 port fowarding 해주어야 한다. 이는 하나의 쉘파일로 만들어주면 좋다. 이는 ssh관련 key를 미리 서버에 등록해놔야 하는데 자세한 내용은 아래에 있다. 

 

https://biology-statistics-programming.tistory.com/108?category=973652 

 

[server] ssh로 서버접속한 후 jupyter notebook 실행하기

윈도우 os기반 노트북으로 서버에 접속하여 원격으로 일을 하게 되었다. 간단한 설명을 받았는데 ssh를 기반으로 적혀있었다. 서버 쪽으로는 정말 문외한이어서 처음에 봤을 때는 무슨 말인지 잘

biology-statistics-programming.tistory.com

 

이미 ssh의 키를 서버에 등록했다는 가정하에 진행을 하겠다.

 

#!bin/bash
echo"RUNNIG JUPYTER NOTEBOOK"
ssh -f (host server 명) -L 8880:127.0.0.1:8877 -N

여기서 또 헷갈리는 부분이 바로 8880 부분과 8877부분이다. 8800은 로컬에서의 포트이고 8877은 서버에서의 포트이다. 8877은 이미 열어놓은 서버의 포트이고 위에서도 설정해주었으므로 그대로 해야한다. 8880은 로컬에서의 포트인데 이미 서버에서 주피터 노트북을 여는 것을 8888로 설정해두었을 가능성이 높기 때문에 이와 다른 포트 번호로 하는 것이 좋다. 임의로 8800으로 설정해 놓은 것이다.

 

 

이제 주피터 노트북을 로컬에서 실행해보자. 브라우저를 하나 켠 후 http://127.0.0.1:8880을 입력하면 주피터 노트북이 나오는 것을 확인할 수 있을 것이다.

 

서버의 docker환경에서 jupyter notebook을 켠 후 로컬에서 접속하는 것을 목표로 하다보니 docker의 환경을 설정해주는 것을 생략되었는데 이는 도커 파일을 만들 때 미리 지정해두면 된다.

 

 

 

-히비스서커스-

728x90