Dockerコンテナー内のサーバーにPostgresqlがあります。外部、つまりローカルコンピューターから接続するにはどうすればよいですか?それを許可するには、どの設定を適用すればよいですか?
Dockerコンテナー内のサーバーにPostgresqlがあります。外部、つまりローカルコンピューターから接続するにはどうすればよいですか?それを許可するには、どの設定を適用すればよいですか?
回答:
次のように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ています。
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
なんとかLinuxで実行できました
docker postgresを実行します。ポートが公開されていることを確認してください。軽量であるため、私はalpineを使用しています。
sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
別の端末を使用し、postgres uriを使用してホストからデータベースにアクセスします
psql postgresql://postgres:1234@localhost:5432/postgres
Macユーザーの場合、psqlをpgcliに置き換えます
sudo
コンテナーの実行に使用すべきではありません。
次の方法でdocker execコマンドを使用してアクセスすることもできます。
$ docker exec -it postgres-container bash
# su postgres
$ psql
または
$ docker exec -it postgres-container psql -U postgres
su postgres
ますか?
私はすでにホストマシンで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
を追加することもできます
私は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からアクセスできませんでした。
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
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
これは私が共有したかった私の経験でした。おそらく誰かがそれを利用することができます。
/var/lib/mysql
?
私はあなたのコンテナの中に存在するデータを表示できるようにすることを仮定してい毎回あなたが外からそれに接続します。これを行うには、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
ステップ7:pgadmin
またはのようなデータベースクライアントアプリケーションを開きdbeaver
、接続フィールドに以下を入力します。
Host: localhost
Database: test
User: postgres
Password: password
手順8:select * from test_table
クエリエディターにクエリを入力すると、出力が表示されます。123
何らかの理由で5432ポートが保護されているようです。私はから私のポートの設定を変更5432:5432
する5416:5432
と、次のコマンドを実行すると、して働いていたそのドッキングウィンドウコンテナの外からあなたのpostgresデータベースに接続します:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
localhost:5432にバインドするホストマシンでサービスを実行しているため、使用できません。別のホストポートをコンテナ内のデフォルトポート5432にマッピングすることは、そのための良いソリューションです。または、ホストでpostgresサービスを停止することもできますが、必要なものに使用されている可能性があります。