Dockerド初心者の学習メモ

#はじめに
普段は偉い人との調整とパワポ職人をやっているエセエンジニアです。
**エンジニアを名乗っていてDockerをまともに使えないなんて死んだ石だ**と言われたのでがんばります。
備忘録としてのDocker学習メモです。
環境：MacOSX 10.15.5

#書いてあること
- Dockerをインストールする
- Nginxのコンテナを立ち上げる
- コンテナシェルに接続する
- Linkオプションを使ってリバプロサーバ経由のスタティックサーバを表示させる
- メモ：コンテナ作成から削除までのステータス一覧
- まとめ


#Dockerをインストールする

Dockerでググってインストールする。参考にしている記事とサイトのレイアウトが違っても怯んではいけない。

<img width="1273" alt="スクリーンショット 2020-07-26 15.23.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602492/e803e0d3-c01f-c2be-b7a0-13477a16159d.png">

Get Startedを選んで

<img width="963" alt="スクリーンショット 2020-07-26 15.23.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602492/ca860533-63fe-3716-a33c-e17404ca6f6b.png">

Docker Desktopの欄から選んでダウンロード。あとはダイアログにしたがってインストールする。

余談だが、参考サイトでは誰もDockerのことをDocker Desktopと呼ばないので、このページとは別に「Docker」のインストールサイトがあるのかと思い10分くらい探した。そんなことはなかった。

ついでにDocker Hubのアカウントも作っておく。

<img width="503" alt="スクリーンショット 2020-07-26 15.27.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602492/588f73cb-9ce4-c07b-9fa5-db9e781714f2.png">

お手軽。

#Nginxのコンテナを立ち上げる（練習）

えぬじんえっくす、と呼ぶらしい。フリーでオープンソースのWebサーバ。Apacheなら知ってるけどこちらはよく知らなかった。

コンテナ立ち上げは、nginxにかかれているコマンドをコピペしてターミナルに打ち込むだけ。

https://hub.docker.com/_/nginx
`$docker run --name test-nginx -v /test/content:/usr/share/nginx/html:ro -d nginx`

 参考文献の記載
`$docker run 
--name <コンテナ名> 
-d 
-v <ホスト側のディレクトリ>:<コンテナ側のマウントポイント>:<オプション> 
-p <ホスト側のポート番号>:<コンテナ側のポート番号> 
<イメージ名> `

- **-d**オプションはバックグラウンド動作させるオプションらしい。ないとフォアグラウンド挙動になるので、これを実行したターミナルでは別のコマンドを打てなくなる。（**デタッチドモード**）
- **-v**オプションは説明がみつからない。もうすこし慣れてから戻ってこよう。
- **-p**オプションはまだよくわからない。参考書には**コンテナのポートをホスト側に公開する**（？）と書いてあった。
- **-rm**オプションはつけておくとゴミが増えない。起動・停止したコンテナを自動的に削除する（デタッチドモード）。通常は起動・停止しているコンテナは残り続け、同じ名前のコンテナは起動できない。


#コンテナシェルに接続する

-  **$docker attach <コンテナ名>**
    - コンテナでシェルを実行している場合のみ。
    - Ctr-p,Ctr-qでコンテナ維持したまま抜けられる
    - exitで抜けた場合コンテナも消える・・
-  **$docker exec <コンテナ名> /bin/bash**
    - exitで抜けてもコンテナが停止しないので安全
    - **最初うまく挙動しなかった。**
        - echo $SHELLの結果、うちは/bin/zshだったので
        - ターミナルの環境設定を/bin/bashに変えたらうまくいった。

ただし、execなどの編集は、`$docker history`とかでコミット履歴を見た時に　”/bin/bash"かのコマンド履歴しか残らない。
そのため、**操作はDockerfileに書いて履歴を残すことが大事**だそうだ。なるほど。

#Linkオプションを使ってリバプロサーバ経由のスタティックサーバを表示させる

とてもシンプルに以下の様な構成を作る。

<img width="1277" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602492/e1574b47-aefd-c8ca-97a2-d00547918532.png">

* Linkオプション（エイリアスつくれる）が使える。
    * Docker run —link <コンテナ名>:<リンク先コンテナの別名>
    * リバプロサーバのhostsと環境設定に、いい感じの設定を追加してくれる。

ちなみにコンテナ名での名前解決は**Dockerのネットワーク**を使うことで作ることができるので、linkじゃなくてもいいらしい。linkは**環境変数の設定が必要なとき**に使ったらいいと思う。

##リバースプロキシイメージのビルド

リバースプロキシ用のconfファイルを作成する。

```conf:reverse-proxy/reverse-proxy.conf
server {
 	listen 8080; #8080で呼ばれたら 
 	server_name localhost;

 	location / {
 		proxy_pass http://ss; #ssに通す
 	}
}
```

confファイルと同じフォルダに、以下の内容でDockerfileを作成する。

```dockerfile:reverse-proxy/Dockerfile
FROM nginx:latest
COPY /reverse_proxy.conf /etc/nginx/conf.d/reverse_proxy.conf
RUN apt-get update && apt-get install -y inetutils-ping
```

で、現在のパスを元に、リバースプロキシイメージをビルドする。

```bash:bash
$docker build -t reverse-proxy .
```

##スタティックサイトを起動

```bash:bash
$docker run --name static-site -e AUTHOR="Tomomi" -d dockersamples/static-site
```
呼び出される側なので、リバプロコンテナより先に起動しておかなければいけない。
dockersamplesで提供されているイメージを使う。

##リバプロイメージからリバースプロキシコンテナを起動

```bash:bash
$docker run --name reverse-proxy -p 8080:8080 --link static-site:ss -d reverse-proxy
```
このときに、`--link`オプションでssという名前を関連づける。

localhost:8080にブラウザからアクセスすると、ちゃんとstatic-siteの内容が出てくる。
単純なHello World!よりも達成感があるね。
<img width="312" alt="スクリーンショット 2020-07-26 16.19.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602492/9827f024-125b-59e6-037a-54729470a686.png">

#メモ：コンテナ作成から削除までのステータス一覧

コマンド`docker ps` または `docker inspect <コンテナ名>`で確認できる。

* Created
    * コンテナが作られた状態。Docker createの直後。
* Running/Up
    * Docker startさせたやつ。
* Paused
    * Docker pauseさせたやつ。
    * Docker unpauseで解除できる。
* Restarting
    * 再起動中のステータス、見られることはあまりない。
* Exited
    * コンテナ実行して終了した状態。
* Removing
    * コンテナ削除中のステータス、見られることはあまりない。
    * 削除コマンドはDocker rm (起動中の場合は-fで強制終了）
* Dead
    * なんかで死んじゃった場合のステータス。
    * rmするしかない。

#思ったことメモ

思ってたより断然お手軽。**イメージ**と**コンテナ**の概念はまだ時々混乱する。'$docker ps'の読み方を早くマスターしたい。
Dockerはファイルサイズを小さくするためにいろいろ工夫されているなあと思った。
オプション系のリファレンスは早めにいい感じの参考文献を見つけて手元に持っておきたい。ググるのが大変。
次はDocker Machineとネットワークあたりまで行きたい。