Docker 내가 원하는 대로 세팅해서 이미지 만들고 jupyter 서버 열기

Apic·2024년 1월 21일
0

우분투/wsl

목록 보기
5/5

기본 OS 선택

나는 평소에 ubuntu:20.04를 사용하기 때문에, ubuntu20.04 버전을 설정했다.

FROM ubuntu:20.04

미러 서버 변경

그리고 미러서버를 기존의 서버에서 카카오 서버로 바꾸어 다운로드 속도를 증가시켰다.

# 카카오 ubuntu archive mirror server 추가. 다운로드 속도 향상
RUN sed -i 's@archive.ubuntu.com@mirror.kakao.com@g' /etc/apt/sources.list && \
    apt-get update

라이브러리 설치

그리고 필요한 라이브러리들을 설치한다.

RUN apt-get install -y --no-install-recommends \
    wget \
    curl \
    git \
    bzip2\
    build-essential \
    zlib1g-dev \
    libncurses5-dev \
    libgdbm-dev \
    libnss3-dev \
    libssl-dev \
    libreadline-dev \
    libffi-dev

빌드하는 도중

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/jupyter_server/services/sessions/sessionmanager.py", line 14, in <module>
    import sqlite3
  File "/usr/local/lib/python3.10/sqlite3/__init__.py", line 57, in <module>
    from sqlite3.dbapi2 import *
  File "/usr/local/lib/python3.10/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ModuleNotFoundError: No module named '_sqlite3'



Traceback (most recent call last):
  File "/usr/local/bin/jupyter-notebook", line 5, in <module>
    from notebook.app import main
  File "/usr/local/lib/python3.10/site-packages/notebook/app.py", line 17, in <module>
    from jupyter_server.serverapp import flags
  File "/usr/local/lib/python3.10/site-packages/jupyter_server/serverapp.py", line 97, in <module>
    from jupyter_server.gateway.managers import (
  File "/usr/local/lib/python3.10/site-packages/jupyter_server/gateway/managers.py", line 32, in <module>
    from ..services.sessions.sessionmanager import SessionManager
  File "/usr/local/lib/python3.10/site-packages/jupyter_server/services/sessions/sessionmanager.py", line 17, in <module>
    from pysqlite2 import dbapi2 as sqlite3  # type:ignore[no-redef]
ModuleNotFoundError: No module named 'pysqlite2'

이런 오류가 발생하였다.

jupyter 관련 문제라는데,

sqlite3 libsqlite3-dev
이 두개를 설치해 줌으로서 해결했다.

파이썬 설치

파이썬을 설치한다.

나는 평소에 파이썬 3.10.13 버전을 사용하기에 그것에 맞춰 설치했다.

# 파이썬 설치
RUN wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz && \
    tar xzf Python-3.10.13.tgz && \
    cd Python-3.10.13 && \
    ./configure --enable-optimizations && \
    make altinstall

파이썬 파일을 다운로드 하는데 문제가 발생했다.

ERROR: failed to solve: process "/bin/sh -c wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz &&     tar xzf Python-3.10.13.tgz &&     cd Python-3.10.13 &&     ./configure --enable-optimizations &&     make altinstall" did not complete successfully: exit code: 5

이런 문제가 발생했다.

GPT 왈,

이 오류는 SSL/TLS 인증서의 검증에 실패하여 발생한 것으로 보입니다. Python 공식 웹사이트는 SSL/TLS 인증서를 사용하여 암호화된 연결을 제공하는데, 해당 연결에서 인증서를 검증할 수 없어서 발생한 문제입니다.

라고 한다.

주소 앞에 --no-check-certificate를 붙여주어 해결했다.

RUN wget --no-check-certificate https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz && \
    tar xzf Python-3.10.13.tgz && \
    cd Python-3.10.13 && \
    ./configure --enable-optimizations && \
    make altinstall

그리고 이렇게 설치하면 python 명령어가 아닌 python3.10, pip3.10을 사용해야 하는데, 그건 너무 귀찮으니까 python명령어로 바꿔준다.

# python3.10 -> python & pip3.10 -> pip
RUN update-alternatives --install /usr/local/bin/python pyhon /usr/local/bin/python3.10 1 && \
    update-alternatives --install /usr/local/bin/pip pip /usr/local/bin/pip3.10 1

그리고 가상환경을 만들어주고 실행한다.

# venv 가상환경 생성 및 실행
RUN python -m venv venv && \
    source venv/bin/activate

가상환경을 만드는데 문제가 발생했다.

ERROR: failed to solve: process "/bin/sh -c python -m venv venv &&     source venv/bin/activate" did not complete successfully: exit code: 127

source 명령어를 찾을 수 없어서였다.

RUN python -m venv venv && \
    . venv/bin/activate

패키지 설치

이제 패키지들을 설치한다.

나는 데이터 분석을 기준으로 필요한 패키지들을 설치했다.

# 패키지 설치
RUN pip install setuptools && \
    pip install mkl && \
    pip install pymysql && \
    pip install numpy && \
    pip install scipy && \
    pip install pandas && \
    pip install matplotlib && \
    pip install seaborn && \
    pip install hyperopt && \
    pip install optuna && \
    pip install missingno && \
    pip install mlxtend && \
    pip install catboost && \
    pip install kaggle && \
    pip install folium && \
    pip install librosa && \
    pip install nbconvert && \
    pip install Pillow && \
    pip install tqdm && \
    pip install wordcloud

그 외 기타 라이브러리, 패키지, 원격 접속을 위한 jupyter를 설치한다.

RUN apt-get install -y graphviz && \
    apt-get install -y graphviz-dev && \
    pip install pygraphviz

RUN apt-get update

RUN pip install graphviz && \
    pip install cupy-cuda11x

RUN pip install -U "ipython[all]"

RUN pip install jupyter jupyterlab notebook jupyterthemes ipywidgets

ENV PATH=/usr/local/bin:${PATH}

폰트 변경

그래프를 그릴때, 한글을 쓰기 위해 폰트를 설치해 준다.

# 나눔고딕 폰트 설치
# matplotlib에 Nanum 폰트 추가
RUN apt-get update && apt-get install fonts-nanum*
RUN cp /usr/share/fonts/truetype/nanum/Nanum* /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf/ && \
    fc-cache -fv && \
    rm -rf ~/.cache/matplotlib/*

cp 명령어에서 문제가 발생했다.

ERROR: failed to solve: process "/bin/sh -c cp /usr/share/fonts/truetype/nanum/Nanum* /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf/ &&     fc-cache -fv &&     rm -rf ~/.cache/matplotlib/*" did not complete successfully: exit code: 1

폴더가 없다고 하더라.
폴더를 만들고 넣어주었다.

RUN mkdir -p /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf && \
    cp /usr/share/fonts/truetype/nanum/Nanum* /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf/ && \
    fc-cache -fv && \
    rm -rf ~/.cache/matplotlib/*

마무리

ENV LANG ko_KR.UTF-8

# 기본
EXPOSE 8888 

언어 설정과 jupyter 포트 8888을 설정해 주었다.

최종 도커 파일

# local 빌드시
FROM ubuntu:20.04

# 카카오 ubuntu archive mirror server 추가. 다운로드 속도 향상
RUN sed -i 's@archive.ubuntu.com@mirror.kakao.com@g' /etc/apt/sources.list && \
    apt-get update

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get install -y --no-install-recommends \
    wget \
    curl \
    git \
    bzip2\
    build-essential \
    zlib1g-dev \
    libncurses5-dev \
    libgdbm-dev \
    libnss3-dev \
    libssl-dev \
    libreadline-dev \
    libffi-dev \
    sqlite3 \
    libsqlite3-dev

RUN apt update

# 파이썬 설치
RUN wget --no-check-certificate https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz && \
    tar xzf Python-3.10.13.tgz && \
    cd Python-3.10.13 && \
    ./configure --enable-optimizations && \
    make altinstall

# python3.10 -> python & pip3.10 -> pip
RUN update-alternatives --install /usr/local/bin/python pyhon /usr/local/bin/python3.10 1 && \
    update-alternatives --install /usr/local/bin/pip pip /usr/local/bin/pip3.10 1

# venv 가상환경 생성 및 실행
RUN python -m venv venv && \
    . venv/bin/activate

RUN apt-get update

RUN pip install --upgrade pip

# 패키지 설치
RUN pip install setuptools && \
    pip install mkl && \
    pip install pymysql && \
    pip install numpy && \
    pip install scipy && \
    pip install pandas && \
    pip install matplotlib && \
    pip install seaborn && \
    pip install hyperopt && \
    pip install optuna && \
    pip install missingno && \
    pip install mlxtend && \
    pip install catboost && \
    pip install kaggle && \
    pip install folium && \
    pip install librosa && \
    pip install nbconvert && \
    pip install Pillow && \
    pip install tqdm && \
    pip install wordcloud

RUN apt-get update

RUN apt-get install -y graphviz && \
    apt-get install -y graphviz-dev && \
    pip install pygraphviz

RUN apt-get update

RUN pip install graphviz && \
    pip install cupy-cuda11x

RUN pip install -U "ipython[all]"

RUN pip install jupyter jupyterlab notebook jupyterthemes ipywidgets

ENV PATH=/usr/local/bin:${PATH}

# 나눔고딕 폰트 설치
# matplotlib에 Nanum 폰트 추가
RUN apt-get update && apt-get install fonts-nanum*
RUN mkdir -p /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf && \
    cp /usr/share/fonts/truetype/nanum/Nanum* /opt/conda/envs/py39/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf/ && \
    fc-cache -fv && \
    rm -rf ~/.cache/matplotlib/*


RUN apt-get update

ENV LANG ko_KR.UTF-8

# 기본
EXPOSE 8888 

빌드 및 이미지 저장

이제 빌드해보자

docker build -f (도커 파일 이름) -t (만들고 싶은 이미지 명) .

참고로 이미지 명은
(도커 ID)/기타 설명:버전
이런식으로 만들어야 도커 허브에 업로드 할 때 문제가 생기지 않는다.

docker build -f basepython.Dockerfile -t chaosapic/base_python:latest .

이러면 이미지가 생성된다.

jupyter 서버 실행

이제 jupyter 서버를 실행해 보자.

docker run -itd -p 8888:8888 -v (호스트의 폴더 경로):/home/jupyter (이미지 명) jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.password= --notebook-dir=/home/jupyter

그리고 docker ps를 치면

CONTAINER ID   IMAGE                          COMMAND                  CREATED         STATUS         PORTS                    NAMES
9c9a0e250b8e   chaosapic/base_python:latest   "jupyter notebook --…"   4 seconds ago   Up 4 seconds   0.0.0.0:8888->8888/tcp   clever_hellman

이런식으로 정상적으로 실행준인 모습을 볼 수 있고

docker logs (컨테이너 ID)를 치면

이렇게 jupyter 서버의 주소가 나온다 이것을 치고 들어가면

서버에 잘 들어가지는 것을 확인 할 수 있다.

그리고 파일을 하나 만들어 패키지 설치와 폰트 설치 확인을 해 보면

잘 설치가 된 것을 확인 할 수 있다.

그리고 마운트도 확인해 보면

잘 된것을 확인 할 수 있다!

vscode와 연동하기

만약 jupyter는 서버로만 열고, 작업은 vscode에서 하고 싶다면

  1. vscode jupyter 파일의 오른쪽에 커널선택
  2. 기존 jupyter 서버
  3. jupyter 서버의 주소를 입력한다.

그러면 이렇게 jupyter 서버와 연결된 것을 볼 수 있다.

profile
코딩 공부하는 사람

0개의 댓글