Docker コマンドなどメモ。

Dockerを使ってみました。メモしておきます。
Dockerはコンテナと呼ばれる技術に分類されるそうです。Docker以外にもコンテナ技術を使用した経験がある方は馴染みやすいそうです。

docker-compose に関する内容も徐々に追加しています。

# 環境構築
環境は Mac です。Mac への Docker 環境のインストールは`Docker Desktop`がスタンダードとなりました。

[Docker Desktop
](https://www.docker.com/products/docker-desktop)

左にあるクジラのアイコンをタップするとdockerコマンドが使えるターミナルが立ち上がり、クジラが表示されます。

```
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com
```
ここで`192.168.99.100`みたいにIPが出ていない場合は起動で失敗しているかもしれません。

# Dockerの流れ
dockerでよくある簡単な流れを書きます。

Dockerのリポジトリなどからimageを持ってくる。あるいはDockerfileを作成してimageを作る。
↓
Dockerのimageからコンテナを生成する。

# docker build でイメージを作成
ローカルに置いていあるDockerfileからイメージを作成する場合です。

```bash:イメージを作成
docker build -t 任意のイメージ名 .
```
この後に、`docker images`でイメージが作成されているか確認できます。

## docker-compose build でサービス名を指定
特定のサービスだけ build したい場合サービス名指定が使えます。

```bash:サービスをbuild
docker-compose build サービス名
```
bot という名前のサービスをビルドしたいケースです。

```bash:botサービスをbuild
docker-compose build bot
```
キャッシュさせないときには `--no-cache` をつけます。

```bash:botサービスをキャッシュ無しでbuild
docker-compose build --no-cache bot
```

# docker images で一覧を確認
イメージ一覧を確認したい場合は、`docker images`を使用します。

```bash:イメージ一覧
docker images
```
以下は`docker images`実行例です。

```bash:イメージ一覧
docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
gcr.io/tensorflow/tensorflow   latest              93cef7caeec9        3 weeks ago         959 MB
richarvey/nginx-php-fpm        latest              d7b6d1fa619d        3 months ago        181.9 MB
・・・略
```
イメージ一覧が表示されました。

# docker pull で image を更新

```
docker pull イメージ名
```
latest になります。

# docker rmi でイメージを削除
`docker rmi` でコンテナ名を指定するとイメージを削除できます。

```bash:イメージ削除
docker rmi コンテナ名
```
実際にコンテナ名を指定した例です。

```bash:イメージ削除
docker rmi ab29e88d861f
```

複数のイメージを同時に削除したい場合は半角スペースでつなげます。

```bash:イメージの複数削除
docker rmi 2733c3e4e82a f6f08705ddde bb4bb84236f1
```

## イメージの強制削除

```bash:イメージの強制削除
docker rmi -f イメージ名
```
`-f` オプションで強制削除です。

# docker run でコンテナの作成
`docker run`では何もなければイメージからコンテナを作成します。

```bash:コンテナの作成
docker run イメージ名
```
以下はhello-worldイメージからコンテナを作成した場合です。

```bash:hello-worldコンテナを作成
docker run hello-world
```
この後に、作成されたコンテナを確認するには `docker ps -a` です。

## docker run のオプション
`docker run` のよく見るオプションを追加していきます。

| オプション | 概要 |
|:-:|:-:|
| -d | バックグラウンドでコンテナ生成 |
| -v | 共有システムファイル `-v ホスト側ディレクトリ`:`コンテナ側ディレクトリ`のようにカンマ区切りで指定 |
| --name | コンテナ名 |
| --link | 他のコンテナのリンクを追加 `コンテナ名 か id`:エイリアス もしくは `コンテナ名 か id` |

`--name`　オプションの使用例です。

```bash:nodeコンテナを名前を指定して作成
docker run --name node_container node
```
`node` イメージから `node_container` という名前のコンテナ名でコンテナを作成しました。

# docker run でコマンドの実行
`docker run` でコマンドの実行を行うころができます。
`docker run --help` からヘルプを表示すると多くのオプションがあります。

## docker-compose run でコマンドの実行
サービス名を指定してコマンドを実行する例です。

```bash:composer実行例
docker-compose run phpfpm composer update 
```


# docker ps でコンテナの確認
稼働しているコンテナ一覧を表示します。

```bash:コンテナを確認
docker ps
```
`docker ps`実行例です。

```bash:コンテナを確認
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1768a24cbce3        60a61bc4a5b6        "/usr/local/bin/init."   4 minutes ago       Up 2 minutes        8888/tcp            pugy
```

# docker startでコンテナを開始
コンテナを開始したい場合は、`docker start`を使用します。

```bash:コンテナを回
docker start コンテナID
```
この後に、`docker ps`を実行すると開始したコンテナが表示されます。


# docker stopでコンテナを停止
コンテナを停止したい場合は、`docker stop`を使用します。

```bash:コンテナを停止
docker stop コンテナID
```
以下は`docker stop`の例です。

```bash:コンテナIDを指定してコンテナを停止
docker stop 1768a24cbce3
```
この後に、`docker ps`を実行すると停止したコンテナが表示されなくなっています。

#docker rm でコンテナの削除
コンテナを削除したい場合は、`docker rm`を使用します。

```bash:コンテナ削除
docker rm コンテナ名
```

```bash:コンテナ削除
docker rm ab29e88d861f
```

## docker-compose で紐付くコンテナを削除


```bash:docker-composeに紐付くコンテナ削除
docker-compose rm
```
紐づいたコンテナが一気に削除されます。
stop していないコンテナは削除できません。

# docker exec でコンテナを操作
`docker exec`はコンテナ内でコマンドを実行する場合に使用します。

## docker exec でコンテナに入る
サーバーでよくやるようにSSHで入ってbashで色々な設定ファイルを見たりしたいというのは`docker exec` からできました。

```bash:コンテナを確認
docker ps
CONTAINER ID        IMAGE                     COMMAND             CREATED             STATUS              PORTS               NAMES
156e6723afa5        richarvey/nginx-php-fpm   "/start.sh"         8 minutes ago       Up 6 minutes        80/tcp, 443/tcp     nauseous_kare
```
コンテナの名前がnauseous_kareなので`docker exec`にコンテナ名を利用してbashを起動します。

```bash:コンテナでbashを起動
docker exec -it nauseous_kare bash

bash-4.3# whoami
root
```
rootのユーザーでログインできました。

## docker-compose に exec でログイン
docker-compose exec も便利です。

```
docker-compose exec phpfpm /bin/sh
```

# docker cp でファイルをコピー
サーバーへのコピーでscpのようなものは`docker cp`が実現できるようです。

```bash:
docker cp ホストのファイル コンテナID:コンテナのコピー先パス
```

以下は`docker cp`の例です。

```
docker cp ./plugins/pugiemonn pugiemonn_web:/var/www/html/wp-content/plugins
```
`pugiemonn`というディレクトリを、コンテナ`pugiemonn_web`にコピーしています。

#docker version でバージョンの表示

```bash:バージョン表示
docker version
Client:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:20:08 2016
 OS/Arch:      darwin/amd64

Server:
 Version:      1.11.2
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   b9f10c9
 Built:        Wed Jun  1 21:20:08 2016
 OS/Arch:      linux/amd64
```

#docker logs でログを表示
dockerのログを表示したい場合は、`docker logs`を実行します。

```bash:ログ表示
docker logs コンテナID
```
コンテナIDは`docker ps`などで表示すれば確認できます。
オプションを指定する場合です。

```bash:ログ表示
docker logs オプション コンテナID
```
オプションは `docker logs --help` で確認できます。

##docker logs -f でログを垂れ流す
ログを流しっぱなしにしたい場合は、`-f` を使います。

```bash:ログ表示
docker logs -f コンテナID
```
以下のように、`-f` オプションとコンテナIDを指定するとログを垂れ流しにできます。

```bash:ログ表示例
docker logs -f pugiemonncom_web_1
```

#docker info で情報を表示
dockerの詳細情報を表示したい場合は、`docker info`を実行します。

```bash:バージョン表示
docker info
```
docker のコンテナ数などまとめて表示するのに便利です。

# 参考
http://docs.docker.jp/engine/reference/builder.html
http://qiita.com/yosisa/items/a5670e4da3ff22e9411a
http://www.atmarkit.co.jp/ait/articles/1407/08/news031_2.html
http://yamitzky.hatenablog.com/entry/2015/12/24/113007