LoginSignup
nxg_stepup
@nxg_stepup

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Unity postgresqlでデータを取得したい

解決したいこと

Unityで実装したAndroid用アプリで、Dockerを用いた仮想コンテナにあるPostgreSQLのデータベースからデータを取得したいが、エラーが発生します。
分かる方がいましたら教えてください。

発生している問題・エラー

下の画像は実機で実行した際のエラー文
Screenshot_20221021-171902-1.png

該当するソースコード
void Start()
    {
        //実行環境
        string connectionString =
          //コンテナに接続後[hostname -i]で確認したiPアドレス
          "Server=****;" +
          "Port=5432;" +
          "Database=postgres;" +    
          "User ID=****;" +     
          //[-e POSTGRES_PASSWORD=]で設定したパスワード
          "Password=****;";     
        
        try
        {
            var dbcon = new NpgsqlConnection(connectionString);
            dbcon.Open();
            
            NpgsqlCommand dbcmd = dbcon.CreateCommand();
            
            // SELECT文
            string sql =
          "SELECT *" +
          "FROM test";    //test テーブル
            dbcmd.CommandText = sql;

            NpgsqlDataReader reader = dbcmd.ExecuteReader();
            while (reader.Read())
            {
                // testテーブルにあるカラム名「name」のデータ取得
                string Name = (string)reader["name"];
                
                //デバック
                text.SetText(Name);
            }
            
            // clean up
            reader.Close();
            reader = null;
            dbcmd.Dispose();
            dbcmd = null;
            dbcon.Close();
        }
        catch (System.Exception e)
        {
            text.SetText(e.ToString());
        }
    }

自分で試したこと

・postgres.confでlisten_addresses = '*'の確認とportの部分のコメントアウトを
 外した

・pg_hba.confで外部接続用のmethodをmd5に変更

・もう一つ別のコンテナにログインして
 psql -U [ロール名] -h [接続先iPアドレス] -p 5432 -d postgresでの
 外部からのデータベース接続ができることを確認済み
(22/10/24 追記: 172.から始まるipアドレスのため外部からの接続ではなかった?)

追記(22/10/24)

自身がネットワーク関連があまり得意な方ではないため
そもそもdockerでの環境構築がしっかりできていない可能性がある

何が間違っていて、何が足りないのかわからないため、今回行った環境構築の手順を以下に示します。

実行環境

パソコン:dockerでpostgesqlのデータベースを用意
スマホ :Unityで実装したアプリでそのデータベースからデータを取得
Wi-Fi :同じところに接続

dockerでの環境構築の手順

1.docker network create --driver bridge --subnet 192.[A].[B].0/24
--gateway 192.[A].[B].1 bridge2

2.docker run -d --net=bridge2 --ip=192.[A].[B].10 --name db3 -p 5432:5432
-p POSTGRES_PASSWORD=**** postgres

3.postgres.confでlisten_addresses = '*'の確認とportの部分のコメントアウトを外
した

4.pg_hba.confで全てのmethodの部分をmd5に変更

5.postgresqlでテスト用にテーブルを作り、適当にデータを作成

6.コンテナを一度停止させ、再度起動した
※[A]、[B]はそれぞれ同じ数値が入る

この記事を投稿した時(22/10/21)は手順1はやっていなかったので
改めて上記の手順で試したが、エラーは変わらなかった。

DBeaverでlocalhost(あるいは127.0.0.1) port:5432でやったら接続できたが、
192.[A].[B].10 port:5432だと接続できなかった。

最後に

少しでも気になることがあれば教えてください。
お願いします。

1

1Answer

恐らくパソコン側のポートをネットワークに公開できていないのが原因かと思われます。

Dockerに関わらず、コンピューターで実行したプログラムのポートは通常そのコンピューター内でしかアクセスできません。例えばカフェの無料Wi-Fiの使用時に、知らない人からパソコンで実行しているプログラムにアクセスされたら困りますよね。ほとんどのコンピューターではデフォルトでそれができないようになっています。

パソコン側のポートをネットワークに公開するためには、ファイアウォール自体を一時的に無効にするか、ファイアウォールの設定を変更して5432のポートをネットワークに解放する必要があります。
その上で、パソコン外の端末からそのパソコンのIP:portへアクセスする必要があります。

localhost(あるいは127.0.0.1) port:5432でやったら接続できた

とのことなので、恐らくDocker側の設定は上手くいっていると思います。少なくともdocker run-p 5432:5432でコンテナとホストのポートが上手く繋げられているということですね。

ちなみにlocalhost:5432127.0.0.1:5432などのようにループバックアドレスでアクセスできるのは、そのポートを立てているコンピューター自身からのみです。
今回はスマホからアクセスすることになるので、例えば192.168.~.~:5432のようなプライベートIPからパソコンにアクセスする必要があります。

0

Comments

  1. @nxg_stepup

    Questioner
    ご指摘していただいた通り、ファイアウォールの設定を変更し、パソコンのIPでのアクセスで無事に接続することができました。
    ご丁寧にご説明いただきありがとうございました。

Your answer might help someone💌