Dockerを動かしてみた

２つの教材でdockerを学習しました。
① [ドットインストール Docker入門](https://dotinstall.com/lessons/basic_docker)
② [本田有呼さん著 「Dockerのことが全くわからず現場で形見の狭い思いをしているプログラマー向けの本」](https://www.amazon.co.jp/Docker%E3%81%AE%E3%81%93%E3%81%A8%E3%81%8C%E5%85%A8%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%89%E3%81%9A%E7%8F%BE%E5%A0%B4%E3%81%A7%E8%82%A9%E8%BA%AB%E3%81%AE%E7%8B%AD%E3%81%84%E6%80%9D%E3%81%84%E3%82%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E5%90%91%E3%81%91%E3%81%AE%E6%9C%AC-%E6%9C%AC%E7%94%B0%E6%9C%89%E5%91%BC-ebook/dp/B07J2L1LMW/ref=sr_1_1?ie=UTF8&qid=1550543850&sr=8-1&keywords=docker%E5%85%A8%E3%81%8F)

## Dockerとは
コンテナ型のアプリケーション実行環境のことです。
2013年に公開されてから爆発的に普及しました。

仮想化技術は長年、VirtualBoxなどが主流でした。
しかし、これらには次のようなデメリットがあります。
・導入や運用が大変
・動作が重い

ホストとなるOSの中で、更に独立したOSを動かしているイメージなので、重くなります。

これがDockerなら、「コンテナ」という単位でOSをそのまま動かせて、カーネルをホストのOSと共有できます。
＊ カーネル：OSの根幹

・軽い
・早い
・運用しやすい
とメリットがたくさんなので広まりました。

### Dockerの仕組み
#### Docker ファイル
Dockerイメージを作るための元ネタのことです。
Dockerイメージにテキストで命令します。
ビルドすることで、Dockerイメージが出来上がります。

#### Docker イメージ
コンテナを作るための雛形です。
どんなOSにどんなアプリを搭載してどんな動作をするか、などの情報が入っています。
雛形さえ作ってしまえば、同じ内容のコンテナを量産できます。

#### Docker コンテナ
Dockerイメージを生成することで出来上がります。
コンテナには実行中・停止・破棄の3つの状態があります。

#### Dockerの作業の流れ
①Dockerファイルに必要な記述をする
②ビルドしてDockerイメージが出来上がる
③実行してコンテナが生成される

### Docker コマンド
- FROM
Dockerイメージのベースとなるイメージを指定します。
指定したイメージはDocker Hubというポスティングサービスからダウンロードされるんです。

```docker
FROM ubuntu:14.04
#FROM イメージ名:タグ
```

- RUN
Dockerイメージをビルドするときに、コンテナの中で実行するコマンドをそのまま指定します。

```docker
RUN echo 'Hello World!'
```

- COPY
ローカルホストPCのリソースをコンテナにコピーします。

```docker
COPY main.go /tmp/work/
# COPY コピーするリソース／コピー先のパス
```

- CMD
コンテナの実行時に、コンテナ起動時の最初の1回だけ実行するプロセスを指定します。

- EXPOSE
コンテナを外部公開するときのポートを指定します。

外部公開するときには、Webサーバを使います。
よく使われるのがNginx(エンジンエックス)というものです。
高速かつ軽量に動きます。
```localhost:8080```
で起動できます。

### Dockerイメージのコマンドとオプション

Dockerイメージの操作は

```docker
docker image　操作　オプション
```

で基本的に行います。
ここでは、操作とそれぞれの操作で使うオプションを見ていきます。

- build
Dockerファイルからdockerイメージをビルドします。

```docker

docker image build -t helloworld:1.0 .
```

```−t```オプションはDockerイメージの名前とタグ名を指定するために必要です。
同じフォルダにDockerファイルがあるなら、パスの表記を```.```とできます。

##### ＊その他のオプション
- -f
Dockerファイルの名前を違う名前で使用できるようにします。

```docker
docker image build -f my Dockerfile -t helloworld:1.0 .
```

- --pull
DockerファイルのFROMに指定されているイメージを毎回Docker Hubから取得する場合に”true”を表示します。
一度取得したイメージはローカルpcに保存されているため、このオプションでtrueを確かめないと、過去に取得していなイメージを再利用してビルドされてしまいます。

```docker
docker image build --pull=true -t helloworld:1.0 .
```

- ls
ローカルPCに保存されているDockerイメージを一覧表示する
linuxコマンドでもよく使いますね！

```docker
docker image ls
```


- pull
Docker Hubで提供されているDockerイメージをダウンロードします。

```docker
docker image pull イメージ名：タグ名
```

- rm
ローカルPCに保存されているDockerイメージを削除します。
rm=removeですね！

```docker
docker image rm イメージ名
```
コンフリクトエラーが出た場合、```-f```オプションをつけてください。

- prune
不要なDockerイメージをまとめて削除します。


### Dockerコンテナのコマンドとオプション
コンテナの操作の基本は⇣です。

```docker
docker container run オプション名　イメージ名：タグ名
```

runコマンドで重要なオプションをいくつか紹介します。

- --name
コンテナ名を定義します。

- -i と -t
「Ctrl+C」に同じ。
セットで使う必要があるので、"-i -t"と書きます。

- -d
コンテナをバックグラウンドで動かします。
Webサーバなどでコンテナを動かすときに使います。

- -p
ポートフォワードするためのコマンドです。

```docker
docker container run -p 9999:8080
```
⇑なら、9999ポートのアクセスを8080ポートにフォワードする、という意味です。
＊ フォワード：転送の

- --rm
コンテナの終了時にそのコンテナを削除します。
一度きりしか使わないコンテナで使用します。

- stop
コンテナを停止します。

```docker
docker container stop コンテナ名
```

- restart
コンテナを再実行します。
stopで停止したコンテナは破棄しない限り再実行できます。

### これまでのコマンドをまとめて実行してみる

Dockerファイルの内容

```dockerfile
# ベースをubuntuにする
FROM ubuntu:18.10

# Nginxのインストール
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx

# ポートの指定
EXPOSE 80

#rootフォルダへリソースのコピー
COPY index.html /var/www/html/

#Nginxの起動
CMD ["nginx","-g","daemon off;"]
```

index.html (Webに表示する内容)

```html
<h1>この記事を読んでくださりありがとうございます！</h1>
```

表示する内容は何でも良いです。
２つのファイルは同じ場所に置いてください。

それでは、命令を出していきます。

まず、```cd```でファイルを保存した場所まで移動します。

移動したら、Dockerイメージをビルドします。

```docker
docker image build -t hello:1.0
```

次に、コンテナを動かします。

```docker
docker container run -i -t --rm -p 9999:80 hello:1.0
```

最後にブラウザで```http://localhost:9999/```にアクセスします。

そうすれば、

![範囲を選択_003.png](https://qiita-image-store.s3.amazonaws.com/0/298112/17107e0d-2e85-872b-cbba-4c2f61d3585c.png)

このように表示される。
ちなみに、本はamazonのkindleでめちゃくちゃ安いので、買ってみてもいいと思います。