終了済み
Dokcerのあれこれ その2
前回の私のDokcer TIPSが溢れてきたので幾つかの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のインストール
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のネットワーク
その1でも書いた気がするけど、こちらでもおさらい。やりたいことは、起動時に既知の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がバグる。エラーは2通りあり、
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イメージに変換する方法