またまた今更ながらにDockerを使ってみた。
#やること
Amazon LinuxのコンテナでTomcatを動かし、すごく簡素なAPIを作成する。Dockerのインストールなんかは他の記事で通常通りインストールした状態。
#環境
$ 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(ダウンロード)します。
$ docker pull amazonlinux:latest
読んで分かる通りAmazon Linuxコンテナの最新をダウンロードしてきます。
ダウンロードできてるか確認。
$ 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
###解説
- docker run <レポジトリ名>で起動できます。
- -d はdetachモードです。バックグラウンド起動ができます。つけてないとそのままAmazon Linux内にログインした状態から始まります。
- -i はinteractiveモードです。説明には「Keep STDIN open even if not attached」と書いてあります。恐らくですが、これがないと何も追加されてないサーバーはそのまま終了(Exited)状態になってしまいます。この後サーバー内で作業を行うために起動状態にしておきたいためつけます。
- -t はttyのことです。と言いつつ私もよくわかりません。ようはDockerの標準出力をホストの標準出力につなぐということのようです??試しに無しでやってみると、Dockerコンテナ内のコマンドの結果等が表示されません。
- -p はポートです。左側がホスト側のポート、右側がコンテナ側のポートです。上記を訳すとホスト側の4000ポートをDockerの8080に流すということです**(今回のapiは8080で起動するように設定してあります。自分のAPIの設定によって8080を変更して下さい。)**。
#Jarの転送
今回は、Springで作ったTomcat込みのjarを用意しました。
/testにアクセスるとJsonを定数で返すだけの簡単なAPIです。
そのAPIをJarにビルドした後、ホストからコンテナに転送します。
まずは起動したAmazon LinuxのIDを調べます。
$ 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コマンドを使って転送します。
$ docker cp testApi.jar 55ba00eb4a83:/home/testApi.jar
フォーマットは、docker cp <ローカルファイルパス><転送先ID:転送先パス>
です。
#起動したAmazon Linuxに接続する
接続はattachコマンドで行います。
$ docker attach 55ba00eb4a83
attachの後に先程調べたIDを使用すると接続できます。
こうするとコンテナに接続され、ls等のコマンドが打てるようになります。
###余談
接続した状態がら抜ける方法は2つあります。
- Control + P → Control + Q
→ こちらはコンテナが起動したまま、ログアウトできます。 - exitと打つ
→ こちらはコンテナがExit状態になります。
コンテナから出たり入ったりしたい場合は1を使います。
#TomcatでAPI起動
普通にAmazon Linuxをセットアップするのと同じです。
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の名前を調べます
$ 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コマンドで保存します。
$ 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タグで保存しました。
#まとめ
スタートする時にちゃんとコンテナを準備しながらやれば以降の開発が捗りそうですね。