外部からdockerコンテナー内のPostgresqlに接続する


197

Dockerコンテナー内のサーバーにPostgresqlがあります。外部、つまりローカルコンピューターから接続するにはどうすればよいですか?それを許可するには、どの設定を適用すればよいですか?


1
postresqlを開始するためにどのコマンドを使用しましたか?ポートを公開してマッピングすることができます
lvthillo

回答:


313

次のようにPostgresを実行できます(ポートをマップします)。

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

これで、コンテナーのポート5432をサーバーのポート5432にマップしました。-p <host_port>:<container_port> 。だから今あなたのpostgresはあなたからアクセス可能ですpublic-server-ip:5432

テストするには:postgresデータベースを実行します(上記のコマンド)

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

コンテナーの内部に移動して、データベースを作成します。

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

ローカルホストに移動します(ツールまたはPSQLクライアントがある場合)。

psql -h public-ip-server -p 5432 -U postgres

(パスワードmysecretpassword)

postgres=# \l

                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

したがって、ローカルホストからデータベース(サーバーのdockerで実行されています)にアクセスしています。

、この記事では詳細にexpainedています。


1
@Tjorriemorrieあなたのpostgresがあなたのローカルマシンで実行されていることを確信していますか?たぶん、localhostの代わりに127.0.0.1を試してみてください。
lvthillo 2017

2
パブリックIPアドレス(osx)を取得する:ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

4
さまざまなpostgres / docker関連の投稿の中で、これが最も便利なものの1つであることがわかりました。ありがとうございました。
rg88

1
:あなたがポートをマッピングしたいが、まだあなたがこのようなホストネットワーク上のコンテナを展開する必要がありますあなたのホストからPostgresのコンテナにアクセスさせたくない場合は@GarouDandocker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
終了するpsqlは\ qで動作します(ちょうど私のような初心者のために)
Dirk Schumacher

39

なんとかLinuxで実行できました

  1. docker postgresを実行します。ポートが公開されていることを確認してください。軽量であるため、私はalpineを使用しています。

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  2. 別の端末を使用し、postgres uriを使用してホストからデータベースにアクセスします

    psql postgresql://postgres:1234@localhost:5432/postgres

Macユーザーの場合、psqlをpgcliに置き換えます


7
誰かがコンテナに飛び込むことなく接続する方法に答えたことをうれしく思います。thnx。
PabTorre 2018

1
sudoコンテナーの実行に使用すべきではありません。
ラスベイトマン

29

次の方法でdocker execコマンドを使用してアクセスすることもできます。

$ docker exec -it postgres-container bash

# su postgres

$ psql

または

$ docker exec -it postgres-container psql -U postgres

3
psql -U postgres
Maryna Krasnova

それは驚くほど便利なコメントです
Dan Rosenstark

何をしsu postgresますか?
ブレノ

14

私はすでにホストマシンでpostgresを実行していて、ネットワークからの接続を許可したくなかったので、コンテナーで一時的なpostgresインスタンスを実行し、データベースを2行で作成しました。

# Run PostgreSQL
docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres

# Create database
docker exec -it postgres-container createdb -U postgres my-db

単一のデフォルトデータベースを作成する場合は、次-e POSTGRES_DB=my-dbを追加することもできます
。postgresの

13

私はDockerコンテナーでpostgresでdjangoを使用しています。docker-composeファイルに以下を追加します。

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**

ローカルマシンからアクセス可能なポートを追加します。私自身、DBeaverを接続しました。これにより、アプリリクエストとローカルマシンリクエストの間のポートの競合が防止されます。最初に、ポート5432が使用されている(djangoアプリによる)というメッセージが表示されたため、pgAdminまたはDBeaverからアクセスできませんでした。


1
これが最も役に立ちました。docker-composeを使用する人にとって、これは最善の方法のようです。
David Frick

デービッド、コーディングをありがとう!
omeraiman

9

localhostから接続するには、「-net host」を追加する必要があります。

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

次のコマンドを使用すると、ローカルホストからexecを使用せずにサーバーに直接アクセスできます。

psql -h localhost -p 5432 -U postgres

6

localhost(mac)からpostgresコンテナーに接続しようとしました。docker-composeファイルのポートを5432から3306に変更し、コンテナーを起動しました。なぜ私がそれをしたのか分かりません:|

その後、PSequelと管理者を介してpostgresに接続しようとしましたが、接続を確立できませんでした。

ポート5432に切り替えた後、すべて正常に動作します。

  db:
    image: postgres
    ports:
      - 5432:5432
    restart: always
    volumes:
      - "db_sql:/var/lib/mysql"
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: password
      POSTGRES_DB: postgres_db

これは私が共有したかった私の経験でした。おそらく誰かがそれを利用することができます。


3
ボリュームパス:/var/lib/mysql
David Tabernero M.

5432はPostgresのデフォルトのポートです。3306はMySQLのデフォルトのポートです。docker-composeで公開ポートを変更すると、接続に使用しようとするクライアントツールも、別のポートを使用するように指示しない限り、デフォルトでポート5432に接続しようとします。
ダボス

6

私はあなたのコンテナの中に存在するデータを表示できるようにすることを仮定してい毎回あなたが外からそれに接続します。これを行うには、postgresイメージのデータを永続化する必要があります。

永続的なデータがない場合は、最初に行ったすべてを繰り返す必要があります。
ステップ3、5、6、7、および8は、質問に直接回答します。

以下は、Windows 10 powershellで実行したプロセス全体の詳細な概要です(コマンドはLinuxとmacOSでも同じです)。

手順1:管理者以外のモードでPowerShellを起動する

ステップ2:postgres dockerイメージをダウンロードします。
docker pull postgres:latest

手順3:切り離しモードでDockerコンテナーを起動し、ボリュームを作成して宛先にバインドすることでpostgresイメージにデータを保持します
:デフォルトでは5432が使用されるデフォルトのポートですが、クライアントからの接続エラーを防ぐために明示的に指定してくださいpgadmin、dbeaverなど)
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

ステップ4:実行中のコンテナのステータスを確認する
docker ps -a

ステップ5:インタラクティブモードでcontainer_nameの内部に移動します
:ls、pwdなどのコマンドは、インストール中にLinuxコンテナーをチェックした場合、ここで実行できます)
docker exec -it postgres-test psql -U postgres

ステップ6:サンプルデータを作成します。この時点psqlで、次の方法でコマンドを操作できます。

# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
# \q

ステップ7pgadminまたはのようなデータベースクライアントアプリケーションを開きdbeaver、接続フィールドに以下を入力します。

Host: localhost
Database: test
User: postgres
Password: password

手順8select * from test_tableクエリエディターにクエリを入力すると、出力が表示されます。123


5

何らかの理由で5432ポートが保護されているようです。私はから私のポートの設定を変更5432:5432する5416:5432と、次のコマンドを実行すると、して働いていたそのドッキングウィンドウコンテナの外からあなたのpostgresデータベースに接続します

psql -h localhost -p 5416 -U <my-user> -d <my-database>

うまくいきましたが、インターネットでの説明は見つかりませんでした。見つけましたか?
negas

2
@negasおそらくすでにpostgreslocalhost:5432にバインドするホストマシンでサービスを実行しているため、使用できません。別のホストポートをコンテナ内のデフォルトポート5432にマッピングすることは、そのための良いソリューションです。または、ホストでpostgresサービスを停止することもできますが、必要なものに使用されている可能性があります。
ダボス

5

最初にpostgresのDockerイメージを開きます

docker exec -it <container_name>

次に、ルートを取得root@868594e88b53:/# します- データベース接続が必要です

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

1

場合、それはdjangoバックエンドアプリケーションです、あなたはこのようなことをすることができます。

docker exec -it container_id python manage.py dbshell

1

ここで良い答えがありますが、postgresデータベース管理用のインターフェースが必要な場合は、pgAdminをローカルコンピューターにインストールし、そのIPとpostgres公開ポート(デフォルトでは5432)を使用してリモートマシンに接続できます。



-1

@Martinのようにdocker-composeを使用した場合、これは遅いことを知っています

これらは、コンテナー内のpsqlに接続するのに役立つスニペットです

docker-compose run db bash

root@de96f9358b70:/# psql -h db -U root -d postgres_db

50の評判がないのでコメントできません。これがお役に立てば幸いです。


Opは外部から接続したい。
avizzzy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.