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エラーが発生し、これが機能しない理由を見つけることができません。私が見逃したかもしれないものの助けや提案はありがたいです。
これはDockerの問題ではなく、コードの問題です。
あなたが持っている:$db = new \PDO('mysql:Host=db;dbname=demoName', 'demoUser', 'demoPass');
次のようになります:$db = new \PDO('mysql:Host=db;port=3306;dbname=demoDb', 'demoUser', 'demoPass');
あなたが持っている場合 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
これに従って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コードで動作させるために。