【Docker-01】ミドルのチューニングどうやるんだ

#はじめに
コンテナでNginx起動してる環境のチューニングってまあ普通にやればいいんだけど、
これ障害対応とかでコンテナ作り直しになった時って設定戻るんじゃ？
そゆときってどう対応すればいいんだ！と思い調査＆検証しました。

現時点の私のDocker力は概要知ってる程度です。堂々と書く。

#お題目
TLS1.0, 1.1が2020年に主要ブラウザから正式に無効化されるとのことで、Nginxのコンフィグ書き換えてTLS1.2のみ有効化する。
起動しているコンテナの設定ではなく、イメージに手を加えて根本から解決したい。

#環境と使用書籍
mac
[プログラマのためのDocker教科書](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%E6%95%99%E7%A7%91%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%98%BF%E4%BD%90-ebook/dp/B07BHK5KX7/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=docker&qid=1573610875&sr=8-5)

#検証開始
##調査＆推測
書籍をChapter7までガーッと読む。
年始に1周読了していたことと、業務のProduction環境でDockerが使われていたので以前よりイメージし易かったです。技術の業務利用は本当に大事ですね。

Docker composeを使うのかな、docker-compose.ymlの文中で記述すればいいのかな？と思っていたのですが、そこまでしなくてもよさげ。
ブラウザでの確認もいらないので証明書も不要。
DockerfileにADDすれば良さそうだけどADDはファイルやディレクトリに限る、と書いてるしなーと思いながらググると設定ファイル（今回だとnginx.confとかの何々.conf系）を用意してそれをADDすれば実現できるらしい。
てことはそれを記述したDockerfileを作成して、そこからイメージを作ってコンテナ起動すれば反映されるのでは！
先人のありがたき知恵よ。。

##各種ファイルの準備
OSはubuntu、ミドルはNginx、nginx.confをADDする1文を記述したDockerfileを用意します。
今回の検証で使用したDockerfileは[githubにupしておきました。](https://github.com/okomechan/Docker/tree/master/Docker_01)
また、リソースの命名は[プログラマのためのDocker教科書](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEDocker%E6%95%99%E7%A7%91%E6%9B%B8-%E7%AC%AC2%E7%89%88-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%81%AE%E5%9F%BA%E7%A4%8E%E7%9F%A5%E8%AD%98-%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-WINGS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%98%BF%E4%BD%90-ebook/dp/B07BHK5KX7/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=docker&qid=1573610875&sr=8-5)を参考にさせて頂きました:pray:

・Dockerfile

```
# ベースイメージの設定
FROM ubuntu:latest

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

# nginx.confの追加
ADD nginx.conf /etc/nginx/

# ポート指定（書かなくても動作します。なんとなくw）
EXPOSE 443
EXPOSE 80

# Nginxの実行
CMD ["nginx", "-g", "daemon off;"]
```

・nginx.conf
デフォルトの記述内容を丸ごとコピペしてTLSの行だけ編集する。
Docker fileで指定することでコンテナ起動時に上書きできます。
/etx/nginx/conf.d/に配置しても動くらしいのですが、今回の検証ではうまくいかず。

```
・編集前
# cat -n nginx.conf
34 ssl_protocols TLSv1.0 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE

・編集後
# cat -n nginx.conf
34 ssl_protocols TLSv1.2; # Dropping SSLv3, ref: POODLE
```

用意したファイルを同じディレクリに配置して準備完了。
以降のコマンドはカレントディレクトリから実行しています。

##Docker imageの作成
-tは「'名前:タグ' 形式で名前とオプションのタグを指定」するオプション。
http://docs.docker.jp/engine/reference/commandline/build.html

```
$ docker build -t base-image .
PIDが出力されます。
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
base-image          latest              xxxxxxxxxxxx        8 seconds ago   　　152MB
```

##コンテナ起動
80ポートのマッピング「-p 80:80」は指定しなくても動作します。

```
$ docker container run --name webserver01 -d -p 80:80 base-image
PIDが出力されます。
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
xxxxxxxxxxxx        base-image          "nginx -g 'daemon of…"   8 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp, 443/tcp   webserver01
```

##bash起動＆コンフィグ確認
```
$ docker container exec -it webserver01 /bin/bash
# cat -n /etx/nginx/nginx.conf
34 ssl_protocols TLSv1.2; # Dropping SSLv3, ref: POODLE
```

成功！
コンテナのstop→startや、pause→unpauseでも消えません。
嬉しいw

#おわりに
稼働率高いコンテナの応急処置でフロントエンドに設定入れる、はすぐ思いついたのですがイメージに設定入れる手段が思いつかず。。当初はNginxの公式イメージが対応するのかな？とか思ってたのでw、知識の整理ができて良かった。重ねた推測も通って満足です！

今回はlocalで実行したので、次の課題はEC2にDockerインストールするとか、それを構成管理するとか、ですね。Terraform大好き勢としてVagrantも触ってみたかったりする。

#おまけ
今回の検証でよく使ったコマンドをメモ書きしておきます。

##バージョン情報
```
$ docker -v

# 細かいバージョン情報まで出ます
$ docker version
```

##イメージの作成と一覧の出力
タグは省略可能。

```
$ docker build -t [任意のイメージ名:タグ] [Dockerfileの配置ディレクトリのパス]
$ docker image ls
```

##コンテナ起動
-dはバックグラウンドでコンテナを実行するオプション。
-pはポートのマッピング。

```
$ docker container run --name [コンテナ名] -d -p [コンテナのポート番号:ホストOSのポート番号] [ベースイメージ名]
PIDが出力されます。
```

##プロセスの確認

-aオプションで停止中のコンテナも表示されます。

```
$ docker container ps -a
$ docker stats [コンテナ名]
```

##シェルの起動
```
$ docker container exec -it [コンテナ名] /bin/bash
```

##コンテナの削除
```
$ docker rm [コンテナID]
$ docker rm 'docker ps -a -q'
```

##イメージの削除
```
$ docker rmi [イメージ名]もしくは[イメージID]
```

以上です:innocent: