ホストからDockerコンテナ内のmysqlに接続する 質問する

ホストからDockerコンテナ内のmysqlに接続する 質問する

一言で言えば

Docker コンテナで MySQL を実行し、ホストからそれに接続したいと考えています。これまでのところ、私が達成した最高のものは次のとおりです。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

詳細情報

私は以下を使用していますDockerfile:

FROM ubuntu:14.04.3
RUN apt-get update && apt-get install -y mysql-server

# Ensure we won't bind to localhost only
RUN grep -v bind-address /etc/mysql/my.cnf > temp.txt \
  && mv temp.txt /etc/mysql/my.cnf

# It doesn't seem needed since I'll use -p, but it can't hurt
EXPOSE 3306

CMD /etc/init.d/mysql start && tail -F /var/log/mysql.log

このファイルがあるディレクトリで、次のコマンドを使用してイメージを正常にビルドして実行できます。

> docker build -t my-image .
> docker run -d -p 12345:3306 my-image

画像を添付すると、問題なく動作するようです:

# from the host
> docker exec -it <my_image_name> bash

#inside of the container now
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
[...]

しかし、ホストからはそれほどの成功は得られていません。

> mysql -P 12345 -uroot
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

さらに詳しい情報

  • 次のような質問があるのを見ました私のに似ているしかし、それは同じではありません(そして、いずれにせよ答えはありません)
  • 画像があるのを見ましたMySQL専用、しかし、私は彼らとそれ以上の成功を収めることはなかった
  • 奇妙に感じるかもしれませんgrep -v。確かに、もっときれいな方法があるかもしれません。しかし、画像を添付すると、実際に期待どおりに動作していることがわかります (つまり、 が削除されていますbind-address)。そして、コンテナーで次のことがわかります/var/log/mysql/error.log

サーバー ホスト名 (バインド アドレス): '0.0.0.0'、ポート: 3306 - '0.0.0.0' は '0.0.0.0' に解決されます。サーバー ソケットは IP: '0.0.0.0' に作成されました。

ベストアンサー1

Docker MySQL ホストが正しく実行されている場合は、ローカル マシンから接続できますが、次のようにホスト、ポート、プロトコルを指定する必要があります。

mysql -h localhost -P 3306 --protocol=tcp -u root

3306 を Docker コンテナから転送したポート番号に変更します (この場合は 12345 になります)。

Docker コンテナ内で MySQL を実行しているため、ソケットは利用できず、TCP 経由で接続する必要があります。mysql コマンドで "--protocol" を設定すると、これが変更されます。

おすすめ記事