docker dotinstallでやったことメモ

##前提として
### dockerとは
- 軽量な仮想環境
- OSのカーネル部はホストOSのを使用する。軽量な理由でもある。
- Vagrantとかと比べると流石に比較にならないぐらいめっちゃ軽く感じる。
- 基本的にLinux系のカーネルを使用しないと動かない。
- docker for macがない場合はvagrantのゲストOSにLinuxたててその中でdockerを動かすとかやるっぽい。
- じゃあなんでdocker for mac使うと動くの？<br>
docker for macは「HyperKit」という軽量な仮想化ツールを使って後ろでこっそりLinuxをたててるらしい。<br>
一見macでも動いてるように思われるが基本的にLinuxがどっかに立ってないと使えないみたい。<br>
- もちろんwindowsでも動かない。がmac同様にDocker for Windowsなるものがあるとのこと。
- Docker Toolboxというツールが以前は主流だったらしい。Vagrantの設定とかいろいろめんどくさいらしい。

### 環境
- 前提：macでやる　　windowsは知らないけどリファレンス見れば１発だと思う。
- 方法１：Ubuntu(vagrant) <- docker
- 方法２：docker for mac ##今回はこれを使う

##用語
- イメージ
OS環境とかアプリケーションを含んだテンプレートイメージ。これを作ったり、流用することでどこでも割と簡単に色々構築できる。

- コンテナ
イメージを元に、コンテナを作る
分離された名前空間とアプリケーションの実行環境。

- レジストリ
gitと考えはほぼ同じ。リモートレポジトリとローカルレポジトリがあって、自分でdockerhubなどにレポジトリ作ってイメージとかをpullしたりpushしたりできる。
イメージを保存できる。

##超基本:イメージの検索からコンテナを立てるまで

**イメージの検索**

```
docker search centos
```
**リモートにあるイメージをローカルレポジトリに保管**

```
docker pull centos
```
**ローカルにあるレポジトリ一覧**

```
docker images
```

**ローカルイメージの削除**

```
docker rmi 名前：タグ名 or ID
docker rmi centos:latest
```
**イメージから起動実行**

```
docker run centos echo 'hello!'
``` 
**実行中のコンテナ：プロセスの確認**

```
docker ps
```
**全てのコンテナ確認(実行中でないものも)**
exit 0は正常終了と意味。

```
docker ps -a
docker ps -a -n=5
```
**コンテナの削除**

```
docker rm コンテナID
```
**バックグランドで起動(デタッチド・モード)**

```
docker run -d centos free -s 3
```
**logの確認**

```
docker logs コンテナID
```
**デタッチドではない通常モードにプロセスも戻す**

```
docker attach --sig-proxy=false コンテナID
```
**コンテナの停止**

```
docker kill ID
docker stop ID
```
**コンテナの再起動**

```
docker start ID
```
## imageを作ってみる

**ターミナルを開く**
`-i　`はインタラクティブモード(対話的なモード)
`-t`はターミナルを開く

```
docker run -i -t centos /bin/bash
```
**適当にファイル作って抜ける**

```
touch hello.txt
exit
```
**コンテナからイメージを作る**

```
docker commit id user名/イメージ名
docker images
```

##イメージからコンテナをたてて、そこからイメージを作るような手順を自動化する。
Dockerfileがスクリプトファイルになる。

```
vi Dockerfile
```

```Dockerfile
##FROM: どのイメージファイルを元にするか
FROM centos
##MAINTAINER: 作成者名をつける
MAINTAINER MYUZIN <email@sample.com>
## RUN: buildするときに実行される
RUN echo "now building..."
## CMD: runするときに実行される
## CMD echo "now running" ※以下の書き方が推奨されてる
CMD ["echo","now running"]
``` 

**Dockerfileを元にビルド**

```
docker build -t 作成イメージ名 dockerfileパス
docker build -t MYUZIN/echo .
```
レポジトリにMYUZIN/echoが追加されてることが確認できる。

ビルドしたイメージからコンテナを走らせる

```
docker run MYUZIN/echo
=>now running
```

##簡単にwebサーバーを作る
```
vim Dockerfile
```

```Dockerfile
FROM centos:6
MAINTAINER yamada tarou <sample@.example.com>
RUN yum install -y httpd
#ADD コピーファイル イメージ内のコピー先path
ADD ./index.html /var/www/html/
#EXPOSE ポートの開放
EXPOSE 80
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
``` 
```
vim index.html
```
```index.html
<html>
  hello! docker!!
</html>
``` 


```
docker build -t MYUZIN/httpd .
docker run -p 8080:80 -d MYUZIN/httpd
```

localhost:8080に接続するとhello! docker!!と表示される。

##imageをリモートリポジトリにプッシュする
※注意:image名のnamespaceはdockerhubと同様の名前にしておくこと。

**dockerhubにアカウントを作る**
githubのdocker版と考えてくれればOK
https://hub.docker.com/

**Docker レジストリ・サーバに登録,ログインする**
dockerのレジストリサーバを登録およびログインを行う。
URL指定がなかったら自動でdockerhubになる

```
docker login 
```
**イメージをプッシュする**

```
docker push MYUZIN/httpd
```

##参考
docker for macについてわかりやすく書いくださってます。
https://qiita.com/nogizaka46/items/c48728d6c640a3e9d6aa
https://qiita.com/kmagai/items/a5023bcbae5ae9f4b046