简而言之
我想在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
中看到:
服务器主机名(bind-address):'0.0.0.0';端口:3306 - '0.0.0.0'解析为'0.0.0.0'; 服务器套接字在IP上创建:'0.0.0.0'。
docker run
命令运行它时,请确保打开端口,例如,docker run -p 3306:3306 ...
否则您将无法连接。当然,这也可以在Dockerfile中完成,但您不需要自定义Docker镜像来完成此操作! - Brad Parks-p
。为了避免这种情况,--no-defaults
对我有用。完整命令为mysql --no-defaults --protocol=tcp -uroot -p
。 - Dario Seidl