Docker使ってみた

またまた今更ながらにDockerを使ってみた。

#やること
Amazon LinuxのコンテナでTomcatを動かし、すごく簡素なAPIを作成する。Dockerのインストールなんかは他の記事で通常通りインストールした状態。

#環境

```console
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.12.6
BuildVersion:	16G29
$ docker -v
Docker version 17.12.0-ce, build c97c6d6
```

#Amazon Linuxのコンテナの準備

DockerにてAmazon Linuxのコンテナが用意されていますのでそちらをpull(ダウンロード)します。

```console
$ docker pull amazonlinux:latest
```

読んで分かる通りAmazon Linuxコンテナの最新をダウンロードしてきます。
ダウンロードできてるか確認。

```console
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         latest              6133b2c7d7c2        2 months ago        165MB
```

#Amazon Linuxの起動
```
$ docker run -d -it -p 4000:8080 amazonlinux
```
###解説
1. docker run <レポジトリ名>で起動できます。
1. -d はdetachモードです。バックグラウンド起動ができます。つけてないとそのままAmazon Linux内にログインした状態から始まります。
1. -i はinteractiveモードです。説明には「Keep STDIN open even if not attached」と書いてあります。恐らくですが、これがないと何も追加されてないサーバーはそのまま終了(Exited)状態になってしまいます。この後サーバー内で作業を行うために起動状態にしておきたいためつけます。
1. -t はttyのことです。と言いつつ私もよくわかりません。ようはDockerの標準出力をホストの標準出力につなぐということのようです？？試しに無しでやってみると、Dockerコンテナ内のコマンドの結果等が表示されません。
1. -p はポートです。左側がホスト側のポート、右側がコンテナ側のポートです。上記を訳すとホスト側の4000ポートをDockerの8080に流すということです**(今回のapiは8080で起動するように設定してあります。自分のAPIの設定によって8080を変更して下さい。)**。

#Jarの転送
今回は、Springで作ったTomcat込みのjarを用意しました。
/testにアクセスるとJsonを定数で返すだけの簡単なAPIです。

そのAPIをJarにビルドした後、ホストからコンテナに転送します。
まずは起動したAmazon LinuxのIDを調べます。

```console
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                    NAMES
55ba00eb4a83        amazonlinux         "/bin/bash"         About a minute ago   Up About a minute   0.0.0.0:4000->8080/tcp   optimistic_roentgen
```

dockerのcpコマンドを使って転送します。

```console
$ docker cp testApi.jar 55ba00eb4a83:/home/testApi.jar
```

フォーマットは、`docker cp <ローカルファイルパス><転送先ID:転送先パス>`です。

#起動したAmazon Linuxに接続する

接続はattachコマンドで行います。

```console
$ docker attach 55ba00eb4a83
```
attachの後に先程調べたIDを使用すると接続できます。
こうするとコンテナに接続され、ls等のコマンドが打てるようになります。

###余談
接続した状態がら抜ける方法は2つあります。
1. Control + P → Control + Q
→ こちらはコンテナが起動したまま、ログアウトできます。
2. exitと打つ
→ こちらはコンテナがExit状態になります。

コンテナから出たり入ったりしたい場合は1を使います。

#TomcatでAPI起動
普通にAmazon Linuxをセットアップするのと同じです。

```console
bash-4.2# yum -y install java-1.8.0-openjdk-devel
bash-4.2# cd /home/
bash-4.2# java -jar testApi.jar
```
今回はSpringにTomcatが含まれているのでそのまま上記で起動できます。

#API呼び出し
ブラウザに`localhost:4000/<パス>`といれるとAPIの結果が表示されます。

先程起動した時を思い出して欲しいのですが、ポート設定で4000を8080に通しています。
よって、ブラウザで4000と入れるとコンテナの8080に遷移します。

#最後にもう一つ
この後exit等でコンテナを止めた際、再度docker runすると今回始めにダウンロードしてきたコンテナの状態になってしまいます。これはコンテナを自分用に保存する必要があります。

まずは、先程起動したAmazon Linuxの名前を調べます

```console
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
55ba00eb4a83        amazonlinux         "/bin/bash"         22 seconds ago      Exited (0) 3 seconds ago                       optimistic_roentgen
```

-aをつけるとExitしたImageもリストに表示されます。
そしてcommitコマンドで保存します。

```console
$ docker commit optimistic_roentgen amazonlinux:mytest
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         mytest              ad280bcf7cd1        2 hours ago         590MB
amazonlinux         latest              6133b2c7d7c2        2 months ago        165MB
```

commitコマンドは`docker commit <イメージ名> <Repository名>:<Tag名>`です。今回はamazonlinuxレポジトリのmytestタグで保存しました。

#まとめ
スタートする時にちゃんとコンテナを準備しながらやれば以降の開発が捗りそうですね。