0

ホスト マシン (OSX Sierra) から Phinx を使用して移行を実行しようとしていますが、PDO 接続エラーが発生し続けます。これは単純な LAMP スタックであり、それ以外の場合は正常に機能しています。

これが私のdocker-composeです:

version: '2'
services:
  apache:
    build:
      context: ./docker/apache-php7
      dockerfile: Dockerfile
    volumes:
      - ./app:/var/www
    ports:
      - "80:80"
      - "443:443"
    networks:
     - localnet
    links:
    - mysql
  mysql:
    image: mysql:5.7
    ports:
     - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "root"
      MYSQL_USER: "root"
      MYSQL_PASSWORD: "root"
    volumes:
     - ./db/mysql:/var/lib/mysql
    networks:
     - localnet
networks:
  localnet:
    driver: "bridge"
volumes:
  mysqldata:
    driver: "local"
  redisdata:
    driver: "local"

私のフォルダ構造は次のとおりです。

/app
/db/mysql
/docker
docker-compose.yml

私のphinx.yml:

paths:
    migrations: %%PHINX_CONFIG_DIR%%
    seeds: %%PHINX_CONFIG_DIR%%

environments:
    default_migration_table: phinxlog
    default_database: docker
    production:
        adapter: mysql
        host: localhost
        name: %%PHINX_DBNAME%%
        user: %%PHINX_DBUSER%%
        pass: %%PHINX_DBPASS%%
        port: 3306
        charset: utf8

    development:
        adapter: mysql
        host: localhost
        name: %%PHINX_DBNAME%%
        user: %%PHINX_DBUSER%%
        pass: %%PHINX_DBPASS%%
        port: 3306
        charset: utf8

    docker:
        adapter: mysql
        host: mysql
        name: foo_db
        user: root
        pass: root
        port: 3306
        charset: utf8

ホスト マシンからコマンド (php ~/projects/project/app/vendor/bin/phinx migrate) を実行したときに得られる出力を次に示します。

using config file ./phinx.yml
using config parser yaml
using migration paths
 - /Users/foo/projects/project/app/migrations
using seed paths
 - /Users/foo/projects/project/app/migrations
warning no environment specified, defaulting to: docker
using adapter mysql
using database foo_db

[InvalidArgumentException]
  There was a problem connecting to the database: SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known

イメージの再構築を試み、他のイメージを試しましたが、うまくいかないようです。次の構成で SequelPro を使用して、ホスト マシンから Docker MySQL に接続できます。

 Host: 0.0.0.0
 Username: root
 Password: root
 Databse: 
 Port: 3306

ホスト マシンから MySQLコンテナーでこれらの Phinx 移行を実行するには、何を実行または修正する必要がありますか?

4

2 に答える 2

1

docker でネットワーク サービス検出機能を使用する必要があります。「mysql」というサービスがあるため、同じネットワーク上のすべてのコンテナーは、そのコンテナーが名前「mysql」で接続できることです。

0.0.0.0 は、接続できる実際の IP ではありません。docker psこれは、「すべてのインターフェース」を意味するエイリアスであるため、 の出力に表示されます。レポートを公開すると、docker はホストでリッスンを設定します。0.0.0.0 は任意のホスト インターフェイスを意味します。

各コンテナーは独自の localhost を取得するため、localhost を指定していても、データベースが別のコンテナーで実行されている場合、接続が拒否されます。

あるコンテナにこのようなデータベースがあり、別のコンテナから接続したい場合、ポート公開を使用する必要はまったくありません。ポート公開は、コンテナー以外または Docker ホストの外部からアクセスするサービス用です。つまり、レポート 3306 を mysql サービスの構成ファイルから削除でき、他のコンテナーは「mysql」ホスト名に接続することで接続できます。

名前検出サービスが機能するのは、各 docker コンテナー内で、docker が 127.0.0.11 で仮想 DNS サーバーを実行するためです。コンテナー名またはサービス名は、その dns サーバーで解決できます。

于 2017-06-19T17:24:29.050 に答える