LoginSignup
3
3

More than 3 years have passed since last update.

python&jupyterlabのコンテナ構築

Last updated at Posted at 2021-01-07

はじめに

Jupyterlabを使いPython環境を利用するコンテナを構築したので、その時の手順をメモとして残しておく。

実行環境

【Docker導入環境】
  ・Ubuntu 18.04 LTS(GCP上)
  ・docker 19.03.13

手順

1.環境準備
2.Pythonコンテナを構築
3.SSHサーバー機能を追加
4.JuypterlabとSSHの同時起動

1.環境準備

GCP上にVMインスタンスを作成

dockerのインストール
 【Dockerコンテナ内のUbuntuではsystemctlは使えない】の手順1を参考に。

2.コンテナ構築

ベースイメージを取得

$ docker image pull python:3

コンテナを作成

$ docker container run -it -d --name python-con1 python:3

起動中コンテナの中に入り、いくつかのパッケージをインストール

$ docker container exec -it python-con1 /bin/bash
コンテナ内で実行するコマンド
# パッケージをインストール
pip install numpy pandas jupyterlab

# コンテナから出る
exit

変更後のコンテナイメージを作成

# コンテナの停止
$ docker container stop python-con1

# 現在のコンテナをイメージ化
$ docker container commit python-con1 python-img:ver1

イメージが作成できている事を確認

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
python-img   ver1      34ad01ba7efb   41 seconds ago   1.19GB
python       3         d1eef6fb8dbe   2 weeks ago      885MB

作成したイメージから再度コンテナを作成する。
 ※その際に、ポートマッピングやホスト側のディレクトリをマウント

$ docker container run -it -d \
-p 8888:8888 \
#-v
--name python-con2 python-img:ver1
# jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

コンテナに入りJuypterlabを起動。
 ※上記のコンテナ作成のタイミングで起動しても良い。(コメントアウト部分)

$ docker container exec -it python-con2 /bin/bash
コンテナ内で実行するコマンド
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

この状態でホスト側の8888番ポートにアクセスして、juypterlabが開かれれば問題なし。
 ※ホスト側の8888番ポートは開放しておく。
 
ここまで確認できたら、コンテナは一旦削除。

3.SSHサーバー機能を追加

各コンテナに対して直接操作を行える様にするためにSSHサーバーもインストールし、SSH接続ができる状態にしておく。

# コンテナ作成
$ docker container run -it -d --name python-con2 python-img:ver1

# コンテナに入る
$ docker container exec -it python-con2 /bin/bash 
コンテナ内で実行するコマンド
apt update
apt install -y openssh-server
apt install nano

サービスの起動に必要なフォルダを作成、共通鍵の登録
※鍵の生成はTera Termなどでしておく。今回はrootユーザーでアクセスする想定。

コンテナ内で実行するコマンド
mkdir /var/run/sshd
mkdir /root/.ssh/
nano /root/.ssh/authorized_keys
# 鍵の中身は公開鍵の[.pub]ファイルの中身をコピー

変更後のコンテナイメージを作成

# コンテナの停止
$ docker container stop python-con2

# 現在のコンテナをイメージ化
$ docker container commit python-con2 python-img:ver2

イメージが作成できている事を確認

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
python-img   ver1      34ad01ba7efb   41 seconds ago   1.19GB
python       3         d1eef6fb8dbe   2 weeks ago      885MB

作成したイメージから再度コンテナを作成する。
 ※その際に、ポートマッピングやホスト側のディレクトリをマウント

$ docker container run -it -d \
-p 8888:8888 \
-p 20022:22 \
--name python-con3 python-img:ver2 \
/usr/sbin/sshd -D

この状態で、ローカルPCのTera Termなどからdockerホストの20022ポートにSSH接続できれば正常に動いている。
 ※ホスト側のポートを開放しておくこと。

4.JuypterlabとSSHの同時起動

JuypterLabSSHサーバが立ち上がるshファイルを作成しておき、コンテナ作成時のCMD上書き命令で、そのshファイルを実行する事でコンテナの再起動時に毎回自動でサービスが立ち上げる様にしたかったが、上手くいかなかった。
原因はshファイル自体が実行完了するとコンテナが落ちてしまうため。無限ループする様なshファイルも試してみたが、結局うまく行かなかったので別の方法で実施することにした。

まずは下記のコマンドでコンテナを作成し、コンテナ起動のタイミングでSSHサービスが立ち上がる様にしておく。

docker container run -it -d \
-p 8888:8888 \
-p 20022:22 \
--name 【任意のコンテナ名】 python-img:ver2 \
/usr/sbin/sshd -D

そして、その後SSH接続して以下のコマンドを実施する。

jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=""

 ※別ブラウザで立ち上げたコンソールからコンテナに入って上記のコマンドを実行しても良いが、個人的には上記のやり方の方が一手間少ないと思う。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3