前回(前回記事「[基礎知識]Docker上のAnacondaコンテナをGUI(Anaconda Navigator)で使用する手順〔Dockerfile単体ビルド〕編)で使用する手順」)では、DockerfileだけでDockerイメージを作成し、その後、docker run コマンドによりコンテナ作成、起動を行いました。
今回は、Dockerfile、docker-compose.ymlを使用し(今回は「Windows作業フォルダをコンテナ内部のフォルダにマウントして起動させる設定」も追加して)同じ手順を流してみました。
しかし、せっかくymlファイル設定内容で一度に作成できるコンテナは、起動直後に即終了してしまう、という障害が発生し、いろいろ試したのですが、解決できませんでした。
結局、作成された基本イメージを元にして、runコマンドでDISPLAYオプションでGUI設定を行って、都度、コンテナを作成・起動する、という手順で現在運用しています。
以下はその作業記録です。
1.Dockerfileの作成
※詳細は前回記事「[基礎知識]Docker上のAnacondaコンテナをGUI(Anaconda Navigator)で使用する手順〔Dockerfile単体ビルド〕編)で使用する手順」参照
2.docker-compse.ymlの作成
※Dockerfileだけでもanacondaコンテナは作成可能だが、
作成されるイメージファイル名
作成されるコンテナ名
ローカル環境フォルダをコンテナ内にマウント
等の設定を行ったり、他サービスのコンテナ作成を一度に実施できる。
# 各コンテナ構築・設定 # Docker Compose バージョン version: "3" # ↓サービス(各コンテナ)定義 services: # サービル(コンテナ) anaconda: # Dockerイメージのビルド時設定 build: # ※Docker Compose 実行 と同じ場所の Dockerfileを使用する、という設定 context: . # Dockerfile: ビルドで使用するDockerfileのファイル名 dockerfile: Dockerfile # 作成されるイメージファイル名 image: anaconda-gui-mount-image # ホストマシンの8000番ポートがコンテナ内の8000番ポートにマッピングされます。 ports: - "8000:8000" # 作成されるコンテナ名 container_name: anaconda-gui-container02 # コンテナ内の環境変数指定 environment: # タイムゾーン TZ: "Asia/Tokyo" # コンテナがホストのXサーバに接続できるようにします。 DISPLAY: host.docker.internal:0.0 # コンテナを実行するプラットフォームの指定 # ※windowsのamd64アーキテクチャ ※上手くいかないのでコメント #platform: windows/amd64 # ホストマシン(ローカルコンピュータ)のコンテナ内への # (コンテナ初期化時実行)マウント設定 volumes: - C:/app:/app # 他サービス(MySQL等) ※もしあれば以下に追記する
3.Dockerイメージ・コンテナのビルド・起動
以下のコマンドでイメージ・コンテナのビルド・起動まで実施される。
※障害:
起動直後即終了してしまう、という障害あり
各設定ファイル作成・変更後の最初のイメージを作成時と、
それ以外の再作成時とでは、–build オプションの有無が異なる。
・docker-compose up – -build -d
※最初の実行、またはDockerfileに変更があった場合、
–build オプションを使用してイメージを強制的にビルド。
・docker-compose up -d
※Dockerfileに変更がない場合、次回以降の再作成の場合、
つまり指定されたイメージ名のイメージが既に存在する場合、
そのイメージを再利用してコンテナを起動する。
※変更があったにも関わらず上記オプション無しで実行時は以下のエラー表示あり
※作成されたDockerイメージ:
※作成されたDockerコンテナ(及びネットワーク)
※イメージ名、コンテナ名は、docker-compose.yml設定通り。
※ネットワーク名は、上記「設定ファイル格納フォルダ」名を使用。
4.Anacondaコンテナの実行
・docker start -ai <上記作成済anacondaコンテナ名>
※docker start -ai anaconda-gui-container02
実例:
>docker start -ai anaconda-gui-container02 (base) root@4e1a4fde72e7:/# ※障害記録: ・上記コマンドでコンテナが実行できない状況が発生した。 ・log未作成、Exited状態であったことから、コンテナは即座に終了していたことになる。 ・次のコマンドで別名コンテナを作成・起動出来たことから、基本イメージに問題はないと思われる。 ・上記から、ymlファイル(後から追加した内容)に問題ありと、推測された。 ・結局(ここで作成されたコンテナは使わず)以下のrunコマンドで、基本イメージから再度作成・起動する、という運用になってしまっています。 ・つまり、ymlファイルによるDISPLAY設定は、今回失敗、ということになります。 ・とはいえ、ymlファイルによって、他のサービス(MySQLコンテナ等)を一括でコンテナ作成までできる、というメリットもあり、本手順は記録として残してあります。
・docker run -it –name <作成・実行するコンテナ名>
-e DISPLAY=host.docker.internal:0.0 <元にする基本イメージ>
※一応、上記コマンドで作成したコンテナであれば、停止後も、
docker start -ai <上記作成済anacondaコンテナ名>
により、起動でき、内容も保存されていました。
※後日ポートマッピング設定追加:
docker run -it -p 8000:8000 –name anaconda-dockerfile-gui-container -e DISPLAY=host.docker.internal:0.0 anaconda-gui-mount-image:latest
※GUIアプリケーションを実行するための設定とともにコンテナを作成・起動しています。
※コンテナ起動状態確認:
・docker ps
5.Windows側でXサーバの起動
手順:
別記事「[基礎知識]Docker上のAnacondaコンテナをGUI(Anaconda Navigator)で使用する手順〔Dockerfile単体ビルド〕編」(4章)参照
※補足:
今回途中設定最終画面の付加パラメータ欄に” -ac “を設定しています。
6.Anaconda Navigator起動
上記手順「4.Anacondaコンテナの実行」で起動したコンテナ内で、以下を実行。
>docker start -ai anaconda-gui-container02 ←この表示が既に表示されている一行↓
(base) root@4e1a4fde72e7:/# (ここに、anaconda-navigatorと入力実行)
・anaconda-navigator
実例:
↓
※Anaconda Navigator起動
以上で、Anacondaコンテナから(Xサーバ経由で)GUI(Anaconda Navigator)を起動して管理する環境の作成は完了。
7.Anacondaコンテナ内部シェルに接続
・docker exec -it <anacondaコンテナ名> /bin/bash
※docker exec -it anaconda-gui-container02 /bin/bash
実例:
※Anacondaコンテナのベースイメージによっては、/bin/bash
の代わりに/bin/sh
を使用する必要あり。
※これでコンテナ内部に入ることができました。
conda、env等のコマンドを使用することができます。
※exitコマンドで、コンテナのシェルを終了します。
Anaconda PowerShellを使用することは、Dockerコンテナの内部では難しいですが、上記の手順でシェルを通じて必要な操作を行うことができます。