Home / インフラ / Docker / Docker ComposeでAnacondaの環境を構築する

Docker ComposeでAnacondaの環境を構築する方法をまとめました。

目次

  1. docker-compose.ymlを作成する
  2. Dockerfileを作成する
  3. イメージをビルドする
  4. コンテナを起動する
  5. コンテナの起動状態を確認する
  6. ブラウザでJupyter Notebookにアクセスする
  7. インストール済みのパッケージを確認する
  8. Jupyter Notebookの動作確認をする
  9. コンテナを破棄する
  10. イメージを破棄する

docker-compose.ymlを作成する

docker-compose.ymlにコンテナ起動時の情報を指定します。

version: "3"

services:
  jupyter:
    build:
      context: .
      dockerfile: Dockerfile
    working_dir: /notebooks
    volumes:
      - $PWD:/notebooks
    ports:
      - 8888:8888
    command: jupyter notebook --ip 0.0.0.0 --port=8888 --allow-root --no-browser --NotebookApp.token=''

Dockerfileを作成する

Dockerfileにイメージ作成時の情報を指定します。

RUNで指定している conda installコマンドでインストールするパッケージと、-cオプションでそのパッケージのインストール元のリポジトリを指定します。

FROM continuumio/anaconda3

RUN conda install -y -n base ipykernel --update-deps --force-reinstall &&\
    conda install -y -c conda-forge matplotlib tensorflow &&\
    conda install -y -c anaconda jupyter pandas scikit-learn seaborn

イメージをビルドする

docker compose buildコマンドでイメージをビルドします。

--no-cacheオプションを指定すると、キャッシュの利用を無効にすることができ、イメージの更新が反映されないなどの不具合を回避することができます。

% docker compose build --no-cache
[+] Building 9871.0s (6/6) FINISHED
 => [jupyter internal] load build definition from Dockerfile                                                                      1.5s
 => => transferring dockerfile: 415B                                                                                              0.8s
 => [jupyter internal] load .dockerignore                                                                                         1.1s
 => => transferring context: 2B                                                                                                   0.7s
 => [jupyter internal] load metadata for docker.io/continuumio/anaconda3:latest                                                   0.0s
 => CACHED [jupyter 1/2] FROM docker.io/continuumio/anaconda3                                                                     0.0s
 => [jupyter 2/2] RUN conda install -y -n base ipykernel --update-deps --force-reinstall &&    conda install -y -c conda-forg  9667.1s
 => [jupyter] exporting to image                                                                                                201.8s
 => => exporting layers                                                                                                         201.7s
 => => writing image sha256:78180cb1180860985d25aba78e3b8840b9aa18b666148b7b4412c0a86e70012c                                      0.0s
 => => naming to docker.io/library/anaconda-jupyter                                                                               0.1s

コンテナを起動する

docker compose upコマンドでコンテナを起動します。

-dオプションを付けると、コンテナをバックグラウンドで実行することができます。

% docker compose up -d
[+] Building 0.0s (0/0)
[+] Running 1/1
 ✔ Container anaconda-jupyter-1  Started                                                                                          0.5s

コンテナの起動状態を確認する

docker compose psコマンドでdocker-compose.ymlに関連する起動状態のコンテナを確認します。

% docker compose ps
NAME                 IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
anaconda-jupyter-1   anaconda-jupyter    "jupyter notebook --…"   jupyter             4 minutes ago       Up 7 seconds        0.0.0.0:8888->8888/tcp

ブラウザでJupyter Notebookにアクセスする

ブラウザでhttp://localhost:8888/にアクセスし、Jupyter Notebookが正常に起動しているか確認します。

インストール済みのパッケージを確認する

docker compose execコマンドでコンテナ内に入り、conda listコマンドでインストール済みのパッケージを確認します。

下記にDockerfileで指定したパッケージを抜粋したものを掲載します。

# コンテナ内に入る
% docker compose exec jupyter /bin/bash

# インストール済みのパッケージを確認
(base) root@48a8b818830a:/notebooks# conda list
# packages in environment at /opt/conda:
#
# Name                    Version                   Build  Channel

jupyter                   1.0.0           py310h06a4308_8    anaconda
jupyter_client            8.1.0           py310h06a4308_0
jupyter_console           6.4.4           py310h06a4308_0    anaconda
jupyter_core              5.3.0           py310h06a4308_0
jupyter_server            1.23.4          py310h06a4308_0    anaconda
jupyterlab                3.5.3           py310h06a4308_0    anaconda
jupyterlab_pygments       0.1.2                      py_0    anaconda
jupyterlab_server         2.16.5          py310h06a4308_0    anaconda
jupyterlab_widgets        1.0.0              pyhd3eb1b0_1    anaconda

keras                     2.12.0             pyhd8ed1ab_0    conda-forge

matplotlib                3.7.1           py310hff52083_0    conda-forge
matplotlib-base           3.7.1           py310h1128e8f_1
matplotlib-inline         0.1.6           py310h06a4308_0

numpy                     1.22.3          py310h4ef5377_2    conda-forge

pandas                    1.5.2           py310h1128e8f_0    anaconda

python                    3.10.11              h7a1cb2a_2
python-dateutil           2.8.2              pyhd3eb1b0_0
python-fastjsonschema     2.16.2          py310h06a4308_0
python-flatbuffers        23.5.26            pyhd8ed1ab_0    conda-forge
python-libarchive-c       2.9                pyhd3eb1b0_1
python_abi                3.10                    2_cp310    conda-forge

scikit-learn              1.2.0           py310h6a678d5_1    anaconda

scipy                     1.8.1           py310h7612f91_0    conda-forge

seaborn                   0.12.2          py310h06a4308_0    anaconda

tensorboard               2.12.1          py310h06a4308_0
tensorboard-data-server   0.7.0           py310h52d8a92_0
tensorboard-plugin-wit    1.8.1              pyhd8ed1ab_0    conda-forge
tensorflow                2.12.0          mkl_py310hc7ea715_0
tensorflow-base           2.12.0          mkl_py310he5f8e37_0
tensorflow-estimator      2.12.0          py310h06a4308_0

Jupyter Notebookの動作確認をする

Jupyter Notebook上でインストール済みのパッケージのバージョンを確認して、動作確認をします。

import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
import pandas as pd
import platform
import seaborn as sb
import sklearn

!jupyter-notebook --version
!python -V

print(platform.platform())
print(tf.__version__)
print(np.__version__)
print(pd.__version__)
print(sb.__version__)
print(sklearn.__version__)

6.5.2
Python 3.10.11
Linux-5.15.49-linuxkit-pr-x86_64-with-glibc2.31
2.12.0
1.22.3
1.5.2
0.12.2
1.2.0

コンテナを破棄する

コンテナが不要になった場合は、docker compose downコマンドでコンテナを破棄します。

コンテナを破棄した後にdocker compose ps -aコマンドでdocker-compose.ymlに関連するすべてのコンテナの一覧を表示し、コンテナが正常に破棄されたか確認します。

# コンテナを破棄
% docker compose down
[+] Running 2/2
 ✔ Container anaconda-jupyter-1  Removed                                                                                          0.2s
 ✔ Network anaconda_default      Removed                                                                                          0.2s

# コンテナの破棄を確認
% docker compose ps -a
NAME                IMAGE               COMMAND             SERVICE             CREATED             STATUS              PORTS

イメージを破棄する

イメージが不要になった場合は、docker rmiコマンドでイメージを破棄します。

docker imagesコマンドで破棄するイメージのイメージIDを確認し、そのイメージIDをdocker rmiコマンドに指定してイメージを破棄します。

イメージを破棄したら再度docker imagesコマンドを実行し、イメージが正常に破棄されたか確認します。

# 破棄するイメージのイメージIDを確認
% docker images
REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
continuumio/anaconda3   latest    c8f78af31723   3 weeks ago      4.3GB

# イメージを破棄
% docker rmi c8f78af31723
Untagged: continuumio/anaconda3:latest
Untagged: continuumio/anaconda3@sha256:6697f6ab7d940e557562c2d7c120bf8ef23f9392a0a3145dc5bc74d2ffe18519
Deleted: sha256:c8f78af317230f4e72d7e9544b573372f7310b0269480589a689cc6f9e4e944b

# イメージの破棄を確認
% docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

参考