Orthanc を使ってみた
医療用画像の規格である DICOM をお使いの皆さん、Orthanc ってご存知でしょうか。私も最近知って使ってみたのですが、とても便利ですよね!
Orthanc の公式サイトでは「Open-source, lightweight DICOM server.」とうたっています。まさにこの通りで、とても簡単に構築でき、トラブルもなく大変便利に使っています。REST API や Lua 言語によるスクリプトも組めるし、フリーだし、素晴らしいです。数百 Study の MRI を溜め込んでますが、今の所トラブルフリーです。
この記事は試しに Orthanc を少々使ってみた、個人的備忘録的にまとめてみものです。
参考にした web site
本家:https://www.orthanc-server.com/
説明書 (Orthanc book):https://book.orthanc-server.com/
サーバ環境の整備
私の環境
今回使用した環境はこちら
- OS: Ubuntu 20.04.2 LTS
- Docker version 20.10.8
- Mozilla Firefox 90.0.2
Docker rootless
まずはこちらの公式サイトの手順で Docker を整備しました。
https://docs.docker.com/engine/install/ubuntu/
さらに Docker rootless の環境を用意しました。これも公式サイトの手順で OK でした。「Caution: This is experimental function. Please use carefully.」とあるので注意します。
https://docs.docker.jp/engine/security/rootless.html
カスタマイズせずに Orthanc を起動してみる
Orthanc の公式 Docker は様々な repository があります。
https://hub.docker.com/u/jodogne
今回は公式プラグイン全部のせを使ってみます。
https://hub.docker.com/r/jodogne/orthanc-plugins
コマンドはこちら。Port 8042 は http 用です。
$ docker pull jodogne/orthanc-plugins
$ docker run --rm -d --name orthanc1 -p 8042:8042 \
jodogne/orthanc-plugins
$ docker ps -a
などで無事に動作したことが確認できれば、http://localhost:8042/ にアクセスしてみましょう。ID と Password の入力を求められますので、それぞれ「orthanc」、「orthanc」と入力します。すると、このような Orthanc Explorer の画面が見えましたか?
この Orthanc Explorer 画面の操作は非常に簡単でわかりやすいです。手元にデータが有れば、「Upload」でデータをアップロードしたり、「Do lookup」で保存されたデータを確認したり、画像を見たり、色々やってみましょう。
一通り楽しんだら、コンテナを止めましょう。
$ docker stop orthanc1
Orthanc のカスタマイズ
Orthanc の設定をカスタマイズをしてみましょう。
"orthanc.json" が設定ファイルです。デフォルトの設定ファイルを "~/Orthanc/Config1/" に保存してみましょう。
$ mkdir ~/Orthanc
$ mkdir ~/Orthanc/Config1
$ docker pull jodogne/orthanc-plugins:1.9.6
$ docker run --rm --entrypoint=cat \
jodogne/orthanc-plugins:1.9.6 \
/etc/orthanc/orthanc.json > ~/Orthanc/Config1/orthanc.json
これで "~/Orthanc/Config1/orthanc.json" が生成されました。このファイルを編集しましょう。
変更部分を抜粋すると、この様になりました。
// HTTP port 番号の変更 (line 81)
"HttpPort" : 50010,
// AET の変更 (line 119)
"DicomAet" : "ORTHANC1",
// DICOM port 番号の変更 (line 126)
"DicomPort" : 60010,
// すべての SOP class を受け入れる (line 160)
"UnknownSopClassAccepted" : true,
// ID, Password を入力させるための "//" の削除 (line 229)
"RegisteredUsers" : {
"alice" : "alicePassword"
},
// 末尾に "," の追加 (line 826)
"SynchronousZipStream" : true,
// PostgreSQL を使うための設定 (line 827)
"PostgreSQL":{
"EnableIndex":true,
"EnableStorage":true,
"Host":"192.168.10.12",
"Port":5432,
"Database":"orthanc",
"Username":"otpostgres",
"Password":"otpassword"
}
設定ファイルに文法的な問題がないか確認します。
$ cat ~/Orthanc/Config1/orthanc.json |json_verify -c
JSON is valid
Orthanc のデフォルトでは、データベースとして SQLite を使用していますが、性能やスケーラビリティの面から他のデータベースの利用が推奨されています。今回は postgreSQL を使用することにします。設定ファイルでは、最後に記述されている部分がそれに対応します。
コンテナやサーバ再起動後にもデータが消失しないように、 PostgreSQL 用のディレクトリを作成します。DB はここに保管されることになります。
$ mkdir ~/Orthanc/DB1/
PostgreSQL のコンテナを起動し、Database を作成します。このとき先ほど作成したディレクトリを指定します。また、 Docker の network として "orthanc_nw" も作成します。
$ docker pull postgres:13.3
$ docker network create --subnet=192.168.10.0/24 orthanc_nw
$ docker run -d --name orthanc-postgres1 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /home/hogehoge/Orthanc/DB1/:/var/lib/postgresql/data \
-e POSTGRES_USER=otpostgres \
-e POSTGRES_PASSWORD=otpassword \
--net=orthanc_nw --ip=192.168.10.12 \
postgres:13.3
$ docker run -it --link orthanc-postgres1:postfres \
--net=orthanc_nw --rm postgres:13.3 \
sh -c 'echo "CREATE DATABASE orthanc;" \
|exec psql -h 192.168.10.12 -p 5432 -U otpostgres -h 192.168.10.12'
このあとPassword for user otpostgres:
と表示されるので、設定ファイルで指定した "otpassword" と入力します。 これで Database が生成されました。
それでは、Orthanc を起動しますが、先の設定ファイルの場所を指定し、タイムゾーンをサーバ環境と同じものを使うようにし、IPアドレスを指定し、詳細なログを吐くように設定します。
$ docker run -d --name orthanc1 \
-p 50010:50010 \
-p 60010:60010 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /home/hogehoge/Orthanc/Config1/:/etc/orthanc/ \
--net=orthanc_nw --ip=192.168.10.11 \
jodogne/orthanc-plugins:1.9.6 \
--verbose /etc/orthanc
Orthanc の コンテナが起動に成功したかどうか $ docker ps -a
で確認します。
成功したなら、 http://localhost:50010 にアクセスします。ID と Password の入力を求められますので、それぞれ「alice」、「alicePassword」と入力します。無事起動できたでしょうか。
OK ならデータを Push してみます。今回は、dcm4che/dcm4che-tools を使用します。
$ docker pull dcm4che/dcm4che-tools:5.25.0
$ docker run --rm --net=orthanc_nw --ip=192.168.10.100 \
dcm4che/dcm4che-tools:5.25.0 \
storescu -bDCM4CHEE \
-cORTHANC1@192.168.10.11:60010 \
/opt dmc4che/etc/testdata/dicom
ブラウザの "Do lookup" をクリックすると送ったデータが見えるはずです。図のように "DOE^J1 - LEFT WRIST" が見えればOKです。
コンテナを止めた後に再度起動して、送ったデータが保存されているか確認します。
$ docker stop orthanc1 orthanc-postgres1
$ docker rm orthanc1 orthanc-postgres1
$ docker run -d --name orthanc-postgres1 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /home/hogehoge/Orthanc/DB1/:/var/lib/postgresql/data \
-e POSTGRES_USER=otpostgres \
-e POSTGRES_PASSWORD=otpassword \
--net=orthanc_nw --ip=192.168.10.12 \
postgres:13.3
$ docker run -d --name orthanc1 \
-p 50010:50010 \
-p 60010:60010 \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
-v /home/hogehoge/Orthanc/Config1/:/etc/orthanc/ \
--net=orthanc_nw --ip=192.168.10.11 \
jodogne/orthanc-plugins:1.9.6 \
--verbose /etc/orthanc
http://localhost:50010 にアクセスして "Do lookup" をクリックします。
先程同様、 " DOE^J1 - LEFT WRIST" が見えていたら成功です。
これでその1は完走です。大した苦労もなくできてしまいました。素晴らしい。
実用上は、サーバ再起動後も自動でコンテナが立ち上がってほしいとか、通信する相手を指定しなければならないとか、受信したデータに対して何らかの処理をしたい、といった要望が出て来ることになると思います。そのあたりを簡単に試したので、その2をいつの日かまとめられたらなぁ、と思っています。いつになりますやら。
つづく
追記
その2を書きました。