Docker for Windowsでイメージからコンテナを生成／操作してみる

# 概要
Windows10にDocker環境を構築したのでいろいろ試してみた
今回はイメージからコンテナを生成／操作するDockerの最も基礎？となるコマンド一覧とまとめ

DockerとDockerコンテナの関連は以下を参照

　[Dockerの基本機能と全体像のイメージを整理してみる](https://qiita.com/fkooo/items/934c7b6f1f0c0e8d1b21 "Dockerの基本機能と全体像のイメージを整理してみる")

動作環境とDocker環境構築方法は以下を参照

* Windows 10 Pro 64bit
* Docker for Windows

　[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca "WindowsでDocker環境を試してみる")

## およその作業時間

1時間

## 参考書籍

[プログラマのためのDocker教科書](https://amzn.to/3k7xSYW "プログラマのためのDocker教科書")　第3章
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/4798153222/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4798153222&linkCode=as2&tag=docker_start_005-22&linkId=0cc0eb12f580db6f7a1ae46e9601c555"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=4798153222&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=docker_start_005-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=docker_start_005-22&l=am2&o=9&a=4798153222" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
わかりやすくてDockerの入門書的な良本です^^
みんな購入していて売れ行き好調なのか第2版が発売されていたのでリンク更新

[【Kindle版】プログラマのためのDocker教科書](https://amzn.to/2JNLLiB "【Kindle版】プログラマのためのDocker教科書")
<a target="_blank"  href="https://www.amazon.co.jp/gp/product/B07BHK5KX7/ref=as_li_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B07BHK5KX7&linkCode=as2&tag=docker_start_005-22&linkId=1209448c94aaa6d33d418f9f28373832"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&MarketPlace=JP&ASIN=B07BHK5KX7&ServiceVersion=20070822&ID=AsinImage&WS=1&Format=_SL110_&tag=docker_start_005-22" ></a><img src="//ir-jp.amazon-adsystem.com/e/ir?t=docker_start_005-22&l=am2&o=9&a=B07BHK5KX7" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

## 使用コマンド一覧

```docker
docker create イメージ名
docker start コンテナ名
docker run イメージ名
docker stop コンテナ名
docker rm コンテナ名
docker ps
docker exec コンテナ名 実行コマンド
docker rename 古いコンテナ名 新しいコンテナ名
docker cp コピーファイル コピー先
docker diff コンテナ名
docker commit コンテナ名 ユーザ名/イメージ:タグ名
docker export/import コンテナ名/ファイル名
docker save/load ファイル名 イメージ名
docker stats コンテナ名
docker restart コンテナ名
docker pause/unpause コンテナ名
docker attach コンテナ名
docker top コンテナ名
docker port コンテナ名
docker version
docker info
```

## docker create イメージ名

引数で指定したイメージでコンテナを作成するコマンド
（作成だけでコンテナは起動していない状態）
--nameはオプションのため指定しなくてもいいが、後述のコマンドで扱いやすいようにコンテナ名を指定して実行

```docker
> docker create --name "test01" ubuntu
5895e42d62916323965656711815d360bf98899683fc737ad8ac2bc9671c1486

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
5895e42d6291        ubuntu              "/bin/bash"              5 seconds ago       Created                                        test01
```

docker ps -aでコンテナ一覧を表示して確認する
create直後はSTATUSがCreatedの状態となる

## docker start コンテナ名

引数で指定したコンテナを起動するコマンド

```docker
>docker start test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
923e87f7a1f5        ubuntu              "/bin/bash"              3 minutes ago       Exited (0) 2 seconds ago                       test01
```

ubuntuのイメージなど、startのみで特に何も指定していないイメージは起動してすぐに停止する

## docker run イメージ名

コンテナの生成／起動を一度に行うコマンド
コンテナ上での処理実行用に様々なオプションが用意されている
いくつかコマンドサンプルを以下に記載

### コンテナ内でbashを実行

-iでコンテナの標準出力、-tでtty(端末デバイス)を使う指定をすることで
"#"以降は、コンテナ内のコマンドとなるため通常のLinuxと同様のコマンドが実行可能
（exitの入力でコンテナから出るとともにコンテナが停止する）

```docker
>docker run -it --name "test01" ubuntu /bin/bash
root@a090d2d08f07:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a090d2d08f07:/#
```

コンテナ起動中は、docker psコマンドでコンテナの状態確認が可能
　STATUSがUpとなる

```docker
>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a090d2d08f07        ubuntu              "/bin/bash"              6 seconds ago       Up 5 seconds                                   test01
```

### ネットワーク設定を指定して実行

-pでコンテナの80ポートをホストの8080ポートにマッピングするよう指定して実行
今回はバックグラウンド実行となるよう-dを指定したため、CONTAINER IDが返却される

```docker
>docker run -d -p 8080:80 httpd
6a790f3a798dbc9b0fe98fda0b43811424f02f47457b653598fe88fb4455e04a

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
6a790f3a798d        httpd               "httpd-foreground"   6 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp   upbeat_hopper
```

### CPU／メモリ／ディレクトリ共有を指定して実行

-pオプションでCPU、-mオプションでメモリを指定する
-vオプションは : の左辺がローカルフォルダ、右辺がコンテナ上のディレクリを指定する

```docker
>docker run -c=512 -m=512m -v=C:\Users\user\test01:/var/log --name "test01" ubuntu
```

### 注意

ディレクトリ共有にはShared Drivesの設定が必要
（共有するドライブにチェックを入れる）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188544/609e25aa-728c-4ad1-dfe8-f31824940c1a.png)

Settingsの開き方は以下を参照
　[WindowsでDocker環境を試してみる](https://qiita.com/fkooo/items/d2fddef9091b906675ca "WindowsでDocker環境を試してみる")

Shared Drivesの設定で以下のエラーが出る場合は、エラーメッセージの通りfirewallの設定を見直してみる
（コマンド実行確認のためセキュリティソフトとWindowsFirewallを一時的にOFFにして実行してみたらエラーが解消された）

```docker
docker: Error response from daemon: Drive sharing seems blocked by a firewall.
See 'docker run --help'.
```

## docker stop コンテナ名

引数で指定したコンテナを停止するコマンド

```docker
>docker stop test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a090d2d08f07        ubuntu              "/bin/bash"              22 minutes ago      Exited (0) 7 seconds ago                       test01
```

## docker rm コンテナ名

引数で指定したコンテナを削除するコマンド

```docker
>docker rm test01
test01

>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
```

## docker ps

コンテナの一覧／状態を表示するコマンド

```docker
>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
6a790f3a798d        httpd               "httpd-foreground"   6 seconds ago       Up 4 seconds        0.0.0.0:8080->80/tcp   upbeat_hopper
```

停止中のコンテナも表示する場合は-aを付ける

```docker
>docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
82b66212ca95        ubuntu              "/bin/bash"              5 seconds ago       Exited (0) 4 seconds ago                       test01
```

## docker exec コンテナ名 実行コマンド

コンテナ上でコマンドを実行する

```docker
>docker exec -it test01 /bin/bash
root@f6b3175e3c1d:/usr/local/apache2#
```

例えば、バックグラウンドで起動しているコンテナにアクセスするために、bashを実行してコンテナ内で任意のコマンドを実行するために使用する

docker topコマンドを実行するとbashが起動していることが確認できる

```docker
>docker top test01
PID                 USER                TIME                COMMAND
7208                root                0:00                httpd -DFOREGROUND
7235                bin                 0:00                httpd -DFOREGROUND
7236                bin                 0:00                httpd -DFOREGROUND
7237                bin                 0:00                httpd -DFOREGROUND
7471                root                0:00                /bin/bash
```

## docker rename 古いコンテナ名 新しいコンテナ名

コンテナ名を変更する

```docker
>docker rename test01 test02
```

## docker cp コピーファイル コピー先

コンテナとファイルをやり取りする

* コンテナ上のファイルをローカルに保存する

```docker
>docker cp test01:/usr/local/apache2/logs/httpd.pid C:\Users\user\Documents
```

* ローカルファイルをコンテナ上にコピーする

```docker
>docker cp C:\Users\user\Documents\mod_httpd.pid test01:/usr/local/apache2/logs/
```

## docker diff コンテナ名

イメージとコンテナとの差分を表示する

```docker
>docker diff test01
C /root
A /root/.bash_history
C /usr/local/apache2/logs
A /usr/local/apache2/logs/httpd.pid
A /usr/local/apache2/logs/mod_httpd.pid
```

## docker commit コンテナ名 ユーザ名/イメージ:タグ名

コンテナからイメージを作成する

```docker
>docker commit test01 user/test1:0.1
sha256:e90b3d2f6a7c8473200652d53dcd2c3c18f03869639e1708dc568f37cbc557fc

>docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
user/test1                  0.1                 e90b3d2f6a7c        11 seconds ago      177MB
```

## docker export/import コンテナ名/ファイル名

コンテナをファイル出力(export)し、ファイルからイメージを生成(import)するコマンド

```docker
>docker export test01 > test01.tar
```

```docker
>docker import test01.tar
sha256:021d244b9b95f8acbaf357887667b8e86df94085af1140baaa6ec037f94abd3a

>docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
<none>                      <none>              021d244b9b95        6 seconds ago       174MB
```

## docker save/load ファイル名 イメージ名

イメージをファイル出力(save)し、ファイルからイメージを生成(load)するコマンド
export/importと違い、イメージをそのままsave/loadするためタグ名等もそのまま復元する

```docker
>docker save -o httpdsave.tar httpd
```

```docker
>docker load -i httpdsave.tar
540a7775e563: Loading layer [==================================================>]  3.584kB/3.584kB
f57aec6a98ba: Loading layer [==================================================>]   2.56kB/2.56kB
7e41cdcec3c2: Loading layer [==================================================>]   5.12kB/5.12kB
ab31df24cf72: Loading layer [==================================================>]  46.59MB/46.59MB
c7f490f23a8d: Loading layer [==================================================>]  10.29MB/10.29MB
25b1f3c8c9ad: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: httpd:latest
```

## その他のコマンド

### コンテナ起動時の環境指定

-eで環境変数指定
-wで作業ディレクトリ指定

```docker
> docker run -e 環境変数=値
> docker run -w ディレクトリ
```

### コンテナ稼動確認

```docker
> docker stats コンテナ名

CONTAINER           CPU %               MEM USAGE / LIMIT    MEM %               NET I/O             BLOCK I/O           PIDS
test01              0.01%               5.48MiB / 973.7MiB   0.56%               828B / 0B           2.92MB / 0B         82
```

Ctrl + C で停止する

### コンテナ再起動

```docker
> docker restart コンテナ名
```

### コンテナ中断／再開

```docker
> docker pause コンテナ名

>docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                  PORTS               NAMES
d3ef7a985ed4        httpd               "httpd-foreground"   3 minutes ago       Up 3 minutes (Paused)   80/tcp              test01

> docker unpause コンテナ名
```

### コンテナへの接続

```docker
> docker attach コンテナ名
```

稼動していないと接続できない上に、docker execコマンドがあるため、いまいち使用ケースがわからない、、、

### コンテナ上で実行されているプロセス確認

```docker
> docker top コンテナ名
PID                 USER                TIME                COMMAND
24488               root                0:00                httpd -DFOREGROUND
24516               bin                 0:00                httpd -DFOREGROUND
24517               bin                 0:00                httpd -DFOREGROUND
24518               bin                 0:00                httpd -DFOREGROUND
```

### コンテナのポート転送確認

```docker
> docker port コンテナ名
80/tcp -> 0.0.0.0:8080
```

### Dockerバージョン確認

```docker
> docker version
Client:
 Version:      17.09.1-ce
 API version:  1.32
 Go version:   go1.8.3
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:22:26 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.09.1-ce
 API version:  1.32 (minimum version 1.12)
 Go version:   go1.8.3
 Git commit:   19e2cf6
 Built:        Thu Dec  7 22:28:28 2017
 OS/Arch:      linux/amd64
 Experimental: true
```

### Docker実行環境確認

コンテナの状態やイメージ数を確認できる

```docker
> docker info
Containers: 6
 Running: 1
 Paused: 0
 Stopped: 5
Images: 27
～～～省略～～～
```