Docker容器bash can';t通过套接字连接到本地MySQL服务器

Docker容器bash can';t通过套接字连接到本地MySQL服务器,mysql,docker,docker-container,Mysql,Docker,Docker Container,这是一个很长的标题,但应该足够明确 如果我使用bash运行docker容器并通过apt get install mysql server安装mysql,请运行以下命令:mysql-u root-p 我遇到了一个响亮的: 错误2002(HY000):无法通过套接字连接到本地MySQL服务器 “/var/run/mysqld/mysqld.sock”(2) 几乎所有安装和使用网络的设备都是如此 这是否意味着我应该公开端口3306?如果主机(容器外部)正在使用该端口,但容器内的所有应用程序都希望调用该

这是一个很长的标题,但应该足够明确

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

我遇到了一个响亮的:

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

几乎所有安装和使用网络的设备都是如此

这是否意味着我应该
公开
端口
3306
?如果主机(容器外部)正在使用该端口,但容器内的所有应用程序都希望调用该端口,该怎么办?i、 e:当我在公开
12345:3306
时运行容器时,使用
lo
界面的应用程序是否会使用端口
3306
12345

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

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

首先获取容器的IP地址。大概是这样的:

export MYSQL_IP_ADDRESS=$(sudo docker inspect --format="{{ .NetworkSettings.IPAddress }}" mysql_db)
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> 
其中'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服务器映像。该映像自动公开3306,但您必须使用MYSQL\u ROOT\u主机启动它,以便它允许您从主机IP连接到它。例如,我的主机IP地址是172.17.121.1。所以我会这样启动我的容器:

export MYSQL_IP_ADDRESS=$(sudo docker inspect --format="{{ .NetworkSettings.IPAddress }}" mysql_db)
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> 

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