キャベツ村代表エンジニアのひーこです。
複数のアプリケーションで開発を行なっていて、
例えば、サービス側と管理側でサーバーを分けたい、且つ、DB(model)は共通で使用したい。
という場面に直面した方も多いのではないでしょうか?
今回は、docker環境で、modelを分けたい場合に行なった方法を書いていきたいと思います。
まずは、管理側のアプリケーションコンテナからサービス側のコンテナに接続する必要があります。
ブリッチネットワーク (bridge networks)
今回はdokerのブリッチネットワーク(bridge networks)という物を使用しました。
コンテナ間の共通のネットワークを作成し、そのネットワーク間のコンテナが接続できる様にします。
docker network create share_db
たったこれだけで、ネットワークが作成されました!
hi-ko@hogeHi-ko hogeApp % docker network ls NETWORK ID NAME DRIVER SCOPE e8de5XXXXX share_db bridge local
次に、docker-compose .ymlに共有ネットワークの記述をします
管理側 doker-compose.yml
version: 'XXX' services: app: tty: true stdin_open: true build: context: . command: bundle exec puma -C config/puma.rb volumes: - .:/hogehoge - public-data:/hogehoge/public - tmp-data:/hogehoge/tmp - log-data:/hogehoge/log environment: - "DATABASE_HOST=db" - "DATABASE_PORT=1234" - "DATABASE_USER=hogehoge" - "DATABASE_PASSWORD=hoge" //ここに追記↓ networks: - share_db web: build: context: containers/nginx volumes: - ./certs:/etc/nginx/ssl - public-data:/hogehoge/public - tmp-data:/hogehoge/tmp ports: - '8080:80' - '442:443' depends_on: - app //ここに追記↓ networks: share_db: external: true volumes: certs: datavol: public-data: tmp-data: log-data:
サービス側 doker-compose.yml
services: app: tty: true stdin_open: true build: context: . command: bundle exec puma -C config/puma.rb volumes: - .:/hoge - public-data:/hoge/public - tmp-data:/hoge/tmp - log-data:/hoge/log environment: - "DATABASE_HOST=db" - "DATABASE_PORT=5432" - "DATABASE_USER=hoge" - "DATABASE_PASSWORD=hoge" depends_on: - db //ここに追記↓ networks: - share_db db: image: postgres ports: - "5432:5432" expose: - '5432' environment: - "POSTGRES_USER=hoge" - "POSTGRES_PASSWORD=hoge" //ここに追記↓ networks: - share_db web: build: context: containers/nginx volumes: - ./certs:/etc/nginx/ssl - public-data:/hoge/public - tmp-data:/hoge/tmp ports: - 80:80 - 443:443 depends_on: - app //ここに追記↓ networks: share_db: external: true
管理側のdatabese.ymlは、サービス側のdatabase.ymlと同じ内容になります。
では、コンテナ経由で接続してみましょう
と、その前に、作成したネットワークにどのコンテナがあるのか確認してみましょう
hi-ko@hogeHi-ko hogeApp % docker inspect network share_db [ { "Name": "share_db", "Id": "e8de537XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Created": "2020-02-05T01:11:11.8324143Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "XXX.XX.X.X/XX", "Gateway": "X.X.X.X" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "47d86XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": { "Name": "db_1", "EndpointID": "64c85XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "MacAddress": "XX:XX:XX:XX:XX:XX", "IPv4Address": "XXX.XX.X.X/XX", "IPv6Address": "" }, "73765XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": { "Name": "admin_app_1", "EndpointID": "f4ccfXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "MacAddress": "XX:XX:XX:XX:XX:XX", "IPv4Address": "XXX.XX.X.X/XX", "IPv6Address": "" }, "98d02XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": { "Name": "app_1", "EndpointID": "e0085XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "MacAddress": "XX:XX:XX:XX:XX:XX", "IPv4Address": "XXX.XX.X.X/XX", "IPv6Address": "" } }, "Options": {}, "Labels": {} }
先ほどnetworksを記述したコンテナがnetwork内に含まれています。
早速サービス側のDBに接続してみましょう
//appコンテナに入る hi-ko@hogeHi-ko hogeApp % docker-compose exec app bash //postgresSQLに接続 root@7376534c05ad:/admin-hoge# rails dbconsole /usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/type.rb:27: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call /usr/local/bundle/gems/activerecord-6.0.2.1/lib/active_record/type/adapter_specific_registry.rb:9: warning: The called method `add_modifier' is defined here /usr/local/bundle/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call /usr/local/bundle/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here Password for user hoge: psql (11.5 (Debian 11.5-1+deb10u1), server 9.6.1) Type "help" for help. development=# //テーブル一覧を確認 development=# \dt; List of relations Schema | Name | Type | Owner --------+---------------------------------+-------+------------ public | admin_comments | table | hoge public | users | table | hoge ・ ・ ・
接続できました!!
続いて、modelファイルをどう扱っていくかについては、次回説明していきたいと思います。
以上、最後まで読んでいただきありがとうございました!
Great content! Super high-quality! Keep it up! 🙂
Thanks for your comment !! I’ll try my best!!