はじめに
自分の技術スタックがあまりにもレガシーで情けなく感じ
レガシーおじさんを脱却し、技術者として再出発したく
勉強を始めました。宜しくお願いします😀
ということでまずはDockerを勉強することに。
構築するもの(今回のゴール)
ソフトウェア情報
OS:Windows10
Docker:19.03.12
Program:Java11
MySQL:8.0.21
Adminer:latest
WebBrowser:なんでも
とりあえず今回はホストOS上の自前のJavaプログラムから
コンテナ上のDBにアクセスするところからチャレンジ。
構築作業
1. Dockerコンテナ作成
DockerHubのMySQLの説明ページにあるdocker-compose.ymlをちょっとアレンジして準備。
DockerHub MySQLページ
# Use root/example as user/password credentials
version: '3.1'
services:
db:
image: mysql:8.0.21 #変更
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: hoge #追加
MYSQL_USER: hoge #追加
MYSQL_PASSWORD: hoge #追加
ports: #追加
- 3306:3306 #追加
adminer:
image: adminer:latest
restart: always
ports:
- 8080:8080
#が付いてるところがアレンジ部分。
MySQLイメージはlatestを指定するとバージョンがころころ変わりそうな気がしたので8.0.21を指定。
今回はコンテナ外部からアクセスするため、
適当なDBの追加とポート3306を外部公開するように設定。
上記設定ファイルと同階層のフォルダで
docker-composeコマンドで起動。
docker-compose up
フォアグラウンド実行なのでずらずらログが出るのを見つつ、
別コンソールで立ち上がってるか確認
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c5d267f22ee mysql:8.0.21 "docker-entrypoint.s…" 26 seconds ago Up 25 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql_db_1
258f5885810d adminer:latest "entrypoint.sh docke…" 26 seconds ago Up 25 seconds 0.0.0.0:8080->8080/tcp mysql_adminer_1
(´・ω・`)おぉー
2. Adminerでテーブル、データ作成
AdminerとはPHPで作られたDB操作できるWebクライアントらしい。
MySQL、Adminerのコンテナが立ち上がってる状態で
http://localhost:8080/
にアクセスすると以下の画面が出るので
さっきのdocker-compose.ymlに記載したDB、ユーザ情報を入れる。
3. Javaプログラム作成
まずgradleにMySQLドライバの依存関係を記載。
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'eclipse'
repositories {
mavenCentral()}
dependencies {
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.21'
testImplementation 'junit:junit:4.12'
}
そしてMySQLにSQLクエリを投げて結果を表示するクラスを作成。
public class DockerMySQLAccessor {
public static void main(String[] args) {
System.out.println("DockerコンテナのMySQLにアクセスするよ");
try(Connection con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/hoge?useSSL=false",
"hoge", // UserId
"hoge" // Password
)) {
PreparedStatement pstmt = con.prepareStatement("select * from TEST_TBL");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.printf("ID:%d, HOGE:%s \n", rs.getInt("ID"), rs.getString("HOGE"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
4. 実行
EclipseからさっきのJavaコードを実行。
さっき入れたレコードが取得できてる!
やったぜ。(´・ω・`)v
まとめ
とりあえずDockerを使って手軽に仮想的なDBサーバを立ち上げ、
ローカルのプログラムからアクセスすることができた。
今回はDocker触りということで
設定ほぼ丸写しでしかもいきなりdocker-composeの方を使ったけど
実際の運用ではコンテナ毎にDockerfile作ってイメージを作っていくのかな?
あと、プログラムもコンテナ上で実行し、コンテナ間で通信したいところ。
ここら辺はまた今度。
謝辞
Win10にDockerを入れるの大いに参考にさせて頂きました。感謝<(_ _)>
レガシーエンジニアによるDocker入門