Docker-composeとは
Compose とは、複数のコンテナを定義し実行する Docker アプリケーションのためのツールです。Compose においては YAML ファイルを使ってアプリケーションサービスの設定を行います。コマンドを1つ実行するだけで、設定内容に基づいたアプリケーションサービスの生成、起動を行います
https://docs.docker.jp/compose/overview.html
対象ファイル
https://github.com/naokikubo2/quickstart
上記URLに、docker環境でrailsの開発がすぐに初められるリポジトリがあります。
こちらでは、シェルスクリプトを利用して、1つのコマンドでdockerの様々なコマンドを自動的に処理可能です。
今回解説するのは、「docker-compose.yml」というファイルです。
composeのヴァージョン指定
version: '3'
Docker-composeのファイル形式のヴァージョンを表している。現状では3が最新。
service 作成
-
下記の
db
,redis
などはサービス名。任意の名前を設定できる。 -
1つのサービスで、1つのコンテナが起動する。
-
マウント時に、
cachedオプション
を使用していますが、これにより速度をあげることができます。詳細は、以下参照。- Docker for Mac のボリュームの遅さを cached オプションで解消(https://qiita.com/koshigoe/items/52749db8836b4e3fbfc4)
web: &app
web: &app
build: .
command: bundle exec rails s -p 3000 -b '0.0.0.0'
volumes:
- .:/app:cached
- bundle:/usr/local/bundle:cached
- /app/.git
environment:
HOME: /app
RAILS_ENV: development
ports:
- "3000:3000"
tty: true
links:
- db
(中略)
volumes:
bundle:
driver: local
-
build: .
の「ドット」: docker-compose.ymlと同じディレクトリをビルドコンテキストとしている
⇨ymlファイルと同じディレクトリに、webサービス用のDockerfileを作成しておく必要がある。 -
ports
: コンテナ外部に公開するポート & マッピング先のポート -
volumes
:-
.:/app:cached
: バインドマウント。docker-compose.ymlの存在するディレクトリにをコンテナの/app
ディレクトリにマウントしている。 -
bundle:/usr/local/bundle:cached
: volumesに定義したbundleのvolumeをwebサーバのコンテナの/usr/local/bundle
にマウントしている。名前を付けたvolumeをマウントする場合は、volumesに定義しておく必要がある。
-
-
link
: webサービスからdbサービスへのリンクを設定。
DB
db:
image: postgres
ports:
- "5432:5432"
volumes:
- data:/var/lib/postgresql/data:cached
environment:
POSTGRES_PASSWORD: postgres
DBはpostgresを使用しています。
以下オプション
以下のseviceは、webサービスを起動しても同時起動しない設定になってます。
redis
redis:
image: redis
ports:
- "6379:6379"
command: redis-server --appendonly yes
volumes:
- redis-data:/data:cached
Redisとは、オープンソースの永続化可能なインメモリデータベース(In-memory database)で、BSDライセンスで公開されています。
webアプリケーションのセッション管理に利用されます。また、HTMLコード片やページのキャッシュを行うことで、より速くwebページが表示される様にできます。
chrome
chrome:
image: selenium/standalone-chrome
ports:
- "4444:4444"
seleniumとは、webブラウザのテストを自動化するためのツール。webブラウザは、chromeを使用するイメージを利用するので、sevice名は、chromeにしています。
spring
spring:
<<: *app
command: bundle exec spring server
ports: []
- springは、railsコマンドの高速化に使うサービス
-
<<: *app
:web serviceを継承 - commandとportsをオーバーライド
solagraph
solargraph:
<<: *app
command: bundle exec solargraph socket --host=0.0.0.0 --port=7658
ports:
- "8091:7658"
links: []
- solargraphは、グラフ化を行う際に使用。
最後に
自分自身まとめながら、「今まで気にしていなかったけど、これは何だろう」という疑問を解消することができました。実践的に学んでいくのが一番なんだなと実感しました。(一方で、写経だけをしていては絶対に身につかない)
もし、記事が少しでも役立った場合はLGTMお願い致します!!