도커를 이용한 파이썬 pyenv 개발 환경 만들기, Docker python pyenv jupyter notebook
도커는 컨테이너(container)기반의 소프트웨어 플랫폼으로 서비스 또는 프로그램을 쉽게 구축하고 테스트 하며 배포 할 수 있는 서비스 입니다. 도커는 프로그램을 컨테이너라는 단위를 이용하여 패키징하며, 이 컨테이너 안에 다양한 라이브러리, OS 패키지, 소프트웨어 도구, 개발 코드 등 서비스(프로그램)을 실행하는데 필요한 모든 요소를 구성 할 수 있습니다. 도커를 이용하여 서비스를 배포할 경우 다양한 OS 환경에 맞게 dependency한 문제 없이 배포를 할 수 있는 장점이 있습니다.
도커와 비슷한 개념으로 VM(가상화)라는 서비스가 존재 합니다.
이 두가지의 가장 큰 차이점은 Guest OS 위에 올릴 것인가, 아니면 OS 바로 위에 올릴 것인가 차이라고 볼 수 있습니다.
이해를 돕기 위해 아래 두 그림을 참고하시면,
도커 컨테이너는 애플리케이션 A, B, C ... F 가 Host OS 위에 바로 올라가는 반면, VM은 Guest OS 위에 애플리케이션 A, B, ...F 가 올라간다는 점입니다. VM은 무조건 OS가 필요하며 이 구조로 인하여 용량이 도커 컨테이너에 비해 클 수 밖에 없습니다. 즉 가상화 방법이 약간 다른 점입니다. 컨테이너는 별도의 Guest OS가 필요 없는 이유는 컨테이너를 프로세스 격리를 통해 구성하는 것이 가능하기 때문입니다. 더 자세한 깊이 있는 내용들은 직접 조사해 보는 것도 나름 공부가 많이 될 것 같아 더 다루지는 않도록 하겠습니다. ^^
※ Docker의 설치 방법은 OS 마다 약간씩 다르고 설치 방법 또한 쉽게 검색 할 수 있기 때문에 본문에서는 다루지 않겠습니다. (이제 부터 기본적인 설명은 linux OS를 기본으로 사용한다는 전제하에 설명드릴게요.)
1. Docker root dir 변경 방법
설치는 다루지 않지만 한 가지 짚고 넘어가야 할 중요한 설정이 있습니다. 도커 컨테이너를 실행하고 그 컨테이너 안에 새로운 파일 또는 소스 코드를 계속 넣어 줄 경우, 도커가 설치되어 있는 기본 파일시스템 (Linux의 경우 / (root)이 용량이 지속적으로 증가하여 100%에 도달 하는 경우가 많이 있습니다.
용량이 100%가 될 경우 해당 문제가 지속되면 도커 컨테이너 안의 서비스가 동작하지 않던가, OS에 문제가 생길 수 있기 때문에 항상 조심해야 합니다.
이 문제를 해결 하기 위해서는 현재 도커가 사용하고 있는 root dir을 확인하고, 여유량이 가장 많은 파일시스템으로 변경해주는 것이 좋습니다.
(1) docker root dir 확인
[root@ ~]# docker info | grep -i "docker root dir"
Docker Root Dir: /var/lib/docker
(2) linux의 vi 명령어를 통해 /etc/docker/daemon.json 파일을 아래와 같이 수정합니다.
[root@ ~]# vi /etc/docker/daemon.json
{
"graph": "/data/app/docker_lib"
}
(3) 수정이 완료 되었으면 docker 서비스를 재시작하고 정상적으로 root dir이 변경되었는지 확인 합니다.
[root@ ~]# docker info | grep -i "docker root dir"
Docker Root Dir: /data/app/docker_lib
2. Docker 기본 명령 설명
실제 Docker 공식 홈페이지에 가면 설명이 자세히 되어 있지만, 자주 사용하는 명령어들만 소개해 드리도록 하겠습니다.
(1) Docker 생성, 기동 및 확인할 때 사용하는 명령
명령어 | 상세 설명 |
docker build -t python:0 . | 미리 만들어 놓은 세팅 값(Dokcerfile)을 이용 하여 새로운 이미지 생성할 때 사용합니다. |
docker images | 생성된 이미지들을 확인할 때 사용하는 명령입니다. |
docker run -itd python:0 | 생성된 이미지를 실행 시킬 때 사용하는 명령입니다. |
docker ps | 현재 동작 중인 docker container process를 확인할 때 사용하는 명령입니다. |
docker ps -a | 동작 중 이거나 동작했던 흔적이 있는 docker container process를 확인하는 명령입니다. |
docker exec -it [container_ID] /bin/bash | 현재 동작 중인 docker container에 접속할 때 사용하는 명령입니다. |
- Docker images 실행 예시
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv v12.01_1 07f27a2a899d 2 hours ago 3.06GB
ubuntu 20.04 ba6acccedd29 2 months ago 72.8MB
- Docker ps 실행 예시
[root@ai_server_56 ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cad6a687a920 ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 26 hours ago Up 26 hours 0.0.0.0:8092->8888/tcp, :::8092->8888/tcp ubuntu_python1
[root@ai_server_56 ubuntu-pyenv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cad6a687a920 ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 26 hours ago Up 26 hours 0.0.0.0:8092->8888/tcp, :::8092->8888/tcp ubuntu_python1
cad6a687a920 ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 11 seconds ago Exited (1) 7 seconds ago ubuntu_pyenv
- Docker container 실행 예시
[root@ai_server_56 ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv v21.01_1 4794526cb409 11 minutes ago 3.06GB
ubuntu 20.04 ba6acccedd29 2 months ago 72.8MB
[root@ai_server_56 ubuntu-pyenv]# docker run -itd --name pyenv ubuntu_pyenv:v21.01_1
a0a0a4b7ee1e62eed92cab80a73cf01bac7304a3dc9bfccb01c2a3b6a8f94fb4
[root@ai_server_56 ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0a0a4b7ee1e ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 4 seconds ago Up 3 seconds pyenv
※ 가끔 linux OS 상에서 사용하고 있는 port가 있을 경우 docker cotainer가 동작하지 않을 수 있습니다. 이 때에는 container의 port를 forward 시켜서 기동 시킬 수 있습니다. (※ port forwarding)
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv v21.01_1 4794526cb409 11 minutes ago 3.06GB
ubuntu 20.04 ba6acccedd29 2 months ago 72.8MB
[root@ ubuntu-pyenv]# docker run -itd -p 8888:8888 --name ubuntu_pyenv ubuntu_pyenv:v21.01_1
52993ea66589a0b1822c3097bda06e0d505c53e26d915c600f057105f983127c
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52993ea66589 ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 3 seconds ago Up 2 seconds 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp ubuntu_pyenv
(2) Docker container commit, save 및 copy
명령어 | 상세 설명 |
docker commit [container_ID] REPOSITORY:TAG | 현재 동작 중인 container를 새로운 이미지로 만들기 위한 명령입니다. (※ 기존에 동작 중인 container에수정사항 발생 시 실행하여 내용이 저장될 수 있게 수행하는 것이 좋습니다.) |
docker save -o file_name.tar REPOSITORY:TAG | 생성되어 있는 docker 이미지를 별도의 파일로 SAVE 하기 위한 명령입니다. (※ save 작업을 하면 변경된 내용 관리를 쉽게 할 수 있으며 다른 곳에 배포할 수 있습니다. |
docker load -i file_name.tar | 다른 곳에서 생성된 이미지 파일을 현재 docker 시스템에 불러올 때 사용하는 명령입니다. |
docker cp D:/file_test/. [container_ID]:/src | 실행 중인 container 안에 새로운 파일을 추가 하거나 source 코드 파일을 수정하거나 추가 할 경우 사용하는 명령입니다. |
- 실행 중인 container를 실행 예시
# 우선 실행 중인 container를 확인 합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52993ea66589 ubuntu_pyenv:v21.01_1 "jupyter notebook --…" 2 minutes ago Up 2 minutes 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp ubuntu_pyenv
# container id를 확인하고 commit을 진행 합니다.
[root@ai_server_56 ubuntu-pyenv]# docker commit 52993ea66589 ubuntu_pyenv:new
sha256:938df759a381508463fbf4568c05b30ab0a1b4630e3b090bc0054bcbbb900c0d
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv new 938df759a381 4 seconds ago 3.06GB
ubuntu_pyenv v21.01_1 4794526cb409 18 minutes ago 3.06GB
- container commit을 실행한 image를 파일로 저장하는 예시
# commit이 완료된 이미지를 확인 합니다.
[root@temp]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv new 938df759a381 About a minute ago 3.06GB
ubuntu_pyenv v12.01_1 4794526cb409 20 minutes ago 3.06GB
# save 명령을 통해 이미지를 파일로 저장합니다.
[root@temp]# docker save -o ubuntu_pyenv_new.tar ubuntu_pyenv:new
# 실제로 생성된 파일을 확인 합니다.
[root@temp]# ls -l
total 3031400
-rw-------. 1 root root 3104151552 Dec 16 16:06 ubuntu_pyenv_new.tar
- image로 저장한 파일을 load 명령을 이용하여 불러오는 예시
# 현재 등록되어 있는 image를 확인 합니다.
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# Docker load 명령을 통해 파일로 저장된 image를 불러옵니다.
[root@ubuntu-pyenv]# docker load -i ubuntu_pyenv_new.tar
5a48ee034b04: Loading layer [==================================================>] 1.512GB/1.512GB
Loaded image: ubuntu_pyenv:v21.12_2
# 불러온 image를 확인합니다.
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv v21.12_2 67edba4bed71 3 minutes ago 4.62GB
- 새로운 파일을 docker container 안으로 복사하는 예시
# 복사하고자 하는 파일을 확인 합니다.
[root@ubuntu-pyenv]# ls -l
-rw-r--r--. 1 root root 10240 Dec 21 08:44 test_copy.tar
# 복사할 docker container를 확인합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7ecf5d66c9d bce2bd39dd10 "jupyter notebook --…" 21 hours ago Up 5 minutes 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp ubuntu_pyenv
# docker cp 명령을 이용하여 test_copy.tar 파일을 container안의 원하는 위치에 복사합니다.
[root@ubuntu-pyenv]# docker cp test_copy.tar a7ecf5d66c9d:/home/ubuntu/.
# 복사가 정상적으로 이루어 졌는지 확인하기 위해 container 안으로 접속 합니다.
[root@ubuntu-pyenv]# docker exec -it a7ecf5d66c9d /bin/bash
# container접속 후 복사한 경로로 이동하여 파일을 확인합니다.
ubuntu@a7ecf5d66c9d:~$ cd /home/ubuntu
ubuntu@a7ecf5d66c9d:~$ ls -l
-rw-r--r--. 1 root root 10240 Dec 21 08:44 test_copy.tar
(3) Docker container 중지 및 삭제
명령어 | 상세 설명 |
docker stop CONTAINER_ID | 현재 동작 중인 특정 container를 중지하는 명령입니다. |
docker stop $(docker ps -a -q) | 현재 동작 중인 container를 중지하는 명령입니다. |
docker restart CONTAINER_ID | 중지되어 있는 container를 재시작할때 사용하는 명령입니다. |
docker rm CONTAINER_ID | 동작이 종료된 container를 삭제하는 명령입니다. |
docker container prune | 실행되었던 container의 모든 흔적을 삭제할 때 사용하는 명령입니다. |
docker rmi -f image ID | docker 이미지를 삭제할 때 사용하는 명령입니다. |
docker rmi $(docker images -q) |
docker에 로드되어 있는 모든 이미지를 삭제하는 명령입니다. |
- 실행 중인 container를 중지하는 예시
# 동작중인 docker container를 확인합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33538ed3c1b1 ubuntu_pyenv:v21.12_2 "jupyter notebook --…" 2 minutes ago Up 2 minutes 8888/tcp ubuntu_pyenv_test
# container id를 이용하여 동작중인 container를 중지합니다.
[root@ubuntu-pyenv]# docker stop 33538ed3c1b1
33538ed3c1b1
# 정상적으로 중지가 되었는지 확인 합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 종료된 container를 재시작 하는 예시
# 현재 동작하고 있는 container가 있는지 확인합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 중지되어 있는 container id를 확인합니다.
[root@ubuntu-pyenv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33538ed3c1b1 ubuntu_pyenv:v21.12_2 "jupyter notebook --…" 5 minutes ago Exited (0) 2 minutes ago ubuntu_pyenv_test
# restart 명령어를 이용하여 재동작 시킵니다.
[root@ubuntu-pyenv]# docker restart 33538ed3c1b1
33538ed3c1b1
# 정상적으로 동작하는지 확인 합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33538ed3c1b1 ubuntu_pyenv:v21.12_2 "jupyter notebook --…" 5 minutes ago Up 5 seconds 8888/tcp ubuntu_pyenv_test
- container를 종료 시키고 삭제하는 예시
# 동작중인 container를 확인합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33538ed3c1b1 ubuntu_pyenv:v21.12_2 "jupyter notebook --…" 8 minutes ago Up 2 minutes 8888/tcp ubuntu_pyenv_test
# container id를 이용하여 동작 중인 container를 중지합니다.
[root@ai_server_56 ubuntu-pyenv]# docker stop 33538ed3c1b1
33538ed3c1b1
# 중지된 container를 삭제합니다.
[root@ai_server_56 ubuntu-pyenv]# docker rm 33538ed3c1b1
33538ed3c1b1
# container가 정상적으로 삭제가 되었는지 확인합니다.
[root@ubuntu-pyenv]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Dockerfile이란 Docker 공식 Hub에서 제공하는 이미지를 다운 받아 container를 생성하고 실행하는 것에서 끝나지 않고, 제공되는 이미지를 기반으로 자신이 원하는 새로운 이미지를 생성하고 배포 할 수 있는 파일입니다.
조금 더 쉽게 설명을 해 드리면, 자신이 원하는 다양한 물건을 작성한 주문서(Dockerfile)를 이용하여 공급자에게 주문(build)을 하고 이 주문서를 이용하여 제품을 포장(Image)을 한 다음 이것을 conainer box에 담아 배송시켜(Run) 활용하는 것입니다. 제가 쉽게 이해하기 위해 이렇게 비유를 했지만 적당한 비유인지는 각자 판단하시기 바랍니다. ^^
저는 python을 주로 사용하기 때문에 python을 주로 사용할 수 있는 pyenv 환경을 만들고 그 안에서 동작하는 jupyter notebook을 담을 수 있는 이미지를 만들기 위한 Dockerfile을 설명드리도록 하겠습니다. 좀 더 자세하고 다양한 build format은 공식 docker 링크를 참고하시기 바랍니다. (https://docs.docker.com/engine/reference/builder/)
Dockerfile을 작성하는 사람마다 스타일이 다르지만, 제 경우에는 나중에 새로운 버전의 python으로 구성할 필요성 때문에 사용하고자 하는 python version과 python 동작에 필요한 library 파일 정보를 별도로 구분해서 관리 합니다. 아래와 같이 3가지 파일이 준비 되어 야 합니다.
# pyenv jupyter 설치를 위한 세가지 파일
[root@ubuntu-pyenv]# ls -l
-rw-r--r--. 1 root root 7 Dec 15 14:49 python-versions.txt
-rw-r--r--. 1 root root 2188 Dec 15 14:50 requirements-setup.txt
-rw-r--r--. 1 root root 1811 Dec 21 08:32 Dockerfile
우선 가장 먼저 소개해 드릴 파일은 python-versions.txt 파일입니다. 이 파일에는 사용하고자 하는 python 버전만 입력합니다.
[root@ubuntu-pyenv]# cat python-versions.txt
3.8.12
두번째로 소개해 드릴 파일은 python library 정보가 담긴 requirements-setup.txt 파일입니다. 이 파일에 기술된 library는 정답이 없으며 자신의 python 개발환경에 맞게 변경하시기 바랍니다.
[root@ubuntu-pyenv]# cat requirements-setup.txt
ipykernel==6.5.1
ipython==7.29.0
ipython-genutils==0.2.0
ipywidgets==7.6.5
jedi==0.18.1
joblib==1.1.0
jsonschema==4.2.1
jupyter==1.0.0
jupyter-client==7.1.0
jupyter-console==6.4.0
jupyter-core==4.9.1
jupyterlab-pygments==0.1.2
jupyterlab-widgets==1.0.2
keras==2.6.0
Keras-Applications==1.0.8
keras-lr-finder==0.1
Keras-Preprocessing==1.1.2
matplotlib==3.5.0
matplotlib-inline==0.1.3
more-itertools==8.12.0
notebook==6.4.6
pandas==1.3.4
python-dateutil==2.8.2
scikit-learn==1.0.1
scipy==1.7.3
statsmodels==0.13.1
tensorboard==2.6.0
tensorboard-data-server==0.6.1
tensorboard-plugin-wit==1.8.0
tensorflow-estimator==2.6.0
tensorflow-gpu==2.6.2
마지막으로 소개해 드릴 파일은 build의 핵심인 Dockerfile입니다. 사용하실 때 #(주석) 부분만 빼고 활용하시면 됩니다.
# build시 사용할 기본 OS 버전 정보
FROM docker.io/ubuntu:20.04
# 패키지 설치 시 사용자에게 설치 여부를 묻는 interactive 모드를 묻지 않게 변경
ARG DEBIAN_FRONTEND=noninteractive
# python 설치 시 필요한 OS package 정보
ARG BUILD_PYTHON_DEPS=" \
make \
build-essential \
libbz2-dev \
libffi-dev \
libgdbm-dev \
libncurses5-dev \
libncursesw5-dev \
libnss3-dev \
libreadline-dev \
libsqlite3-dev \
libssl-dev \
xz-utils \
zlib1g-dev \
"
# container 이미지 않에서 사용할 OS package 정보
ARG BUILD_OPT_DEPS=" \
sudo \
locales \
git \
ca-certificates \
curl \
vim \
zip \
unzip \
tzdata \
language-pack-ko \
"
# ubuntu linux 설치 후 필요한 apt-get 버전 업데이트 및 OS 설정
# basic update & locale setting
RUN apt-get update \
&& apt-get upgrade -yqq \
&& apt-get -yq install apt-utils \
&& apt-get install -y --no-install-recommends \
${BUILD_PYTHON_DEPS} \
${BUILD_OPT_DEPS} \
&& useradd -m -s /bin/bash ubuntu \
&& echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers \
&& apt-get autoremove -yqq --purge \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# 그 외 환경 설정
RUN locale-gen ko_KR.UTF-8
USER ubuntu
WORKDIR /home/ubuntu
#ENV LANG=ko_KR.UTF-8 \
ENV LANG=en_US.UTF-8 \
TZ=Asia/Seoul \
PYENV_ROOT="/home/ubuntu/.pyenv" \
PATH="/home/ubuntu/.pyenv/bin:/home/ubuntu/.pyenv/shims:$PATH"
# install pyenv & python 설정
COPY python-versions.txt /
RUN curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash \
&& pyenv install `cat /python-versions.txt` \
&& pyenv global `cat /python-versions.txt` \
&& pip install --upgrade pip
# pip requirements 설치
COPY requirements-setup.txt /
RUN pip install -r /requirements-setup.txt
# 설치 완료 후 container 기동 시 같이 jupyter notebook 실행
CMD ["jupyter", "notebook", "--port=8888", "--no-browser", "--ip=0.0.0.0", "--allow-root"]
이제 마무리 단계입니다. 생성된 이미지를 container에 실행하여 시키고, jupyter notebook을 열어 passwd만 입력하시고 사용하시면 됩니다.
# 생성된 docker image를 확인 합니다.
[root@ubuntu-pyenv]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu_pyenv v21.12_2 67edba4bed71 3 hours ago 4.62GB
# port forwarding을 이용하여 docker container를 실행합니다.
[root@ubuntu-pyenv]# docker run -itd -p 9999:8888 --name ubuntu_pyenv ubuntu_pyenv:v21.12_2
# 실행된 container를 확인하고 container ID를 확인합니다.
[root@ubuntu-pyenv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7ecf5d66c9d bce2bd39dd10 "jupyter notebook --…" 24 hours ago Up 3 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp ubuntu_pyenv
# jupyter notebook을 처음 실행 할 때 필요한 패스워드설정을 위해 container 로그를 확인합니다.
[root@ubuntu-pyenv]# docker logs a7ecf5d66c9d
[I 11:39:16.622 NotebookApp] Writing notebook server cookie secret to /home/ubuntu/.local/share/jupyter/runtime/notebook_cookie_secret
[I 11:39:16.810 NotebookApp] Serving notebooks from local directory: /home/ubuntu
[I 11:39:16.811 NotebookApp] Jupyter Notebook 6.4.6 is running at:
[I 11:39:16.811 NotebookApp] http://b000c9347d46:8888/?token=b54ef16897f488bf184bf5576723c5806c74d1f8d8a7ae41
[I 11:39:16.811 NotebookApp] or http://127.0.0.1:8888/?token=b54ef16897f488bf184bf5576723c5806c74d1f8d8a7ae41
[I 11:39:16.811 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 11:39:16.814 NotebookApp]
To access the notebook, open this file in a browser:
file:///home/ubuntu/.local/share/jupyter/runtime/nbserver-1-open.html
Or copy and paste one of these URLs:
http://b000c9347d46:8888/?token=b54ef16897f488bf184bf5576723c5806c74d1f8d8a7ae41
or http://127.0.0.1:8888/?token=b54ef16897f488bf184bf5576723c5806c74d1f8d8a7ae41
마지막으로 jupyter notebook에 접속하여 token 값을 이용하여 passwd를 설정합니다.
그럼 docker를 이용한 python pyenv jupyter notebook 설치 방법을 마치도록 하겠습니다. 잘 활용하시길 바래요~!