Docker + Jupyter + 한글 폰트
matplotlib에서 한글을 쓸 때 문제가 없도록 하는 패키지가 등장했다. 개발자 분에게 무한 감사를 표하면서 repo를 깔아 쓰도록 하자.
Build도 어렵지 않다!
이 글은 이 포스팅에서 이어진다. 컨테이너를 올린 뒤 컨테이너 내 터미널에서 sh 스크립트를 실행하지 않고 한글 문제 처음부터 해결할 수 없을까?
사실 이 포스팅을 쓰게 된 동기는 따로 있다. 글을 쓰는 시점에서 matplotlib.font_manager._rebuild()
가 사라졌다! Jupyter에서 폰트 목록을 다시 생성할 다른 방법을 찾아야 했다. docker-compose로 필요한 이미지를 끌어올 때 단순히 이미지를 끌어오는 대신 특화된 형태로 build를 할 수도 있다. 이전 포스팅에서 소개한 방법에서는 build 옵션을 사용하지 않았다. 일단 Build가 꽤 거창하게 느껴졌기 때문이다. 적당한 ubuntu 버전을 끌어오고 여기에 Python, Jupyter를 깔고… 이런 빌드 과정이 꽤 험난하고 불필요해 보였다. Jupyter의 경우 데이터사이언스를 위한 잘 갖춰진 도커 이미지가 이미 있고, 이를 그대로 쓰면 큰 문제는 없다.
문제가 생겼으니 해결책을 찾아야 한다. 특화된 이미지에 기반해서 빌드를 하면 한글 문제와 같은 특정하게 발생하는 문제를 미리 해결할 수 있지 않을까? 이후 소개하는 방법을 통해 확인한 내용은 다음과 같다. 이용 조건이 비슷하다면 참고해보시라.
- docker-compose를 쓸 때 이미지를 지정하는 image 부분을 제외한 나머지는 거의 그대로 재사용이 가능하다.
- image를 그대로 끌어오는 것이나 몇 가지 명령어를 넣어서 build를 하는 것이나 시간 상으로는 크게 차이가 없다.
How to Implement
본론이다.
- docker-compose를 위한 file이 있는 디렉토리 아래 dockerfiles 디렉토리를 하나 더 만든다 (디렉토리 이름은 각자 알아서). 여기에 docker build를 위한 파일을 넣어어둔다.
- docker-compose용 파일을 약간 수정한다.
실행 환경
- Windows 10 WSL 2 + Ubuntu 20.04
- Docker for Desktop (Windows)
- 도커를 쓰지 않더라도 dockerfiles과 호환되는 빌드 체계를 갖추고 있다면 응용이 가능하다.
dockerfiles
데이터 사이언스를 위한 Jupyter docker 파일을 예시로 들겠다. 다른 이미지라면 응용해서 쓰면 된다.
FROM jupyter/datascience-notebook:latest
# Declare root as user
USER root
# Update Ubuntu
RUN sed -i 's/archive.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list && sed -i 's/security.ubuntu.com/mirror.kakao.com/g' /etc/apt/sources.list
# Install Nanum for Korean Font
RUN apt-get update && apt-get -y upgrade && apt-get install -y fonts-nanum* && fc-cache -fv && rm -fr ~/.cache/matplotlib
FROM jupyter/datascience-notebook:latest
끌어올 이미지를 지정한다.USER root
이미지 내에서 root 권한을 부여한다. 이후 sudo는 안 써도 된다.RUN sed -i...
끌어온 우분투 이미지가 미국 기준이기 때문에 업데이트 서버 주소 역시 미국이다. 이걸 국내에서 가장 안정적이고 빠른 카카오 서버로 바꾼다.RUN apt-get update && apt-get -y upgrade...
- 우분투 배포판의 업데이트 및 업그레이드를 실행한다.
- 나눔 폰트를 깔아준다.
- docker 이미지 배포판의 폰트 캐시를 지운다.
- Jupyter의 폰트 캐시를 지운다.
- 우분투 배포판의 업데이트 및 업그레이드를 실행한다.
docker-compose.yml
docker-compose를 위한 yml을 예시한다. 이 내용 역시 각자 환경에 맞게 변형해서 쓰면 된다. 파일 이름을 “docker-jupyter.yml”이라고 하자.
version: '3'
#
services:
#
jupyter-ds:
build:
context: .
dockerfile: ./dockerfiles/dockerfile-jupyter
user: root
environment:
- GRANT_SUDO=yes
- JUPYTER_ENABLE_LAB=yes
- JUPYTER_TOKEN={YOUR-PASSWORD}
volumes:
- /mnt/c/Users/{YOUR-DIR}:/home/jovyan/github-anari
ports:
- "8888:8888"
container_name: "jupyter-ds"
# End of yml
- 위의 yml 파일에서 “{}”로 처리된 부분은 각자 채워 넣으면 된다.
- image 대신 build 명령어를 사용했다. 앞서 지정한 dockerfiles 디렉토리 내의 도커 명령어를 통해 빌드를 수행한다. 이렇게 빌드된 이미지는 처음부터 matplotlib 사용 시 한글 구현에 아무런 문제가 없다.
주피터 환경의 파이썬 그리고 주피터 혹은 R스튜디오 환경의 R에서 한글 설정 방법 및 간단한 테스트는 여기를 참고하자.
도커 컴포즈를 실행하는 방법은 아래와 같다.
$ sudo docker-compose -f /mnt/{YOUR DIR}/docker-jupyter.yml -p "jupyter-ds" up -d
실행 옵션은 다음과 같다. 역시 “{}”는 각자의 환경에 맞게 바꾸면 된다.
-f
도커 콤포즈를 특정 파일로 실행하기 위한 옵션이다. 만일 이를 안쓰려면 yml 파일의 이름을docker-compose.yml
로 두고 해당 디렉토리 안에서 실행하면 된다.-p
콤포즈 안에 묶인 서비스의 이름을 나타낸다. 같은 네트워크로 묶이며 이 이름을 네트워크 이름으로 갖는다.up
yml 내에 있는 포함된 콘테이너를 가동한다.-d
디태치 모드, 즉 별도의 실행되는 과정으로 실행한다.