私のDocker TIPS その2

終了済み

#Dokcerのあれこれ　その2
前回の[私のDokcer TIPS](http://qiita.com/drafts/7de6d36cad4eeb9727ef)が溢れてきたので幾つかのTopicを引っ越し。

現在の環境
1.ホスト:Ubuntu14.04LTS
2.コンテナ:Ubuntu14.04LTS
3.仮想環境:Vitualbox2台(デバイス#01,デバイス#02とする)
4.docker:v1.0.1->v1.3.1(upgrade)
#DockerでAndroid
コンテナにはssh接続で入るAndroid環境を構築する。（最初の起動含め）コンテナ内には必要以上に入らないようにしたい。
##方法1
1.初期アップデート
`apt-get update && apt-get upgrade -y`

2.Javaのインストール
```apt-get install openjdk-7-jdk openjdk-7-jre 
Errors were encountered while processing:colord
E: Sub-process /usr/bin/dpkg returned an error code (1)```
参考:[「Sub-process /usr/bin/dpkg returned an error code (1)」の解決策](http://blueboy.yshh.jp/blog/2013/03/04/cydia%E3%82%A8%E3%83%A9%E3%83%BC%E3%80%8Csub-process-usrbindpkg-returned-an-error-code-1%E3%80%8D%E3%81%AE%E8%A7%A3%E6%B1%BA%E7%AD%96/)

3.Androidをbuildするのに必要なもの　その1
`apt-get install git gnupg flex bison gperf build-essential  zip curl libc6-dev x11proto-core-dev  libgl1-mesa-dev g++-multilib mingw32 tofrodos   python-markdown libxml2-utils xsltproc`

4.Androidをbuildするのに必要なもの　その2
`apt-get install bison g++-multilib git gperf libxml2-utils`
参考：[Initializing a Build Environment](https://source.android.com/source/initializing.html)

5.個人的に必要なもの
`apt-get install ssh vim unzip wget zsh`

8.別アカウントを作成する。
`adduser android`
`passwd android`
`passwd root`
`usermod -G sudo android`
` /etc/pam.d/su`を編集
参考1:[server worldの初期設定 ユーザ追加](http://www.server-world.info/query?os=Ubuntu_14.04&p=initial_conf&f=1)
参考2:[server worldの初期設定 ルートユーザ](http://www.server-world.info/query?os=Ubuntu_14.04&p=initial_conf&f=2)

9.ssh接続設定
`apt-get install -y openssh-server`
`mkdir /var/run/sshd`
`usr/sbin/sshd -D`

10.ここまでのことをcommitする。

11.追加ユーザでssh接続する。

12.`/usr/local/src`下にandroidsdkをwgetで引っ張り、unzipで解凍して、androidにフォルダ名変更する。eclipseは必要ないので削除する。
`/root/.bashrc`にAndroidのパス設定
```ANDROID=/usr/local/src/android/sdk
PATH=$PATH:$ANDROID/tools
PATH=$PATH:$ANDROID/platform-tools
export ANDROID PATH```

13.`adb`押して、path通ってるか確認

14.続く

##方法2
【11/8追記】いろいろいじってたけど、[ScalaでAndroid開発 - Docker編](http://qiita.com/ikuo/items/dddf1276167f942d1bb6)と同じことをやらなければならなくなりそう（Dockerコンテナはポートをマッピングしないと、外部と通信しないため、ネットワークを適切に設定してもAndroidデバイスは接続できないことがわかった）。というわけで、必要なものをインストールして、実験。

必要なもの群
`sudo apt-get install -y git zsh wget unzip vim`
`wget --no-check-certificate http://install.ohmyz.sh -O - | sh`
`sudo apt-get install gnupg flex bison gperf build-essential zip curl libc6-dev x11proto-core-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc`

環境は以下のとおり。
*ホスト=192.168.1.100
*Androidデバイス#01=192.168.1.111
*Androidデバイス#02=192.168.1.112
*コンテナ#01=172.0.1.16（コンテナが割り当てるデフォルトip）
*コンテナ#02=172.0.1.17

まず、コンテナ2台を立ち上げる。次に、ホストのadb-serverを起動する。
起動はそれぞれ
```docker run -it -p 7022:22 <docker-image> "`cat ~/.ssh/id_rsa.pub`"```
```docker run -it -p 8022:22 <docker-image> "`cat ~/.ssh/id_rsa.pub`"```
とした（ssh接続でデータのやりとりをするので、コンテナ側22番ポートをホストの7022,8022番にマッピングしただけ）。

Case01:コンテナ01 or コンテナ02<-->デバイス#01 or #02の接続を試みる。
Result01:
ホスト(adb-server起動) <-connect-> デバイス#01,デバイス#02
コンテナ#01<-connect->デバイス#01
コンテナ#02<-connect->デバイス#02

ホスト(adb-server停止) <-disconnect-> デバイス#01,デバイス#02
コンテナ#01<-connect->デバイス#01
コンテナ#02<-connect->デバイス#02
※ホスト機でadbサーバが起動していない場合 error: protocol fault (no status) が標準出力されるらしいが、表記されなかった。


Case02:コンテナ01 and コンテナ02<-->デバイス#01の接続を試みる。
Result02:
ホスト(adb-server停止)
コンテナ#01<-connect->デバイス#01,デバイス#02
コンテナ#02<-connect->デバイス#01,デバイス#02
同時刻に接続できた。-> why?

Case03:adb-serverのバグを意図的に出す。それには`adb connect <ipadd:port>`の無限実行を行う。理由はホストマシンで試しにやったところ、`unable to connect to device`というメッセージが出たためである（後述参照）
Result03:
約500回目で`unable`が出現した。Ctrl+cで中断し、コンテナ#01上で`adb kill-server`->`adb start-server`、再接続コマンドを実行した結果、接続できた。しかし、ホスト側は状態がofflineになってた。詳細は以下のとおり。

1.初期状態
ホスト(adb-server起動) 
コンテナ#01<--->デバイス#01

2.コンテナ#01上でテストプログラムを実行->意図的にエラーを出す

3.コンテナ側のadb-server再起動後
コンテナ#01<--->デバイス#01
ただし、ホスト(adb-server起動) <--->デバイス#01で確認したところ、接続状態がofflineだった。
解決方法としては、unableメッセージを確認した後、コンテナ側のadb-serverの再起動と、デバイスを再起動すれば、接続エラーは治ると考えられる。

※注意書き
私の環境の場合、DockerコンテナとVirtualboxを同時起動していると必ずフリーズする。マウス&キーボード入力を受け付けないため、電源ボタンをポチるしかない ｡ﾟ(ﾟ´Д｀ﾟ)゜｡ｳｧｧｧﾝ
その原因をsyslogを読んでたところ、
 ```<error> [1415531928.616818] [nm-dns-dnsmasq.c:396] update(): dnsmasq owner not found on bus: Could not get owner of name 'org.freedesktop.NetworkManager.dnsmasq': no such name"```という一文があった。これが原因である可能性があるので、調べる。

参考1:[Ubuntu 14.04 DNS issues, some addresses work and others do not](http://ubuntuforums.org/showthread.php?t=2227955)
ここの`sudo dpkg-reconfigure resolvconf`を実行してみる。
ホスト再起動後、Docker→vboxの順で起動してもフリーズした。

##Dockerのネットワーク
その１でも書いた気がするけど、こちらでもおさらい。やりたいことは、起動時に既知のIPアドレスをdockerに振る。DockerコンテナもAndroidデバイスもIPアドレスで管理した方が、プログラムが組みやすいから、というもの。
参考1：[Dockerのコンテナに任意のIPアドレスを割り当てる方法](http://tkyshm.hatenablog.com/entry/2014/08/11/155627)
参考2：[pipeworkを使わずにDockerコンテナに任意の固定IPアドレスを割り当てる](http://qiita.com/yunano/items/456361aefb7a9935875f)

DockerのコンテナIDを取るコマンド
`docker ps | awk '!/CONTAINER/ {print $1}'` 

DockerのIPアドレスを取得するコマンド
`docker inspect --format '{{ .NetworkSettings.IPAddress }}' コンテナIDまたはコンテナ名`
これをpopenで組めば、やりたいことができるかな。

まずは、コンテナ間通信を実現したほうが良い？
参考1:[Network Configuration](https://docs.docker.com/articles/networking/#binding-ports)
参考2:[Docker コンテナ間の通信](http://qiita.com/Hexa/items/b4eda7df300b82e958a6)
>リクエスト送信用コンテナ
の作成をしてないから、Dokcer間で接続できない現象が生じてる？

接続しない理由として、docker0にrouting tableがないことが上げられる。
そのため、pingは通ってもつながらない現象が生じてる？

【11/14追記】
結論として、dockerの内部ネットワークではできない上、設計にNATを使う理由がないため、調査はここで中止。たぶん、docker0が作るブリッジネットワークに別のマシンは接続できない。


##デバイス接続に生じるエラー
adbを複数端末に接続させて、adb -s <device> install apkfileとかadb connect <device>って繰り返しやると、どっかでadb-serverがバグる。エラーは２通りあり、
1.`adb connect <device>`→`unable to connect device`
2.`adb -s <device> get-state`→`offline`
1はadb-serverのバグで、デバイスを受け付けなくなった状態なため、adb-serverを再起動する。
2はおそらく、adbdのエラーなため、端末を再起動すればよい。

#DockerにAndroid_x86
[Android_x86](http://www.android-x86.org/)のisoファイルをDockerイメージに変換する方法