1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Play framework2.8にDockerを導入してみた

Last updated at Posted at 2021-06-03

この度Play frameworkの環境をDockerで構築してみたのでメモ。

##使用するdocker image
今回使用したDocker imageはこちら

sbtのimageに関してはhseebergerさんが作成したものがあったので使わせてもらいます。
また、データベースにmysqlを使用するのでmysqlのimageも使います。他のデータベースを使う場合は使いたいデータベースのimageを用意してください。

##作成したdocker-compose.yml
複数のコンテナを使う場合はdocker-composeを使うと便利です。
playframeworkのプロジェクトに以下のymlファイルを作成しました。

docker-compose.yml
version: '3'
services:

  sbt:
    build: .
    image: hseeberger/scala-sbt:8u222_1.3.5_2.13.1
    container_name: sbt
    volumes:
        # このプロジェクト自体をコンテナ内の/rootディレクトリにマウント
        - .:/root
    ports:
        - 9000:9000
    expose:
        - "9000"
    tty: true

  db:
    image: mysql:5.7
    container_name: mysql
    environment:
        MYSQL_DATABASE: playdb
        MYSQL_USER: hoge
        MYSQL_PASSWORD: hogepassword
        MYSQL_ROOT_PASSWORD: hogepassword
    volumes:
        - ./db/data:/var/lib/mysql # データを永続化するためローカルにデータをマウント
        - ./db/sql:/docker-entrypoint-initdb.d # 初期データの投入関係
        - ./db/my.cnf:/etc/mysql/conf.d/my.cnf # 文字コード設定用
    ports:
        - "3306:3306"
    expose:
        - "3306"

play framework側の設定

play frameworkにmysqlを導入するための設定をします。
build.sbtとapplication.confに以下のコードを追加します。

build.sbt
libraryDependencies +=  "mysql" % "mysql-connector-java" % "5.1.41"
application.conf
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://db:3306/playdb" #コンテナ名:ポート番号/データベース名
db.default.username=hoge
db.default.password=hogepassword

詳しいことはplayframeworkの公式ドキュメントを参照してください。

##dockerでmysqlを導入するときの注意点
dockerのmysqlはデフォルトのままだと latin1という日本語を扱えない文字コードが設定されているのでutf8やutf8mb4に変更しないといけません。
方法はいくつかありますが、私はmy.cnfファイルを使いました。
プロジェクトにdbディレクトリをつくり、そこに以下のmy.cnfファイルを作成して文字コードを指定します。

my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4

先程のdocker-compose.ymlにもありましたが、これをdockerコンテナ内のetc/mysql/conf.d/my.cnfにマウントします。

docker-compose.yml
volumes:
        - ./db/my.cnf:/etc/mysql/conf.d/my.cnf # 文字コード設定用

こちらが参考にした記事。

これでmysqlで日本語を扱えるようになります。
ただし変更前に一度作成したテーブルの文字コードはそのままになっているので自分で変更する必要があります。

###mysqlの永続化
また、Dockerでmysqlを導入した場合、気をつけないといけないのがデータの永続化についてです。
当然ですがmysqlに保存したデータはmysqlのコンテナが持っているので、もしmysqlのコンテナを削除したら保存したデータも一緒に消えてしまいます。
それでは困るのでデータはコンテナだけでなくローカル側にも持たせてデータを永続化しましょう。

今回docker-compose.ymlにて以下のコードを記述してコンテナ内のデータをローカルにも持たせています。

docker-compose.yml
volumes:
        - ./db/data:/var/lib/mysql # データを永続化するためローカルにデータをマウント

参考にした記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?