SlideShare a Scribd company logo
Dockerではじめる
Java EE アプリケーション開発
for JJUG CCC 2017 Fall
• 齋藤 耕平 (さいとう こうへい)
• Twitter : @SightSeekerTw (https://twitter.com/SightSeekerTw)
• Qiita: SightSeekerTw (https://qiita.com/SightSeekerTw)
• GitHub: sightseeker (https://github.com/sightseeker)
• この部屋のハッシュタグ: #ccc_m6
Goal
•Docker使って Java EE 開発環境の
セットアップを楽にする
•JavaエンジニアをとりあえずDockerに入門
させ、コンテナ開発/運用時代に備えてもらう
• IDE(統合開発環境) の話はしません
• 実は Java EE っぽい話はあまりない
• マイクロサービスの話もしません
• DevOpsの話も出てきません
Story
•エンジニアのPC(開発機)はだいたい1台/人
•担当するプロジェクトが変わる度に
使うツールが変わる
• JDKのバージョンが変わる
• 使うアプリケーションサーバが変わる
• 使うDBMSが変わる
•いちいち入れ直したり、複数バージョンの
共存を考えたりしなきゃいけない
😣
つらい。。
とりあえず 開発機 (PC) に
Docker 入れましょう
• Docker CE for Mac
• https://store.docker.com/editions/community/docker-ce-desktop-
mac
• Docker CE for Windows
• https://store.docker.com/editions/community/docker-ce-desktop-
windows
どんな開発環境を作るか
• Gradle (最新版) with OpenJDK 8
ビルド環境
• WildFly 10.1.0.Final
デプロイ環境 (Java EE サーバ)
• MySQL 5.6
データベース
百聞は一見にしかず (Demonstration)
ブラウザで http://localhost:8080/webapp にアクセス
何が起こったか
•コンテナの仮想ネットワークを構築
•Gradle のプロセスが起動するコンテナが起動
•WildFly が起動するコンテナを起動
•MySQL が起動するコンテナを起動
HostOS
(macOS/Windows10/Linux)
Docker
要はこういうこと
/projec
t
./
0.0.0.0:8080
コンテナのディレクトリに
ホストOSのディレクトリを
マウント
0.0.0.0:3306
Deploy JDBC
コンテナのTCPポートを
ホストOSのTCPポートに
バインド
Docker 上に構築された仮想Network
8080 3306
Gradleのコンテナ
• Gradleプロセスが動いてるコンテナが立ち上がってる
• ホストOSのソースコードが配置されてる
ディレクトリがマウントされてる
• 今回 実行してる gradle のタスク
• (ファイルの変更を検知して)
• ビルド : warをパッケージ
• デプロイ : cargoプラグインを使ってWildFly にデプロイ
WildFlyのコンテナ
•WildFlyのプロセスが動いてるコンテナが起動
する
• MySQL の JConnector をインストール済
• MySQL の コネクションプール 設定済
• WildFly の管理ユーザ 設定済
• コンテナイメージ
https://hub.docker.com/r/sightseeker/wild
fly-deployment-demo/
※このコンテナイメージだけ自作してます
MySQLのコンテナ
•MySQL 5.6 のプロセスが上がるコンテナ
が起動する
•WildFly のコネクションプールが参照す
る
•スキーマが作られてる
•ユーザ/パスワードが設定されてる
コンテナはどこから来たのか?
コンテナはどうやってつくる?
Dockerfile を作成
ビルドするとコンテナイメージというものが作られる
docker run コマンドでイメージを指定すると起動する
Dockerfile
•どういうコンテナイメージ なのかの定義
•この定義を使ってビルドすると
コンテナイメージ ができる
•作ったイメージを指定して run すると
コンテナが起動する
今回したWildFlyのDockerfile
https://github.com/sightseeker/wildfly-deployment-demo
docker-compose
•Docker公式 オーケストレーションツール
•docker-compose.yml
• どういう構成でコンテナをデプロイするのかの定義
•Desktop版以外ではオプション
(Docker CE とは別にインストールが必要)
• サーバ環境だと、Swarmモードか、Kubernetes
あたり使うのが一般的?
Java エンジニア的にはこんな理解が良いかも
Dockerfile クラス定義
(.javaファイル)
イメージ コンパイルされたクラスファイル
(.classファイル)
コンテナ new して インスタンス化 した オブジェクト
docker-
compose.yml
どんな引数でインスタンスをnewするか定義したもの
Story 2
•WildFly のバージョン変えたい
これまでの運用だったら
• 運用メンバーのだれか
• 新しいWildFlyのバージョンをダウンロード
• ダウンロードしたWildFlyの設定を開発向けに設定を変更
• zipなどでアーカイブとしてまとめる
• どこかのファイルサーバに配置
• 開発メンバーのみんな
• 運用メンバーが作ってくれたアーカイブをダウンロード
• ダウンロードしたアーカイブを展開
• 今までつかってたWildFlyを削除するか移動させる
• デプロイの設定を変更したり
Demonstration
•運用メンバーのだれか
• Dockerfileに書いてある
WildFlyのバージョンを変更する
• 変更を GitHub にコミット
•開発メンバーのだれか
• 起動するコンテナのバージョンを変更する
(docker-compose.yml)
Docker Hub は
コミットトリガビルドしてくれる
DockerHub
Code Change
& Commit
Automated
Builds
やってみて感じたこと
• Java の IDE はまだ Dockerフレンドリーじゃない
本当はPCのIDEからコンテナにアタッチして
プロセスを実行したい
(gradle や mvnコマンドなど)
(できると思うが、工夫が必要)
• EclipseやNetBeansなどのGUIが起動するコンテナを立ち上げるとい
う裏技も無くはないが。。。
Option
Mavenの場合
• Maven には Continuous Build の機構が無いので、
Watcher Plugin を使えば、ファイル変更をトリガにし
て、パッケージ/デプロイができる
• https://github.com/fizzed/maven-plugins
作ったイメージを
共有するには
• Docker Registry
• Dockerのイメージを共有するために、保存しておくところ
• Maven や Gradle のリポジトリのようなイメージ
• Docker Hub
• Docker社公式の、Docker Registry
• 自分で Docker Registry を作ることもできる
• Docker公式のRegistry (無償の Docker CE だと UI がない)
• JFrog Artifactory Pro (有償)
• Sonatype Nexus 3 (Free)
• Atomic Registry (Free)
The End

More Related Content

Dockerで始める Java EE アプリケーション開発 for JJUG CCC 2017

Editor's Notes

  • #3: Dockerを使ったことがあるか?