終了済み
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のインストール
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)」の解決策
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
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の初期設定 ユーザ追加
参考2:server worldの初期設定 ルートユーザ
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編と同じことをやらなければならなくなりそう(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
ここのsudo dpkg-reconfigure resolvconf
を実行してみる。
ホスト再起動後、Docker→vboxの順で起動してもフリーズした。
Dockerのネットワーク
その1でも書いた気がするけど、こちらでもおさらい。やりたいことは、起動時に既知のIPアドレスをdockerに振る。DockerコンテナもAndroidデバイスもIPアドレスで管理した方が、プログラムが組みやすいから、というもの。
参考1:Dockerのコンテナに任意のIPアドレスを割り当てる方法
参考2:pipeworkを使わずにDockerコンテナに任意の固定IPアドレスを割り当てる
DockerのコンテナIDを取るコマンド
docker ps | awk '!/CONTAINER/ {print $1}'
DockerのIPアドレスを取得するコマンド
docker inspect --format '{{ .NetworkSettings.IPAddress }}' コンテナIDまたはコンテナ名
これをpopenで組めば、やりたいことができるかな。
まずは、コンテナ間通信を実現したほうが良い?
参考1:Network Configuration
参考2:Docker コンテナ間の通信
リクエスト送信用コンテナ
の作成をしてないから、Dokcer間で接続できない現象が生じてる?
接続しない理由として、docker0にrouting tableがないことが上げられる。
そのため、pingは通ってもつながらない現象が生じてる?
【11/14追記】
結論として、dockerの内部ネットワークではできない上、設計にNATを使う理由がないため、調査はここで中止。たぶん、docker0が作るブリッジネットワークに別のマシンは接続できない。
デバイス接続に生じるエラー
adbを複数端末に接続させて、adb -s install apkfileとかadb connect って繰り返しやると、どっかで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のisoファイルをDockerイメージに変換する方法