Docker-composeで起動したmysql dockerコンテナーへの接続に問題があります。これは長い投稿です(ごめんなさい!)。
これが私のdocker-compose.ymlファイルです:
db:
image: mysql:5.7
ports:
- "3306:3306" # I have tried both ports and expose "3306". Still doesn't work
environment:
- MYSQL_ROOT_PASSWORD="secret"
- MYSQL_USER="Django"
- MYSQL_PASSWORD="secret"
- MYSQL_DATABASE="myAppDB"
次に:
$> docker-compose build
db uses an image, skipping #expected!
$> docker-compose up
<<LOTS OF OUTPUT>>
OK、だから今、私は、実行中のdocker container runner mysql:5.7を持っています。すばらしいです!またはそれは? Djangoアプリでテストすると、ユーザーがデータベースに接続できないことを示す操作エラーが表示されます。わかりましたので、多分それは私のDjangoですか?
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7216f99ca0f mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp sharpfin_db_1
$> docker-machine ip dev
192.168.99.100
$> mysql -h 192.168.99.100 -P 3306 -u Django -p
Enter password:
ERROR 1045 (28000): Access denied for user 'Django'@'192.168.99.1' (using password: YES)
わかりましたので、多分それはdocker-composeコンテナへの接続に関係していますか? Dockerコンテナ内から接続しようとした場合はどうなりますか?
$> docker exec -it c7216f99ca0f /bin/bash
root@c7216f99ca0f:/#
root@c7216f99ca0f:/# mysql -u Django -p
Enter password:
ERROR 1045 (28000): Access denied for user 'Django'@'localhost' (using password: YES)
わかりましたので、ドッカーmysqlは接続を許可しません。理由はわかりません。 docker-composeを使用せずにこれを実行するとどうなるかを見てみましょう。
$> docker run --name run-mysql -e MYSQL_ROOT_PASSWORD="secret" -e MYSQL_USER="Django" -e MYSQL_PASSWORD="secret" -e MYSQL_DATABASE="myAppDB" -p "3306:3306" mysql:5.7
<<LOTS OF OUTPUT SAME AS BEFORE>>
さて、これで同じ設定で以前と同じイメージを実行するコンテナができました。 (この主張はおそらく真実ではないと思います-docker-composeはdocker runとは異なることをしています)。
$> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
73071b929e82 mysql:5.7 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp run-mysql
コンテナー(run-mysqlと呼ばれます)があります。接続しましょう!
$> mysql -h 192.168.99.100 -P 3306 -u Django -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myAppDB |
+--------------------+
2 rows in set (0.01 sec)
mysql>
わかった。ログインできます。変です...コンテナ内からはどうですか?
$> docker exec -it 73071b929e82 /bin/bash
root@73071b929e82:/# mysql -u Django -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.12 MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| myAppDB |
+--------------------+
2 rows in set (0.00 sec)
mysql>
わかりました。dockerrunで起動するとコンテナーの外側と内側からログインできますが、docker-composeではログインできません。どうしたの?データベースの初期化方法を変更する、docker-composeがバックグラウンドで実行している何かが必要です。
Rootユーザーでも試してみると、上記はすべて同じです。したがって、Djangoユーザーのアクセス許可の問題ではありません。
これを解決する方法はありますか?
配列定義を使用する場合、docker-compose.yml
ファイルの環境変数に引用符を付けないでください。
db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_USER=Django
- MYSQL_PASSWORD=secret
- MYSQL_DATABASE=myAppDB
docker-compose.yml
ファイルでそれらを使用する場合:
db:
image: mysql:5.7
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD="secret"
- MYSQL_USER="Django"
- MYSQL_PASSWORD="secret"
- MYSQL_DATABASE="myAppDB"
そして実行:
$ docker-compose up -d
実行中のコンテナを入力します:
$ docker-compose exec db /bin/bash
出力が表示されます:
root@979813643b0c:/# echo $MYSQL_ROOT_PASSWORD
"secret"
公式のmysqlイメージをdocker-composeで使用していますが、問題はありません。作成ファイルの唯一の違いは、配列ではなく辞書を使用していることです。
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_USER: Django
MYSQL_PASSWORD: secret
MYSQL_DATABASE: myAppDB
構成ファイルのドキュメントがV1の一部の場所に残っていることに気付いたので、V2を使用している場合は、これを試すことができます。それ以外の場合は、デバッグのためにdocker-compose exec
を使用して、composeによって作成されたコンテナと直接対話できます。
docker-compose exec db /bin/bash
は、トラブルを引き起こしているコンテナ上のシェルを取得し、SHOW GRANTS FOR Django@'%'
などのことや、ポートが正しく転送されているかどうかを確認できます。これがお役に立てば幸いです。
私は同様の問題を抱えていましたが、これは私を助けました:
https://github.com/docker-library/mysql/issues/51#issuecomment-76989402
コンテナを最初に実行してからパスワードを変更しましたか? docker-composeは、実行間でボリュームを保持するために追加の作業を行います(したがってデータベースを保持します)。
docker-compose rm -v
を試してすべてを削除し、もう一度起動してみてください。
同じエラー「ユーザー 'admin'@'172.20.0.1'のアクセスが拒否されました(パスワード:YESを使用)」がありました。そして、長い間、それを解決する方法を理解できませんでした。私の状況では、doker-composeは.envファイルから構成を取得します。
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
最後に問題が見つかりました!問題はパラメーターの二重引用符にありました。
DB_PASSWORD="dbpassword"
効かない
DB_PASSWORD=dbpassword
作業
問題が解決したようです。私はこれに似た問題を議論すると思った。
Synology NAS(DSM 6.0.2)でdocker-composeを使用してTomcat(web)とmysql(db)を実行しています。私が持っているUbuntuボックスではうまく機能しましたが、NASではうまくいきませんでした。
問題はNASのファイアウォールでした-ファイアウォールルールを変更して、特定のポートを開いて、最後にすべて拒否するようにしました。許可されたポートに:3306を追加すると、機能しました!
これは良い解決策ではなく、docker-composeがBRIDGEネットワークで実行されているため、DSMでこれが必要な理由はわかりません。これについてサポートチケットを入れました。
この回答は、他の人がこのブロックされたコンテナの問題に役立つ可能性があります。