web-dev-qa-db-ja.com

docker-composeを介して作成されたMySQLdockerコンテナに接続できません

Dockerを使い始めて、nginxコンテナー、PHP-FPMコンテナー、MySQLコンテナーを使用して単純なコンテナー環境を作成したいと思います。

NginxとPHP-FPMコンテナ間のリンクはうまく機能しますが、PHPアプリケーションサーバーをデータベースサーバーにリンクできないようです。

手動の端末作業を最小限に抑えるために、docker-composeを使用しています。私のdocker-compose.ymlは次のようになります:

web:
  image: tutorial/nginx
  ports:
    - "8080:80"
  volumes:
    - ./src:/var/www
    - ./src/vhost.conf:/etc/nginx/sites-enabled/vhost.conf
  links:
    - php
php:
  image: nmcteam/php56
  volumes:
    - ./src/php-fpm.conf:/etc/php5/fpm/php-fpm.conf
    - ./src:/var/www
  links:
    - db
db:
  image: sameersbn/mysql
  volumes:
   - /var/lib/mysql
  environment:
   - DB_NAME=demoDb
   - DB_USER=demoUser
   - DB_PASS=demoPass

次のステートメントを使用してDBに接続しようとしています。

$db = new \PDO('mysql:Host=db;dbname=demoName', 'demoUser', 'demoPass');

コンテナbashに接続してMySQLCLIを使用できるため、MySQLコンテナ自体は機能しています。

mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| demoDb             |
| mysql              |
| performance_schema |
+--------------------+

500エラーが発生し、これが機能しない理由を見つけることができません。私が見逃したかもしれないものの助けや提案はありがたいです。

7
Mr.Moe

これはDockerの問題ではなく、コードの問題です。

あなたが持っている:$db = new \PDO('mysql:Host=db;dbname=demoName', 'demoUser', 'demoPass');

次のようになります:$db = new \PDO('mysql:Host=db;port=3306;dbname=demoDb', 'demoUser', 'demoPass');

4
GHETTO.CHiLD

あなたが持っている場合 0.0.0.0 MySqlを使用してコンテナーのホストを作成し、外部のDocker(WorkBenchまたはSequelPro)からデータベースに接続する場合は、DockerマシンのIPを使用するだけです。例:

user$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.0

次に、MySQLのホストは192.168.99.100適切なポート(例: 3306

1
R Picheta

これに従ってsameersbn/mysqlを公開するMySQLのベースイメージとしてEXPOSE 3306/tcpを使用しています dockerfile

コンテナのポート3306から3306を公開する必要があると思います。これを行うには、docker-compose.ymlファイルに以下を追加します。

db:
  image: sameersbn/mysql
  volumes:
   - /var/lib/mysql
  environment:
   - DB_NAME=demoDb
   - DB_USER=demoUser
   - DB_PASS=demoPass
  ports:
   - "3306:3306"

私は個人的に、使用している画像の代わりに元の MySQL 画像を使用します。

ただし、達成しようとしていることの完全な解決策として、(Nginx, PHP-FPM and MySQL)の使用を検討してください LaraDock このオープンソースプロジェクトはLaravel用に設計されていますが、簡単に変更できますそれをあなたのPHPコードで動作させるために。

0
Mahmoud Zalt