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コマンドが使えるようになる。要再ログイン)
参考:
- いまさら聞けないDocker入門(2):ついに1.0がリリース! Dockerのインストールと主なコマンドの使い方 (1/3) - @IT
- いまさら聞けないDocker入門(3):Dockerfileとdocker buildコマンドでDockerイメージの作成 (1/2) - @IT
インストール
Dockerfileのあるディレクトリでdocker build -t [ユーザ名]/virtuoso:1.0 .
とか。-t 以降はタグなので適当。
基本的には namlook/docker-virtuoso を参考にしている。
aclocal
、autoheader
、glibtoolize
が足らないと言われるが、automake をインストールすれば良い 参考:Paul Kukiel - and what i'm interested in.: Automake - aclocal: command not found openlink/virtuoso-opensourcereadline オプションをつけたら readline 関連インストール必要→
libreadline-gplv2-dev
でよい(ltermcap/termlibが無いと言われる)参考:How to install Readline/libreadline in Ubuntu? | Programming in Linux
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}}'
で調べることができる。
参考:
その他参考:
- コンテナの連結と操作 - Docker User Guide - Qiita
- firewalls - Docker port forwarding exposure - Information Security Stack Exchange
- ufw でルータをつくる - ubuntu日記
- DockerのHost networking機能 | SOTA
- Dockerのネットワークの基礎 | SOTA
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にしている。
画面が灰色で動かないのを直す
Ubuntu で gnome 使ってたので、~/.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 &
参考:
- Ubuntu VNC grey screen | onkea eLearning
- CMLog :: VNCをUbuntu Server 12.04で使う
- IT とかその他もろもろ: Ubuntu 12.04 Server で Vnc4Server で LXDE ここは環境依存なので、LXDE の場合とかそれぞれで違う。
キーの不具合を直す
以下のような不具合がある。
- 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']
参考:
- VNCServerをUbuntu14.04で建てる。 - Qiita
- Ubuntu 14.04 trustyにVNC環境を構築 - Qiita
- VNC Broken ‘s’ Key | Brett Broderick
再起動時に自動で立ち上がるようにしたい
後程。
参考:
- Windowsユーザーに教えるLinuxの常識(最終回):Linux起動の仕組みを理解しよう[rcスクリプト編] - @IT
- LPIC Linux - 起動スクリプトの起動と停止
- Pythonスクリプトをサービスで起動させる - Qiita
その他
プロキシでURLを書き換えようとしたけど断念
はじめ、/etc/apache2/sites-enabled/000-default.conf に
<Location /virtuoso/> ProxyPass http://localhost:8890/ </Location>
を書き込んでポート制限を抜けれるようにしようとしたけれど、/image みたいなパスが悉くリンク切れする。そこで、
- Apache のリバースプロキシの設定方法 - WebOS Goodies
- Proxying Virtuoso Via Apache2 - OSF Wiki
- upgrade - Upgraded to Ubuntu 13.10 - Apache not able to start - Ask Ubuntu
- 日記(05-11[長年日記])
- [SOLVED] Invalid command 'ProxyHTMLEnable', perhaps misspelled or defined by a module not incl
あたりを参考に mod-proxy-html を使ってリンクを書き換えようとしたけれど上手くいかなかった。
俺は京都にいてマシンは東京にあるのでconfigがvalidかどうか確かめつつ慎重に。apache2ctl configtest
大事。
追記:
あとで気づいたけど conductor に
こんな表記があるのでインストール時にオプションとかでなんとかなったはず。
ポートの重複に注意
ポートが重複するような命令で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調査