web-dev-qa-db-ja.com

ローカルでホストされたMySQLデータベースをdockerコンテナーに接続する方法

docker-compose.ymlを介して、アプリケーションを実行できます。ここで、アプリケーションを実稼働環境に移動しますが、コンテナデータベースは使用しません。 docker-composeを使用してローカルのMySQLデータベースをアプリケーションに接続する方法はありますか?

私のdocker-compose.ymlは次のようになります。

version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
      - 8080:8080
    links:
      - app-db

  app-db:
    build:
      context: .
      dockerfile: app-db/Dockerfile

    environment:
    - MYSQL_ROOT_PASSWORD=password
    - MYSQL_DATABASE=Optimize
    ports:
      - 3306:3306

app-db部分の代わりに、ローカルにホストされているmysqlデータベースに接続したいだけです。

11
Ben.Bean

DockerネットワークでホストマシンのIPを見つけます。 docker-compose.yml version: "3"を使用する場合、おそらくそのIPは172.18.0.1ですが、確認するためにコンテナ(ホスト)の「ゲートウェイ」:

docker inspect <container-id-or-name> | grep Gateway
"Gateway": "",
            "IPv6Gateway": "",
            "Gateway": "172.18.0.1",
            "IPv6Gateway": "",

Dockerアプリケーション内で、MySQLを次のようにポイントします:172.18.0.1:3306(おそらく構成ファイル内)。 Dockerネットワークがまだ同じである限り、そのIPが固定されていることを考慮してください(ネットワークはdocker-composeによって作成され、docker-compose downを実行しない限り削除されません)

また、MySQLがすべてのインターフェイスをリッスンしていることを確認してください。 my.cnfbind-addressである0.0.0.0を検索します(サーバーにパブリックIPがある場合はセキュリティ上の問題を考慮してください)。


代替手段として、ローカルホストを共有するために、ホストと同じネットワークをコンテナに持ち込むことができます。これにより、コンテナはそこでmysqlを見つけます。ネットワークモードを「ホスト」として使用します。

version: '3'
services:
  web-app:
    build:
      context: .
      dockerfile: web-app/Dockerfile
    ports:
       - 8080:8080
    network_mode: "Host"

次に、hibernate.propertiesでmysqlを次のようにポイントします:localhost:3306

26
Robert