一言で言えば
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" を設定すると、これが変更されます。