私のDocker TIPS

終了済み
#Dockerのあれこれ
Docker初心者で、コマンドやら使い方やら(´・ω・｀)？
となることが多いのでここにまとめておこうと思います。
随時更新予定です。

最終的には、ホスト<-->Docker(Ubuntu or CentOS)<-->Android-devicesと接続して、ホストと複数deviceを繋げて遊びたい！ついでにそれもまとめてます。（adb-serverがイケてないので書き直したいんだけど、、ソースどこー(´；ω；｀)）

ホスト,DockerはUbuntu14.04LTS、vboxはAndroidOSv4.1.1で遊んでます。
（AndroidOS_x86はstacoverflowにある通り、弄ってみたけどネットが繋がらない（複数接続はUSBよりもTCPで繋げた方が管理が楽）。個人的にイケてたAndroVMは配布終了しちゃって、いまはイケてないGemotionに変わっちゃってるし、、、OSの方の供給も急務だったりorz）

##Dockerのインストール
どのサイトにもあるDockerのインストール方法。
1.`sudo apt-get install docker.io`
2.`sudo update-rc.d docker.io defaults`
3.`sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker`
4.`sudo gpasswd -a ubuntu docker` 
5.再ログイン
6.`docker pull ubuntu:latest`して最新のUbuntuイメージを引っ張ってきて、
7.`docker images`でイメージ確認(dockerのデフォルトイメージ保存場所は`/var/lib/docker/`)
8.`docker run -it ubuntu`でコンテナ起動して、コンテナにログイン（ユーザはUbuntu）

主なオプション
-d：バックグラウンドで実行する。デフォルトはコンテナーをフォアグラウンドで実行する。それゆえ、Webサーバーやアプリケーションサーバーなど常時実行するコンテナーで指定
-i：コンテナーの標準入力を開く。/bin/bashなどでコンテナーを操作する際に指定する。
-t：tty（端末デバイス）を確保する。/bin/bashなどでコンテナーを操作する際に指定する。
-p ｛ホストのポート番号｝:｛コンテナーのポート番号｝：Dockerサーバーのホストとポートマッピングを構成

9.`docker ps -a`でコンテナの状況を確認して、
10.`docker commit <Name>:<Tag>`でイメージをアップデート（ubuntu:latestと入れると、元イメージの変更を保存できる。）
11.`docker stop contenaID`でコンテナをストップ
12.`docker rm ContenaID`をしてコンテナを削除して、
13.`docker rmi ImageID`でイメージそのものを削除（いきなりImageIDを削除するとエラーが起こる。これで結構はまった。）
14.設定してcommitしてがめんどくさいので、そういうときはDockerfileを作成して実行すると楽ちんらしい。

参考：http://www.atmarkit.co.jp/ait/articles/1406/10/news031.html

##Dockerのライフサイクル
引用：http://d.hatena.ne.jp/enakai00/20140628/1403933390
![20140628141258.png](https://qiita-image-store.s3.amazonaws.com/0/14916/22f7e133-8db4-6bc4-9ba9-8952ae586253.png)
「Dockerにおけるコンテナのライフサイクル」の絵が素晴らしい(ﾉﾟｰﾟ)ﾉので、拝借してきた（問題あるなら消します）。

>このコンテナに接続されていたディスクイメージはそのまま残っています。

`docker stop hogehoge`-->`docker rm hogehoge`に慣れない。。
★`docker attach hogehoge`で再ログイン（よく忘れる。）


##Dockerのイメージ格納先を変更したい
普通にapt-get install dockerでインストールすると、デフォルトで`/var/lib/docker`
に保存される。だけど、これだと、ホストが一杯一杯になると辛い。
`/etc/default/docker.io`に設定ファイルがあるので、変更できるらしい。

```
# Docker Upstart and SysVinit configuration file

# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"

# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /opt/docker"

# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"

# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
```
参考：http://qiita.com/mopemope/items/181cb6c6c6f7cf9bbaa9
私のDocker Tipsを参考にしてた。しかし、`#DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /opt/docker`の次の行に`DOCKER_OPTS=" -g /home/hoge/docker`にしたけど、何も変わってないよ？？

#Dockerのネットワーク構築の話
方針として、Docker<-->DeviceをTCPで接続したい。
Dockerのネットワークは、仮想ブリッジdocker0で管理されているけど、これをグローバルIPにして、デバイスと同セグメントにしたい（デバイスのIPは192.168）。（vboxのネットワークをdocker0にして静的IP振ったけど、adb connectはつながらななかった。）
この辺が参考になりそう。
1.http://deeeet.com/writing/2014/05/11/docker-network/
2.http://deeeet.com/writing/2014/05/11/docker-host-networking/
3.http://d.hatena.ne.jp/enakai00/20140424/1398321672

まとめると、仮想NICにつながりブリッジ構成してるコンテナを直接インタネットと通信させたい。それにはどうする？という話だね。
となると3の説明が役立つかも
>docker0に接続したコンテナから外部ネットワークへは、IPマスカレードで出ていけるようになっています。


#出会ったエラー
`Cannot connect to the Docker daemon. Is 'docker -d' running on this host?`
Dockerデーモンと繋がってない。`docker -d`を走らせてみたら？という意味らしい。
`/etc/default/docker.io`を変更した後、`sudo service docker.io restart`続いて、`docker images`を実行したら出た。何か変更するたびにコレが出ると、業務に支障ががが(´；ω；｀)

直す方法
1.再インストール
2.`sudo docker -d`を実行（dockerデーモンモードって言うらしい）。その後別枠でdocker作業
3.元に戻して、ずっとdefaultのままでdockerを使う（おい）
 

`Get http:///var/run/docker.sock/v1.12/images/json: dial unix /var/run/docker.sock: no such file or directory`
パス設定で治るらしい。StackOverflowに解決策あるけど、mac用だよね、コレ。
http://stackoverflow.com/questions/25234792/what-does-the-docker-host-variable-do
再インストールしたら治った。




##LXCの使い方メモ
使い方：http://knowledge.sakura.ad.jp/tech/2108/
Ubuntuドキュメント：http://manpages.ubuntu.com/manpages/trusty/ja/man7/lxc.7.html