DockerでUbuntu+Python3.9+JupyterLab3+SSHdなイメージを作る

以下

ポイントとしては、

- 日本語化している
- SSHサーバが起動している
- Miniconda + conda-forge リポジトリを利用している
- Jupyter Lab に Rubyカーネルが追加されている
- Jupyter Lab に すぐに Perlカーネルを追加できる

セキュリティ的にはいろいろNGかと。


```dockerfile:Dockerfile
FROM ubuntu

# 管理ユーザ名
ARG user="[管理ユーザ名]"
# 管理ユーザパスワード
ARG pass="[管理ユーザ名のパスワード]"
# パッケージのインストール時に警告を出さない
ENV DEBIAN_FRONTEND=noninteractive \
    DEBCONF_NOWARNINGS=yes
# rootにパスワードを設定
RUN echo "root:[rootパスワード]" | chpasswd \
\
# パッケージのインストール
    && apt-get update -y \
    && apt-get upgrade -y \
    && apt-get install -y \
        cpanminus \
        curl \
        git \
        less \
        libczmq-dev \
        libffi-dev \
        libtool \
        libzmq3-dev \
        locales \
        make \
        openssh-server \
        perl \
        ruby \
        ruby-dev \
        sudo \
        tzdata \
        vim \
        wget \
    && apt-get clean -y \
    && rm -rf \
        /var/lib/apt/lists/* \
        /var/cache/apt/* \
        /usr/local/src/* \
        /tmp/* \
\
# 日本語環境の設定
    && locale-gen ja_JP.UTF-8 \
    && echo "export TZ=Asia/Tokyo" > /etc/profile.d/ja_tokyo.sh \
    && echo "export LANG=ja_JP.UTF-8" >> /etc/profile.d/ja_tokyo.sh \
    && echo "export LANGUAGE=ja_JP:ja" >> /etc/profile.d/ja_tokyo.sh \
\
# SSHサーバの設定
    && mkdir /var/run/sshd \
    && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config.d/root_pwd.conf \
    && echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config.d/root_pwd.conf \
    && echo "UseDNS no" >> /etc/ssh/sshd_config.d/root_pwd.conf \
\
# Minicondaのインストール
    && curl -LO https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && bash ./Miniconda3-latest-Linux-x86_64.sh -bfp /opt/miniconda \
    && rm -f ./Miniconda3-latest-Linux-x86_64.sh \
    && echo 'PATH="/opt/miniconda/bin:$PATH"' >> /etc/profile.d/miniconda.sh \
\
# Pythonモジュールをcondaでインストール
    && . /etc/profile.d/miniconda.sh \
    && conda config --add channels conda-forge \
    && conda config --remove channels defaults \
    && conda install -y python=3.9 \
    && conda update -y conda \
    && conda update -y --all \
    && conda install -y \
        imageio \
        ipywidgets \
        jupyterlab \
        matplotlib \ 
        numpy \
        nodejs \
        openpyxl \
        pandas \
        scikit-learn \
        scipy \
        seaborn \
        xeus-python \
    && conda clean -y --all \
\
# condaでインストールできないモジュールをpipでインストール
    && python -m pip install \
        japanize-matplotlib \
        mglearn \
    && rm -rf /root/.cache \
\
# JupyterLabの設定
    && mkdir /etc/jupyter \
    && echo "c = get_config()" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.allow_remote_access = True" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.allow_root = True" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.ip = '0.0.0.0'" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.open_browser = False" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.port = 8888" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.NotebookApp.token = ''" >> /etc/jupyter/jupyter_notebook_config.py \
    && echo "c.LabBuildApp.minimize = False" >> /etc/jupyter/jupyter_notebook_config.py \
\
# JupyterLabの拡張機能のインストール
    && . /etc/profile.d/miniconda.sh \
    && jupyter labextension install \
        @jupyterlab/debugger \
        @jupyterlab/toc \
    && jupyter labextension update --all --minimize=False \
    && jupyter lab build --minimize=False \
\
# JupyterにRubyカーネルを追加
    && gem install \
        cztop \
        iruby \
    && iruby register --force \
\
# JupyterにPerlカーネルを追加
# (これだけでは追加できない, コンテナ内で iperl notebook を初回のみ実行することが必要)
    && cpanm Devel::IPerl --notest \
\
# ユーザ作成
    && adduser -q --gecos "" --disabled-login ${user} \
    && usermod -aG sudo ${user} \
    && echo "${user}:${pass}" | chpasswd

# 作業ディレクトリ
WORKDIR /root/
# 使用ポート
EXPOSE 22 8888

# SSHサーバを起動する
CMD ["/usr/sbin/sshd", "-D"]
```

Dockerコマンドの例 (Dockerfileのあるディレクトリで実行)

```bash
# イメージ作成
docker image build --tag ubuntu/py/sshd:20210328 .

# コンテナをバックグラウンドで起動
docker container run --rm -d --name ubuntu_py_sshd -h ubuntu -p 33322:22 -p 38888:8888 ubuntu/py/sshd:20210328

# コンテナにログイン
docker container exec -it ubuntu_py_sshd bash --login

# JupyterにPerlのカーネルを追加する(初回1回のみ, 正常にrunningしているのを確認を終了)
iperl notebook
# JupyterLabを起動
jupyter lab --no-browser

# コンテナを停止して削除
docker container stop ubuntu_py_sshd
```