docker-composeを使うと連携する複数のコンテナを割と簡単に構築できます。
アプリケーションコンテナや開発用コンテナからデータベースコンテナを扱う際に気になったことをまとめてみます。
✗TOC
データベースの永続化
データベース内のデータは永続化しないと消えてしまうので、残したい場合は明示的に永続化させておく必要があります。
公式のイメージの設定例(redis, mysql, postgres, mongo)を書きます、ホストのディレクトリにマウントする方法(data volume)を採用しています。データコンテナを使う方法は書いていません。
redis
/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
/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
/var/lib/postgresql/dataをマウントします。
postgres:
restart: always
image: postgres
volumes:
- /my/own/datadir:/var/lib/postgresql/data
mongo
/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