【问题标题】:Docker container bash can't connect to local MySQL server through socketDocker 容器 bash 无法通过套接字连接到本地 MySQL 服务器
【发布时间】:2016-08-24 20:44:45
【问题描述】:

标题很长,但应该足够明确。

如果我使用 bash 运行 docker 容器并通过 apt-get install mysql-server 安装 mysql,则运行以下命令:mysql -u root -p

我遇到了一个响亮的:

ERROR 2002 (HY000): 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock' (2)

几乎所有安装和使用网络的东西都是如此。

这是否意味着我应该EXPOSE 端口3306?如果主机(容器外)正在使用该端口,但容器内的所有应用程序都希望调用该端口怎么办?即:当我在暴露12345:3306 的同时运行容器时,使用lo 接口的应用程序是否应该使用端口330612345

我觉得这部分很混乱。 谢谢!

【问题讨论】:

  • 这似乎是对 Unix 套接字的抱怨,而不是网络套接字。 (顺便提一下,install 不会启动服务。)
  • Bingo 似乎是 mysql 的 pb。我将仔细检查它是否解决了我遇到的其他一些问题。
  • 但是出于好奇:为什么要在运行时而不是构建时安装 mysql?
  • 它是一个非常长且复杂的交互式安装脚本的一部分。我计划正确地做事,但与此同时我正在手动安装 docker 容器。
  • @OliverCharlesworth 我已经编辑了这个问题,以更好地反映我遇到的真正问题。如果你想提供答案,我会选择它。你是对的。由于某种原因,本地虚拟机在安装服务后会自动启动服务,但 docker 映像没有。

标签: mysql docker docker-container


【解决方案1】:

MySQL Docker 容器未使用 /var/run 锁。相反,请尝试通过显式指定其 IP 地址来直接寻址容器。

首先获取容器的 IP 地址。像这样的:

export MYSQL_IP_ADDRESS=$(sudo docker inspect --format="{{ .NetworkSettings.IPAddress }}" mysql_db)

其中 'mysql_db' 是您为 MySQL Docker 容器指定的名称。

您应该能够“回显”您的 IP 地址:

corba@bilbovm01:~$ echo $MYSQL_IP_ADDRESS 
172.17.121.2

然后在命令行中指定该主机名:

mysql -h $MYSQL_IP_ADDRESS -u root -p

为了回答您关于端口可见性的其他问题,我假设您使用的是来自 hub.docker.com 的标准 mysql/mysql-server 映像。该图像会自动公开 3306,但您必须使用 MYSQL_ROOT_HOST 启动它,以便它允许您从主机 IP 连接到它。例如,我的主机 IP 地址是 172.17.121.1。所以我会这样启动我的容器:

corba@bilbovm01:~$ sudo docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=blat -e MYSQL_ROOT_HOST=172.17.121.1 mysql/mysql-server:latest 
aa09bc5a30b8f84b68d760d828f8e451238405a177caef4ad802bef44ad43352
corba@bilbovm01:~$ mysql -h $MYSQL_IP_ADDRESS -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.17 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> 

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 2020-11-14
    • 2017-10-07
    • 2018-08-07
    • 2020-02-29
    • 2011-01-12
    • 2017-01-21
    • 2013-03-04
    相关资源
    最近更新 更多