web-dev-qa-db-ja.com

docker-compose mysqlコンテナーへの接続はアクセスを拒否しますが、同じイメージを実行するdockerは拒否しません

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ユーザーのアクセス許可の問題ではありません。

これを解決する方法はありますか?

39
Davy Kavanagh

配列定義を使用する場合、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"
30
Wallace

公式の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@'%'などのことや、ポートが正しく転送されているかどうかを確認できます。これがお役に立てば幸いです。

16
threeve

私は同様の問題を抱えていましたが、これは私を助けました:

https://github.com/docker-library/mysql/issues/51#issuecomment-76989402

コンテナを最初に実行してからパスワードを変更しましたか? docker-composeは、実行間でボリュームを保持するために追加の作業を行います(したがってデータベースを保持します)。 docker-compose rm -vを試してすべてを削除し、もう一度起動してみてください。

11
gvlasov

同じエラー「ユーザー '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

作業

1
gyr9i

問題が解決したようです。私はこれに似た問題を議論すると思った。

Synology NAS(DSM 6.0.2)でdocker-composeを使用してTomcat(web)とmysql(db)を実行しています。私が持っているUbuntuボックスではうまく機能しましたが、NASではうまくいきませんでした。

問題はNASのファイアウォールでした-ファイアウォールルールを変更して、特定のポートを開いて、最後にすべて拒否するようにしました。許可されたポートに:3306を追加すると、機能しました!

これは良い解決策ではなく、docker-composeがBRIDGEネットワークで実行されているため、DSMでこれが必要な理由はわかりません。これについてサポートチケットを入れました。

この回答は、他の人がこのブロックされたコンテナの問題に役立つ可能性があります。

0
HankCa