11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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のインストール

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イメージに変換する方法



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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?