LoginSignup
11
11

More than 5 years have passed since last update.

私のDocker TIPS その2

Last updated at Posted at 2014-11-09

終了済み

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-stateoffline
1はadb-serverのバグで、デバイスを受け付けなくなった状態なため、adb-serverを再起動する。
2はおそらく、adbdのエラーなため、端末を再起動すればよい。

DockerにAndroid_x86

Android_x86のisoファイルをDockerイメージに変換する方法

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11