コンテナ勉強第３回～Dockerの操作～

今回やりたいことは前回せっかく準備した環境をつかって、Docker経由でコンテナを操作してみる、です。

①Docker上でコンテナの簡単な操作をやってみる
②Webサーバ（nginx）を構築してみる

## 第３回 コンテナ操作をしてみます
<br>
まずそもそもDocker上でコンテナを操作した時にどんなことが起きるのかを整理してみます。
<br>
・コンテナの実態はイメージと呼ばれるもの
<br>・イメージとは **コンテナに格納されるアプリケーションやアプリケーションの実行に必要な設定ファイル、実行環境、ミドルウェア、ライブラリなどをひとまとめにした、ファイル、設定情報のかたまり**
<br>・Dockerのイメージ（仮想マシンでいうところのVMイメージ）は、Web上のDocker Hubで公開
　https://hub.docker.com/を見ると、どんなイメージが公開されているか確認できる。
<br>・そこからDockerイメージを取得してくれば、すでに必要なミドルウェアなどがインストールされた状態のDockerコンテナを起動でき、すぐに使用できる。
<br>
…なんかあまりに簡単そうに見えてるので余計怪しいです。
<br><br>
<br>

## ではさっそく操作手順
### ①Docker上でコンテナの簡単な操作をやってみる


**A, 公式に用意されているhello-worldのイメージを使い、Dockerのコンテナを動作させてみる**
```
//Dockerを実行してみる 
　docker run hello-world
```
![Picture3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/40ecff0d-aaed-c991-f32e-e18f234a1219.png)

  
**B, 裏側で動いた処理について補足**
　・hello-worldのDockerイメージの取得
　　*docker run hello-worldでは、ローカルにhello-worldのイメージが存在しない場合、Docker Hubからイメージの取得を行う処理が走る
　・取得したイメージを元にコンテナの作成
　・作成されたコンテナの起動
　　docker runコマンド自体はコンテナの生成と起動に使うコマンドみたいですが、今回はイメージがローカルにないため、イメージ取得の処理からスタートしているみたい。
  
**C, 状態を確認できるコマンドをいくつか試してみる**
　・どのようなイメージがDocker Hubに登録されているかはdocker searchコマンドを使って調べる
```
// hello-worldイメージの検索
　　docker search hello-world
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/4df308f8-a6db-d033-f9d6-d7ddcd80d978.png)


 ・表示されたイメージを取得する場合はdocker pullコマンド
```
// hello-worldイメージの取得
　　docker pull hello-world
```



<br>

### ②Webサーバ（nginx）を構築してみる
<br>
参考リンク

https://knowledge.sakura.ad.jp/13265/
https://qiita.com/k5n/items/2212b87feac5ebc33ecb

A, nginx のログを出力する nginx/log ディレクトリをホスト側に作成しておく
```
　mkdir -p nginx/log
```

B, Dockerがインストールされた環境で以下を実行
```
　docker run -d -p 8080:80 -v $(pwd)/nginx/log:/var/log/nginx --name webserver nginx
```
   -p 80:80 はホスト側の8080番ポートをコンテナ側の80番ポートに転送するように指定。
   -v (pwd)/nginx/log:/var/log/nginx はホストのディレクトリ($(pwd)/nginx/log)をコンテナのディレクトリ(/var/log/nginx)としてマウント。
   ホスト側のディレクトリも絶対パスで指定する。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/f8c09b2a-7914-9c54-8858-237e0802e76d.png)

C, localhost接続で、Webサーバーにアクセスできることの確認。
```
//ブラウザのURL欄に入力
　http://localhost:8080/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/1ec54832-a4a3-9fe9-d83d-37892986f8be.png)

D, アクセスログも確認しておきます。
```
　cat nginx/log/access.log
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3895754/d56ea30f-f9cd-8375-44af-0304ebee0a48.png)

<br>

### 応用編（nginx）
①' プチ応用として、自分でコンテナをイメージ化して一通り起動や削除ができるようになっておく。
D, コンテナをイメージ化し、実行する
```
//コンテナをイメージ化 (commit)
test01@test01-virtual-machine:~$ docker commit 728e3e106318 nginx2

//commit してイメージ化したものから run
test01@test01-virtual-machine:~$ docker run -d -p 8080:80 -v $(pwd)/nginx2/log:/var/log/nginx2 --name webserver2 nginx2
    
//コンテナを停止 (stop)
test01@test01-virtual-machine:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                     NAMES
bdfe1b9ed360   nginx2    "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   webserver2

test01@test01-virtual-machine:~$ docker stop bdfe1b9ed360
bdfe1b9ed360

//コンテナを起動 (start), 実行中コンテナ一覧確認 (ps)
test01@test01-virtual-machine:~$ docker start bdfe1b9ed360
bdfe1b9ed360

test01@test01-virtual-machine:~$ docker ps
CONTAINER ID   IMAGE     COMMAND                   CREATED         STATUS         PORTS                                     NAMES
bdfe1b9ed360   nginx2    "/docker-entrypoint.…"   3 minutes ago   Up 2 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   webserver2

```

E, コンテナを停止し、削除する
```
//コンテナを停止 (stop), 停止中も含めた全てのコンテナ一覧確認 (ps -a)
test01@test01-virtual-machine:~$ docker stop bdfe1b9ed360
bdfe1b9ed360

test01@test01-virtual-machine:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES


//いらなくなったコンテナを削除 (rm)
test01@test01-virtual-machine:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED             STATUS                         PORTS     NAMES
bdfe1b9ed360   nginx2        "/docker-entrypoint.…"   4 minutes ago       Exited (0) 24 seconds ago                webserver2
728e3e106318   nginx         "/docker-entrypoint.…"   35 minutes ago      Exited (0) 10 minutes ago                webserver
18c9beca4a89   hello-world   "/hello"                  50 minutes ago      Exited (0) 50 minutes ago                youthful_heisenberg
45fceaafa6b5   hello-world   "/hello"                  About an hour ago   Exited (0) About an hour ago             gallant_mclean


test01@test01-virtual-machine:~$ 
test01@test01-virtual-machine:~$ docker rm bdfe1b9ed360
bdfe1b9ed360

test01@test01-virtual-machine:~$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                   CREATED             STATUS                         PORTS     NAMES
728e3e106318   nginx         "/docker-entrypoint.…"   36 minutes ago      Exited (0) 10 minutes ago                webserver
18c9beca4a89   hello-world   "/hello"                  50 minutes ago      Exited (0) 50 minutes ago                youthful_heisenberg
45fceaafa6b5   hello-world   "/hello"                  About an hour ago   Exited (0) About an hour ago             gallant_mclean

//いらなくなったイメージを削除 (rmi)
test01@test01-virtual-machine:~$ docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:d211f485f2dd1dee407a80973c8f129f00d54604d2c90732e8e320e5038a0348
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a

//イメージが存在しないのでrunするとPullから始まる
test01@test01-virtual-machine:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Already exists・・・

```


<br>

## まとめ
ツールがインストール済みのDockerイメージはいろいろと公開されています。
例えば、postgresやPython,wordpress, さらにbitnamiのデータサイエンス系のイメージなどもDockerHubに公開されており、上記と同程度のコマンドで起動することができます。
<br>
そのためDockerを使えば、ちょっと気になったツールを上記のようにすぐ使用できるので、とても便利。
上記は一般に公開されているDockerイメージを使いましたが、自分でDockerイメージを作成することができます。
さらにそれを他の人にも取得してもらえば、簡単に同じ環境を作るような構築運用も可能みたいです。



参考リンク
https://qiita.com/takusan64/items/4d622ce1858c426719c7
https://qiita.com/k5n/items/2212b87feac5ebc33ecb