複数のrailsアプリケーションでmodelの共有 Vol.1

キャベツ村代表エンジニアのひーこです。

複数のアプリケーションで開発を行なっていて、

例えば、サービス側と管理側でサーバーを分けたい、且つ、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ファイルをどう扱っていくかについては、次回説明していきたいと思います。

以上、最後まで読んでいただきありがとうございました!

 

label, ,

書いた人

2 Comments

  1. AffiliateLabz 2020年2月16日 Reply
    • hitomiAuthor 2020年2月20日 Reply

hitomi にコメントする コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です