docker-composeでデータベースコンテナを立てるときのTips

docker-composeを使うと連携する複数のコンテナを割と簡単に構築できます。

アプリケーションコンテナや開発用コンテナからデータベースコンテナを扱う際に気になったことをまとめてみます。


✗TOC

データベースの永続化

データベース内のデータは永続化しないと消えてしまうので、残したい場合は明示的に永続化させておく必要があります。

公式のイメージの設定例(redis, mysql, postgres, mongo)を書きます、ホストのディレクトリにマウントする方法(data volume)を採用しています。データコンテナを使う方法は書いていません。

redis

Docker Hub

/dataをマウントすると良いようです。docker-compose.ymlに以下のように記載します。

redis:
  restart: always
  image: redis
  volumes:
    - /my/own/datadir:/data
  command: redis-server --appendonly yes

commandでデフォルトの起動コマンドを書き換えているのがポイントです、--appendonly yesがないとデータが作られないので注意です。

マウントするホストのディレクトリは任意の場所にするのですが、相対パスが使えます。(Dockerのコマンドではダメだったような・・・)

例えば、

  volumes:
    - ./data/redis:/data

という指定も問題ないです。

GitLabで使っているsameersbn/redisでは、/var/lib/redisにデータがあり場所が違うのでそちらを使う場合はまた違う設定になるようです。

mysql

Docker Hub

/var/lib/mysqlをマウントします。

mysql:
  restart: always
  image: mysql
  volumes:
    - /my/own/datadir:/var/lib/mysql
  environment:
    - MYSQL_ROOT_PASSWORD=root

環境変数にMYSQL_ROOT_PASSWORDを設定するのは必須で、MYSQL_USERやMYSQL_PASSWORDは必要な場合は設定します。

vagrant+virtualbox上のDockerでmysqlを永続化したときパーミッションの問題が起こったのでそれに関しては以下の記事にまとめてます。

docker-composeでmysqlのデータ永続化したときのPermission Deniedの解決方法

postgres

Docker Hub

/var/lib/postgresql/dataをマウントします。

postgres:
  restart: always
  image: postgres
  volumes:
    - /my/own/datadir:/var/lib/postgresql/data

mongo

Docker Hub

/data/dbをマウントします。

mongo:
  restart: always
  image: mongo
  volumes:
    - /my/own/datadir:/data/db

データベースを参照する方法

参照したいコンテナのdocker-compose.ymlの設定にlinksを追加します。

application:
  restart: always
  build: .
  links:
    - mysql
    - redis
    - postgres:postgresql
    - mongo:mongodb
    - mongo

linksはコンテナを他のサービスにリンクします、指定方法は2種類あって

  • "<サービス>:<エイリアス>"
  • "<サービス>"(エイリアスとしても使われる)

複数個指定することもできます。

linksを書くと、コンテナ内の/etc/hostsに指定したサービス名が追加されます。

172.17.0.6      mongodb
172.17.0.4      mysql
172.17.0.2      postgresql
172.17.0.3      redis
172.17.0.6      mongo

DBにアクセスする場合は、ここにある名前を使ってアクセスするか、IPを直接指定すればできます。

redis-cliで接続する例だと以下のようになります。

$ redis-cli -h redis
redis:6379> 

特に指定がなければデフォルトポートが使用されています。

portの指定

公式のイメージでは、portsの記載がなくても勝手にデフォルトポートがポートフォワーディングされるので、書かなくてもいい。

公式のイメージ以外を使っている場合は明示的に指定する必要があるかもしれないです。

redisの例だと、docker-compose.yml

postgres:
  restart: always
  image: postgres

docker-compose psで確認すると

 Name                    Command               State   Ports
------------------------------------------------------------------
postgres_1    /docker-entrypoint.sh postgres   Up      5432/tcp

特に指定がなくてもポートフォワーディングされています。

Show comments

Adsense

Share

  • このエントリーをはてなブックマークに追加

About

趣味でプログラミングをしています。仕事では致し方なくC言語のようなC++を書いています。

Recently

Tags

Pages