Dockerを試してみた(雑感)

銀鷹です。

先日まで学会でアメリカに居りました。
ACSACという学会でしたが、割りと刺激も多く楽しかったですが、疲れました。
(もし気が向いたら、学会についても後日書きます。)

すこし時間が合ったのと、他のことをやる気になれなかったので、
前から試してみたかったDockerを試してみたので、適当に感想をまとめます。

環境

  • さくらVPS 1Gプラン
  • Ubuntu 12.04.3 LTS

インストール

完全にここの通り。http://docs.docker.io/en/latest/installation/ubuntulinux/
カーネルを3.8にあげてから、aptの鍵とか追加してインストールするだけ。

# install the backported kernel
sudo apt-get update
sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring

# reboot
sudo reboot

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
Add the Docker repository to your apt sources list, update and install the lxc-docker package.

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"
sudo apt-get update
sudo apt-get install lxc-docker

コンテナの起動

sudo docker run -i -t ubuntu /bin/bash

これで、コンテナの中のシェルに入る。
抜けるときはexit。ちなみに抜けるとコンテナは死ぬ。
(殺したくない場合は-dをつける。)

感想

良い点

非常にさっくりとコンテナを起動して、仮想環境を得られるのは良いと思った。 また、仮想環境上でも使えるので、VPSとかの上でも使えるのはいいところだと思う。
(別に、その気になればKVM on KVMとかも出来たはずだけど、それは別の話。)

微妙な点

コンテナ型の仮想環境ゆえなのか、色々と制約があってそれがちょっと面倒に思った。

具体的には以下の様な話がある。
https://github.com/dotcloud/docker/issues/1024
なんでも、Dockerが/sbin/initを独自のものに置き換えていてUpstartが起動しないらしい。

以下の様な対策で現状は回避可能らしい。
http://n8.hatenablog.com/entry/2013/08/19/155751

でも、openssh-serverでは回避できなかった。
他の方法があるらしい。
http://docs.docker.io/en/latest/examples/running_ssh_service/

まとめ

なんていうか、普段Vagrantとかだと何も考えずに使えるので、そうじゃないのがちょっとつらい感じ。
やっぱり、コンテナ型もそうじゃないのもメリット・デメリットがあるなと感じた。
でも、単純に一個のアプリをコンテナで動かすとかそういうことも出来るようなので、
そういう用途とかだといいと思う。

例えば、PaaSっぽいサービスで、アプリのコード渡したらDockerのコンテナの中で動くとか、 そういう感じに使えそうだと思いました。
(既にやってそうな気もしますけど。)
後は、起動も早いのでChefのcookbookとかAnsibleのplaybookを作るときに使うのは良さそう。

以上、非常に雑にDockerを試してみた感想でした。
また、時間とやる気がとれた時にいろいろ試してみたいと思います。

関東に行ってました。

銀鷹です。

たまには自分用のメモ以外のお話も。

先日11月20,21と関東(主に東京)に居りました。 いろいろ用事があって行ったんですが、
そのついでにどうしても行きたかったのでちょっと遠出して横須賀まで行ってきました。

目的はこれです。横須賀軍港めぐりですね。
(昔から知ってましたが、最近某ゲーム始めた影響もあります。)

f:id:yutaka_j:20131121133217j:plain

一応予約も必要ですが、当日ぶっつけでも意外と行けそう。
(一回45分、大人1200円だったような。) 以下適当に写真。iPhoneとかいうアレなデバイスで写真とってるので正直駄目ダメです。
(こういう時はカメラ欲しくなる。)

潜水艦

f:id:yutaka_j:20131121150319j:plain

カメラの向いてる側は基本アメリカの基地らしいですが、
その中になぜが日本の潜水艦が居るという。
なんでも、潜水艦の司令部がアメリカに同居してるらしく、
潜水艦だけはアメリカ側の港にこうやって入れるんだとか。

イージス艦

f:id:yutaka_j:20131121150704j:plain

f:id:yutaka_j:20131121150810j:plain

アメリカのイージス艦
言わずもがな有名かつお高い船です。
普段は他にもいっぱい船が居るようですが、
例のフィリピンの件でほとんど出払ってるようです。

ジョージ・ワシントン(専用の港)

f:id:yutaka_j:20131121151014j:plain

クレーンのあたりがジョージ・ワシントン専用の港らしい。
あんまり見れないらしいですが、運がよいと見れるそうです。
いまは長距離航海らしく、ここ数ヶ月は横須賀には居ないとか。

積み込み中のイージス艦(遠い)

f:id:yutaka_j:20131121151356j:plain

望遠なんて無いので仕方ないんですが、
中央遠くに移ってるのはイージス艦らしい。
それも、弾薬補給とかやってるらしい。
(いろんな事情があって、弾薬補給とかは港の中ではやらないらしい。)

名前忘れた(海図を作るための船らしい)

f:id:yutaka_j:20131121152056j:plain

海図を作るための船らしい。
この日は他にも合わせて3,4隻居ました。

機雷撤去用の船

f:id:yutaka_j:20131121152449j:plain

機雷撤去に使う船らしい。
ぱっと見はわからんですが、実は木造らしい。
(鉄で作ると磁気を帯びて、それが撤去にはよろしくないらしい。)
木造船を作る職人が減ってるので新しい船を作るのは辛いらしい。

退役した潜水艦

f:id:yutaka_j:20131121152711j:plain

最近退役した潜水艦らしい。
退役したからメンテされてないので汚い。
でも、退役したお陰で割りと近くで見れる。
いつ、解体or射撃の的にされるかわからないので、次来ても見れない可能性が高いらしい。

以上こんなかんじでした。
割りと面白いし、そんなに高くも無いのでまた行きたいと思います。
次はフィリピンの件が落ち着いてもうちょっと船が多い時がいいですね。

ghostscriptエラー

銀鷹です。

時折、convertやevince、platex等々で以下のようなエラーに見舞われる。

Error: /invalidfileaccess in /findfont
Operand stack:
   GothicBBB-Medium-EUC-H
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1900
   1   3   %oparray_pop   1899   1   3   %oparray_pop   --nostringval--   1883   1   3   %oparray_pop   1771   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostrin
gval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   1852   1   4   %oparray_pop
Dictionary stack:
   --dict:1169/1684(ro)(G)--   --dict:0/20(G)--   --dict:84/200(L)--   --dict:184/256(L)--
Current allocation mode is local
Current file position is 17085
GPL Ghostscript 9.07: Unrecoverable error, exit code 1
Error: /invalidfileaccess in /findfont
Operand stack:
   GothicBBB-Medium-EUC-H
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1900
   1   3   %oparray_pop   1899   1   3   %oparray_pop   --nostringval--   1883   1   3   %oparray_pop   1771   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostrin
gval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   1852   1   4   %oparray_pop
Dictionary stack:
   --dict:1169/1684(ro)(G)--   --dict:0/20(G)--   --dict:84/200(L)--   --dict:184/256(L)--
Current allocation mode is local
Current file position is 17085
GPL Ghostscript 9.07: Unrecoverable error, exit code 1
convert: Postscript delegate failed `rand100.eps': そのようなファイルやディレクトリはありません @ error/ps.c/ReadPSImage/837.
convert: no images defined `rand100.png' @ error/convert.c/ConvertImageCommand/3106.

その時の解決方法。

解決方法

http://d.hatena.ne.jp/sasakyh/20090917より引用

export GS_LIB=/usr/local/share/fontsみたいな感じで、

フォントのある場所を教えてあげれば良い。

見つけられれば簡単なんだけど、

割とよくはまるんだよなーと・・・

いつも、大学のLinuxでは影響でないのでなんで?と思ったら

.zshrcに書いてあって、家と動機してなかったという。悲しみ。

ansible-playbookのTODO解決

銀鷹です。

前の記事で書いた以下のTODOについて、Twitterでアドバイスを頂き、

無事解決したのでまとめておきます。

アドバイスありがとうございました。

解決したTODO

前の記事よりコピー。

TODO?

一部のplaybookでコメントアウトしてある部分がある.

それをちゃんと動かせるようにしたいな・・・

具体的には以下の2つ.知ってる人がいたら教えてください.

  • ansibleでデフォルトのshellを変更(chsh)
    chshがパスワード聞いてくるのでうまく行かない様子.
  • templateモジュールでvarsの展開
    なぜか展開されなかった・・・

解決方法

1.ansibleでデフォルトのshellを変更(chsh) について

以下のURLを参考にしてはどうか?というアドバイスを頂いた。

http://www.ansibleworks.com/docs/modules.html#user

ansibleに標準で存在するuserモジュール。

てっきり、ユーザ作成用かと思ったら、色々出来て、

バッチリshellオプションがあった。こいつを使って解決。

(もうちょっとちゃんとgitのcommit分けてやらないとダメだな・・・・)

以下修正内容(diff)

# roles/common/tasks/main.yml

-# - name: Change default shell
-#   sudo: False
-#   command: /usr/bin/chsh -s /bin/zsh
-#   tags: chsh

+- name: Change default shell
+  user: name={{item.user}} shell={{item.shell}}
+  with_items: ${default_shell}
+  tags: default-shell
# roles/common/vars/main.yml

+default_shell:
+    - user: 'vagrant'
+      shell: '/bin/zsh'

2.templateモジュールでvarsの展開

1.同様に以下のURLをアドバイスとして頂いた。

https://groups.google.com/forum/#!msg/ansible-project/bKEoFjc-slE/23sfQfsxyCYJ

参照は、{{item['src']}}みたいな形ではなく{{item.src}}のような形で参照すれば良い。

また、vasrはPythonで言う辞書形式ではなく、YAMLの配列で表現すれば良い。(詳しくは下記参照)

以下修正内容(diff)

# roles/common/tasks/main.yml

-# - name: Write config files
-#   sudo: False
-#   template: src={{item['src']}} dest={{item['dest']}} owner={{item['owner']}} group={{['group']}} mode={{item['mode']}}
-#   with_items: ${config_files}
-#   tags: config-files

+- name: Write config files
+  sudo: False
+  template: src={{item.src}} dest={{item.dest}} owner={{item.owner}} group={{item.group}} mode={{item.mode}}
+  with_items: ${config_files}
+  tags: config-files
# roles/common/vars/main.yml

-# config_files:
-#     - {src: 'zshrc.j2', dest: '~/.zshrc', owner: 'vagrant', group: 'vagrant', mode '0644'}
-#     - {src: 'tmux.conf.j2', dest: '~/.tmux.conf', owner: 'vagrant', group: 'vagrant', mode '0644'}

+config_files:
+    - src: 'zshrc.j2'
+      dest: '~/.zshrc'
+      owner: 'vagrant'
+      group: 'vagrant'
+      mode: '0644'
+    - src: 'tmux.conf.j2'
+      dest: '~/.tmux.conf'
+      owner: 'vagrant'
+      group: 'vagrant'
+      mode: '0644'

これらで無事TODOが解決された。ありがとうございました。


朝、Twitterのリプライに気づいて検証作業を始めた時に、

無駄にaptのupdateが遅くておかしいなと思ったら、usのリポジトリを参照していたので、

ついでにsources.listをjpに書き換えるようにした。

ちょっと乱暴な方法なので、本当にこれでよいのかはちょっと謎である。

あと、何気なしにaptでupgradeしたら非常に大量に降ってきて大変だった。

boxの元のイメージが古いのが原因なんだろうけど、このへんの管理って面倒なんだろうな。

EC2も似たような感じで、ベースのイメージからインスタンス立ててたような気がするけど、

あのへんってどのくらいちゃんとメンテナンスされてるんだろう?(EC2使ったこと無いから適当です。)

Ubuntu server 12.04 64bit へのansible 1.2の導入

銀鷹です。

VirtualBox -> vagrant -> ansibleとようやく目標のansibleまで来ました。

今回はansibleの導入です。

ansibleとは?

Python版chefとかpuppet的なものです。構成管理ツール。

chefやpuppetみたいに、DSLで書くのではなく、YAMLでplaybook(chefで言うcookbook)が書ける。

拡張モジュールはどんな言語でも書けるらしい。

あと、採用の一番大きな理由は、chefやpuppetと違って、

管理対象のサーバにはsshでログインさえ出来れば良く、

rubyとかエージェントの導入が必要ないこと。

できるだけ簡単に導入出来ないと、今後後輩に引き継ぐことを考えると辛いと思ったので採用した。

個人的な勉強としてはchef、puppetあたりも触っておきたい。

ansible 1.2の導入

下記URL、Ubuntu and Debianのあたりを参照。

http://www.ansibleworks.com/docs/gettingstarted.html

Ubuntuの場合13.04だと1.2が入るらしいけど、あいにく12.04なのでPPAを使います。

ansible 1.2のインストール

PPAを入れて完了。

add-apt-repositoryがない場合は、

sudo apt-get install python-software-propertiesして下さい。

# sudo apt-get install python-software-properties
sudo add-apt-repository ppa:rquillo/ansible
sudo apt-get update
sudo apt-get install ansible -y
echo localhost > ansible_hosts
export  ANSIBLE_HOSTS=~/ansible_hosts
ansible all -m ping -u ubuntu

動作確認

勉強にように僕が書いたplaybookを使います。

以下のリポジトリからcloneして下さい。

https://github.com/yutaka-j/ansible-playbook.git

Vagrantfileも入れてあるので、vagrantの導入も終わっていれば、すぐ使えます。

git clone https://github.com/yutaka-j/ansible-playbook.git
cd ansible-playbook
vagrant up

cd playbooks
ansible-playbook main.yml -i hosts/local -k

詳しくは、リポジトリのREADMEに書いてあります。

実行結果

長くなるのでリポジトリのREADMEを見て下さい。

1回目と2回目で変わります。

(1回目は普通に環境の構築、2回目は変化がないため何もしない。)


今回までで、ひとまずVirtualBox -> vagrant -> ansibleと導入しました。

次からは関係ない内容も増えそう。

しかし、思っていた以上に、一回設定書いておけば後は何台でも気にせず直ぐ出来るのは良い。

研究室のサーバも全部これで設定できるように変更していかねば。


ちなみに、READMEにもTODOで書いてある以下の内容。

割と困っていて何とかならないかなぁという感じ。

ちょっと時間見つけて調べる。(誰か知ってたら教えて下さい。)

TODO?

一部のplaybookでコメントアウトしてある部分がある.

それをちゃんと動かせるようにしたいな・・・

具体的には以下の2つ.知ってる人がいたら教えてください.

  • ansibleでデフォルトのshellを変更(chsh)
    chshがパスワード聞いてくるのでうまく行かない様子.
  • templateモジュールでvarsの展開
    なぜか展開されなかった・・・

Ubuntu server 12.04 64bit へのvagrant 1.2の導入

銀鷹です。

一つ前の記事でVirtualBoxの導入が完了したので、引き続きvagrantを導入していきます。

vagrantは以前、研究室の同期に教えてもらってから、しばらく忘れていたんですが、

使い始めたら思った以上に便利で重宝しています。

いつでも、作ってすぐに使えて壊せるVMが簡単に手に入るのがいいですね。

vagrant 1.2の導入

VirtualBoxの導入が終わっていればすぐ終わります。

(公式がdebファイルを提供してくれていますからね・・・)

http://downloads.vagrantup.com/

1. vagrant 1.2 のインストール

ダウンロードしてdebファイルをインストールするだけ。

wget http://files.vagrantup.com/packages/7e400d00a3c5a0fdf2809c8b5001a035415a607b/vagrant_1.2.2_x86_64.deb
sudo dpkg -i vagrant_1.2.2_x86_64.deb

2. 動作確認

試しに、Ubuntu 12.04 32bitなVMをvagrantで作成する。

vagrant box add precise32 http://files.vagrantup.com/precise32.box
vagrant init precise32
vagrant up
vagrant ssh

これで、vagrantで作成されたVMに入れる。

後は煮るなり焼くなり好きにすれば良い。

(マシンが立ち上がって、外部とpingで疎通ができるとテンションが上がるよね。)

二回目からはvagrant box addは必要ない。(同じOSをベースとする場合は)

他のOSをベースにする場合は、新たにvagrant box addで他のベースとなるOSを入手すればよい。

ベースとなるOSは自分でも作れるようなので、近いうちに試してみたいと思っている。

複数VMが欲しい場合はディレクトリを変えると良い。

cd
mkdir vm1
cd vm1
vagrant init precise32
vagrant up
vagrant ssh

cd
mkdir vm2
vagrant init precise32
vagrant up
vagrant ssh

これで、ディレクトリごとに別のVMが作成される。素晴らしい。

(ディスクは普通に消費されていくので、そのへんは注意が必要。)


以上で、vagrantの導入は完了。

次の記事で、最後の目的であるansibleについて書きます。

(そもそもvagrantはansibleの練習用VMを簡単に作るために欲しかった。)

Ubuntu server 12.04 64bit へのVirtualBox4.2.xの導入(VirtualBox on Ubuntu 12.04)

銀鷹です。

vagrant導入の前段階としてのUbuntu ServerへのVirtualBoxの導入で躓いたのでまとめておく。

(Ubuntu Serverが入った環境にVirtualBoxを導入する記事です。

VirtualBoxのVMの中にUbuntu Serverを導入するわけでは無いです。)

最初は普通にaptで入ったのに、apt-get updateしたらなぜか、

Guest AdditionsがVirtualBoxより新しいバーションになってしまって下げられなかったので、

諦めてVirtualBoxも新しいのを入れたという・・・

ちなみに、以下の手順でVirtualBoxをインストールする前に、

Ubuntu公式のリポジトリからVirtualBoxをインストールしていた場合は、

アンインストールしてからやったほうがいいです。というかやってください。

VirtualBoxの導入

基本的にはこのURLの通りで問題ない(と言うか公式のドキュメンド)

https://www.virtualbox.org/wiki/Linux_Downloads

Debian-based Linux distributionsのところに従ってやっていけば良い。

1. 「/etc/apt/sources.list」に以下の内容を追記

deb http://download.virtualbox.org/virtualbox/debian precise contrib
deb http://download.virtualbox.org/virtualbox/debian oneiric contrib
deb http://download.virtualbox.org/virtualbox/debian natty contrib
deb http://download.virtualbox.org/virtualbox/debian maverick contrib non-free
deb http://download.virtualbox.org/virtualbox/debian lucid contrib non-free
deb http://download.virtualbox.org/virtualbox/debian karmic contrib non-free
deb http://download.virtualbox.org/virtualbox/debian hardy contrib non-free
deb http://download.virtualbox.org/virtualbox/debian wheezy contrib
deb http://download.virtualbox.org/virtualbox/debian squeeze contrib non-free
deb http://download.virtualbox.org/virtualbox/debian lenny contrib non-free

2. apt用の認証キーの追加

wgetで落としてapt-keyで追加する。どちらか片方やればOK

wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
sudo apt-key add oracle_vbox.asc
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

ちなみにフィンガープリントは以下だそうな。

7B0F AB3A 13B9 0743 5925  D9C9 5442 2A4B 98AB 5139
Oracle Corporation (VirtualBox archive signing key) <info@virtualbox.org>

3. VirtualBoxのインストール

リポジトリの追加と鍵の追加が終わったらインストール。

普通に4.2.xをインストール

sudo apt-get update
sudo apt-get install virtualbox-4.2

ちなみに、4.2.x以外が良ければ、他のバージョンも入れられる。

virtualbox-以降を適当に変えれば良い。公式には以下の物があるらしい。

- virtualbox-4.1 to install VirtualBox 4.1.24
- virtualbox-4.0 to install VirtualBox 4.0.18
- virtualbox-3.2 to install VirtualBox 3.2.16

4. VirtualBoxのセットアップ

以下の手順をやってね!みたいなことが書いてあったが、なぜかVirtualBoxが立ち上がらずに詰まった。

ここからは、僕個人が適当にやってみた内容。今のところ動いている。

どうやらvboxdrvのセットアップをしないと行けないらしい。

sudo apt-get install dkms

sudo apt-get clean
sudo rm /var/lib/apt/lists/*
sudo rm /var/lib/apt/lists/partial/*
sudo apt-get clean
sudo apt-get update

sudo /etc/init.d/vboxdrv setup

これで、VirtualBoxが必要としるカーネルモジュールがロードされるはず。

5. Guest Additionsのインストール(オプション)

Guest AdditionsのバージョンとVirtualBoxのバージョンが一致していない場合があるので、

Guest Additionsのバージョンアップについても一応まとめておく。

参考

http://k-mats.github.io/blog/2013/04/08/upgrade-guestadditions/

#「4.2.12」の部分は適時その時のバージョンに合わせて書き換えてください。
wget -c http://download.virtualbox.org/virtualbox/4.2.12/VBoxGuestAdditions_4.2.12.iso
sudo umount /mnt
sudo mount VBoxGuestAdditions_4.2.12.iso -o loop /mnt
sudo sh /mnt/VBoxLinuxAdditions.run
sudo umount /mnt

ちなみに、実行結果は以下のようになった。

X関係のビルドが失敗しているのは、X環境が入ってないため。

(個人的にはVagrantで使うようなVMにX環境は必要ないと思っているがどうなんだろう・・・?)

Verifying archive integrity... All good.
Uncompressing VirtualBox 4.2.12 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 4.2.12 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox DKMS kernel modules ...done.
Removing existing VirtualBox non-DKMS kernel modules ...done.
Building the VirtualBox Guest Additions kernel modules ...done.
Doing non-kernel setup of the Guest Additions ...done.
Starting the VirtualBox Guest Additions ...fail!
(modprobe vboxguest failed)
Installing the Window System drivers ...fail!
(Could not find the X.Org or XFree86 Window System.)

以上でひと通りVirtualBoxの導入は完了。次の記事でvagrantについて書く。

vagrantも無料でVMWare製品が使えればな・・・・