はじめに

以前にvenvを使った仮想環境の構築について記事を書いたことがあるが、コンテナ内にPython環境を構築して外部からそこにアクセスする使い方は自分で試した事がなかったため、今回はそれを試してみる。

実行環境

【Docker導入環境】
・Ubuntu 20.04 LTS(GCP上)
・docker 19.03.13
・docker-compose 1.25.0

手順

1.環境準備
2.コンテナ構築用のDockerfile作成(2つ)
3.docker-compose.ymlでコンテナ起動
4.操作確認

1.環境準備

GCP上にVMインスタンスを作成
※イメージはUbuntu20.4 LTS

パッケージ管理ツールのアップデート

$ sudo apt update
$ sudo apt -y upgrade

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

docker-composeのインストール

$ sudo apt install -y docker-compose 

問題なくインストールできているか確認

$ docker-compose --version
docker-compose version 1.25.0, build unknown

2.コンテナ構築用のDockerfile作成(2つ)

Dockerfile格納用のディレクト作成

$ sudo mkdir ./con1
$ sudo mkdir ./con2

Dockerfileの作成

コンテナ1のDockerfile作成

$ sudo nano ./con1/Dockerfile
# ベースイメージの取得
FROM python:3

# 適当にパッケージのインストール
RUN pip install jupyter notebook
RUN pip install numpy

# マウント用のディレクトリを作成
RUN mkdir /root/analysis

##########################
# コンフィグファイルの設定#
##########################

RUN jupyter notebook --generate-config
# ⇒このコマンドにより [/root/.jupyter/jupyter_notebook_config.py] が生成される

# jupyter-notebook上のホワイトリストを許可(ホスト側でファイウォールを設定するためOK)
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_notebook_config.py

# 初期ディレクトリの設定
RUN echo "c.NotebookApp.notebook_dir = '/root/analysis'" >> /root/.jupyter/jupyter_notebook_config.py

# パスワード認証 or Token認証を無効化(公式では非推奨)
RUN echo "c.NotebookApp.token = ''" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.password = ''" >> /root/.jupyter/jupyter_notebook_config.py

# ポート開放
EXPOSE 8888

CMD ["jupyter", "notebook","--allow-root"]

コンテナ2のDockerfile作成(インストールパッケージ以外1と同じ)

$ sudo nano ./con2/Dockerfile
# ベースイメージの取得
FROM python:3

# 適当にパッケージのインストール
RUN pip install jupyter notebook
RUN pip install pandas

# マウント用のディレクトリを作成
RUN mkdir /root/analysis

##########################
# コンフィグファイルの設定#
##########################

RUN jupyter notebook --generate-config
# ⇒このコマンドにより [/root/.jupyter/jupyter_notebook_config.py] が生成される

# jupyter-notebook上のホワイトリストを許可(ホスト側でファイウォールを設定するためOK)
RUN echo "c.NotebookApp.ip = '0.0.0.0'" >> /root/.jupyter/jupyter_notebook_config.py

# 初期ディレクトリの設定
RUN echo "c.NotebookApp.notebook_dir = '/root/analysis'" >> /root/.jupyter/jupyter_notebook_config.py

# パスワード認証 or Token認証を無効化(公式では非推奨)
RUN echo "c.NotebookApp.token = ''" >> /root/.jupyter/jupyter_notebook_config.py
RUN echo "c.NotebookApp.password = ''" >> /root/.jupyter/jupyter_notebook_config.py

# ポート開放
EXPOSE 8888

CMD ["jupyter", "notebook","--allow-root"]

3.docker-compose.ymlでコンテナ起動

Notebook起動時の初期ディレクトリをホスト側に準備
※初期ディレクトリは、各コンテナ毎にマウント先を指定したいたいめ。

$ sudo mkdir ./con1/analysis_file
$ sudo mkdir ./con2/analysis_file

docker-compose.ymlの作成

$ sudo nano ./docker-compose.yml
version: '3.7'

services:
  python1:
    build:
      context: ./con1
      dockerfile: Dockerfile
    volumes:
      - ./con1/analysis_file:/root/analysis
    ports:
      - 8080:8888

  python2:
    build:
      context: ./con2
      dockerfile: Dockerfile
    volumes:
      - ./con2/analysis_file:/root/analysis
    ports:
      - 8081:8888

4.操作確認

全サービスの起動

$ docker-compose up

※初回起動時は、ビルドやイメージのダウンロードが自動で開始される。

以下のURLにアクセスして、認証なしでnotebookが開くか確認する。
http://[VMの外部IP(グローバルIPアドレス)]:8080/
http://[VMの外部IP(グローバルIPアドレス)]:8081/

試しにport:8080で開かれるnotebookでimportコマンドを実行してみると、./con1/Dockerfileでパッケージインストールされていないものはできないはず。

また、作成したファイルはホスト側のディレクトリをマウントしていて、そこをjupyter noteobookの初期ディレクトリに設定しているため、作成ファイルはホスト側上で永続化されるはず。

广告
将在 10 秒后关闭
bannerAds