Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

Virtuoso を Docker で運用

cm3/docker-virtuoso

Docker 環境の準備

sudo apt-get install docker.ioでは古いバージョンしか入らない。特に1.3以降で導入されたexecとかは必須の機能なので(参考:jpetazzo/nsenter)新しいのをインストールしよう。

$ wget -qO- https://get.docker.com/ | sh
$ sudo gpasswd -a [自分のユーザ名] docker
(これでsudo無しでdockerコマンドが使えるようになる。要再ログイン)

参考:

インストール

Dockerfileのあるディレクトリでdocker build -t [ユーザ名]/virtuoso:1.0 .とか。-t 以降はタグなので適当。

checking for --with-readline... yes
checking for -lreadline without -ltermcap... no
configure: checking for -lreadline that needs -ltermcap...
checking for tgetent in -ltermcap... no
checking for tgetent in -ltermlib... no
checking for tgetent in -lncurses... no
checking for tgetent in -lcurses... no
configure: error: no working -ltermcap/termlib found -- do not use --with-readline
  • 参考にした Dockerfile では /home/virtuoso にインストールするようになっているが、初期設定の/usr/local/virtuoso-opensource/にインストールした。

RUN adduser --disabled-password --home=/home/virtuoso --gecos "" virtuoso

については、What do the --disabled-login and --gecos options of adduser command stand for? - Ask Ubuntuにあるように余計なことを聞かれずにユーザを作る方法で、disabled-login については yunabe memo blog: adduserの--disabled-loginと--disabled-password の通り。

su - virtuoso -c "/home/virtuoso/install-virtuoso.sh"

については、linux - What's the difference between "su" with and without hyphen? - Super Userにあるようにvirtuosoユーザの環境を引き継いでroot権限でコマンドを実行している。

  • Dockerの諸問題とRocket登場の経緯 | SOTAあたり見ててセキュリティの観点からはもう少しなんか考えた方がいいかもと思って後日virtuosoユーザでの実行を試みた。そのままでは、Permissionに問題があると言われて実行できなかったので、chown -R virtuoso/virtuoso /usr/local/virtuoso-opensource/ をして関連のオーナーを変更し、それでも起動時に/usr/local/virtuoso-opensource/lib/virtuoso/hostingの作成に失敗したのでmkdir -p /usr/local/virtuoso-opensource/lib/virtuoso/hostingしてやったらvirtuosoユーザで実行できた。ちなみにdocker runの時に-u="virtuoso"としてやることでコンテナの実行ユーザを変更できる。

起動

virtuoso の起動コマンドは

/usr/local/virtuoso-opensource/bin/virtuoso-t -f -c /usr/local/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.ini

デフォルトの ini ファイルは /usr/local/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.iniにあるので c オプションでそれを指定。-f はフォアグラウンドで起動。これしないとコンテナとの接続が切れるので。

これをdockerのコンテナ起動と合わせると

docker run -d -p 127.0.0.1:8890:8890 --name [新コンテナ名] [イメージ名] /usr/local/virtuoso-opensource/bin/virtuoso-t -f -c /usr/local/virtuoso-opensource/var/lib/virtuoso/db/virtuoso.ini

ポート制限がufwでできないから、ループバックアドレスに割り当てている

Ubuntuファイアウォールである ufw でポートごとに細やかなアクセス制限ができると思っていたがそれがうまくいかない。/etc/default/ufw

DEFAULT_INPUT_POLICY="DROP"

と書かれていて、sudo ufw statusしても8890が許されているわけでもないのに、繋がってしまう。ずっとufwの使い方に慣れていないせいかと思って奮闘していたが、Dockerのネットワーク仕様によるものだった。

Docker は ufw ではなく iptables を直接書き換える。OS が Ubuntu であることを前提にできないから当然と言えば当然の挙動なのだが、少し不作法だ。ポートを晒すときに、ホスト側のポートを127.0.0.1と明示的に指定すれば、この問題は解決する。指定しなければ 0.0.0.0 となり、外部からのアクセスも通してしまうが、ループバックアドレスなら内部からしかアクセスできないようになる。

おそらくこの状態から ufw で NAT 設定することで再び外に出すこともできると思う。ちょっと面倒そうだが。

参考:

さらに参考までに、コンテナはそれぞれプライベートIPを初めから持っているので 127.0.0.1 に publish するという回りくどいことをせずとも、直接そのIPにアクセスすれば良い。コンテナのIPは

docker ps -q | xargs docker inspect --format='{{.NetworkSettings.IPAddress}} -- {{.Name}}'

で調べることができる。

参考:

その他参考:

sparql エンドポイントを外に出す

/etc/apache2/sites-enabled/000-default.conf

<Location /sparql>
    ProxyPass http://localhost:8890/sparql
</Location>

を書き込んで、sudo /etc/init.d/apache2 restartすればSPARQLエンドポイントが使えるようになる。

conductor はVNCでいじる

conductorは別に外に出すようなものでもないし、とりあえずVNC使うことに。

ちなみにputtyのポート転送で127.0.0.1:8890をローカルの8890にマップして、ブラウザでlocalhost:8890にアクセスする方法もあるが、接続先のサーバに直接SSHできない環境に居り、接続が面倒なので、VNCにしている。

画面が灰色で動かないのを直す

Ubuntugnome 使ってたので、~/.vnc/xstartup を以下のように。

#!/bin/sh
def
export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
 
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

参考:

キーの不具合を直す

以下のような不具合がある。

  • s:キーを押すとgnomeのメニューが開く
  • d:キーを押すとデスクトップ表示になる。
  • 上:キーを押すとWindowが最大化表示になる。
  • 下:キーを押すとWindowが最小化表示になる。

その場合、以下のコマンドを実行。

gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "['<Alt>F1']";
gsettings set org.gnome.desktop.wm.keybindings show-desktop "['<Shift><Alt>F1']";
gsettings set org.gnome.desktop.wm.keybindings maximize "['<Primary><Super>Up','<Alt>KP_5']";
gsettings set org.gnome.desktop.wm.keybindings unmaximize "['<Primary><Super>Down','<Alt>F5']";

ちなみに初期状態をメモっておくと

$ gsettings get org.gnome.desktop.wm.keybindings panel-main-menu
['<Super>s', '<Alt>F1']
$ gsettings get org.gnome.desktop.wm.keybindings show-desktop
['<Primary><Super>d', '<Primary><Alt>d', '<Super>d']
$ gsettings get org.gnome.desktop.wm.keybindings maximize
['<Primary><Super>Up', '<Super>Up', '<Primary><Alt>KP_5']
$ gsettings get org.gnome.desktop.wm.keybindings unmaximize
['<Primary><Super>Down', '<Super>Down', '<Alt>F5']

参考:

再起動時に自動で立ち上がるようにしたい

後程。

参考:

その他

プロキシでURLを書き換えようとしたけど断念

はじめ、/etc/apache2/sites-enabled/000-default.conf に

<Location /virtuoso/>
    ProxyPass http://localhost:8890/
</Location>

を書き込んでポート制限を抜けれるようにしようとしたけれど、/image みたいなパスが悉くリンク切れする。そこで、

あたりを参考に mod-proxy-html を使ってリンクを書き換えようとしたけれど上手くいかなかった。

俺は京都にいてマシンは東京にあるのでconfigがvalidかどうか確かめつつ慎重に。apache2ctl configtest大事。

追記:

あとで気づいたけど conductor に

f:id:cm3ak:20150406030135p:plain

こんな表記があるのでインストール時にオプションとかでなんとかなったはず。

ポートの重複に注意

ポートが重複するような命令でdocker runするとport is already allocatedというエラーが出てきた。そして困ったことにコンテナをstopしてもrmできなくなり"FATA[0000] Error: failed to remove one or more containers"というメッセージが表示されるようになる。結局、ポートを占有していたプログラムを停止してdocker startして成功させ、その後docker stop``docker rmで削除できた。

チートシート

  • docker run -it --name [新コンテナ名] [イメージ名] /bin/bash
  • lsで縦にフォルダ名が並んで変な場合は大抵 t の付け忘れ
  • docker ps -q | xargs docker inspect --format='{{.NetworkSettings.IPAddress}} -- {{.Name}}' コンテナのIP調査

その他参考