简单地说

我想在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可能感觉很奇怪。诚然,也许有更清洁的方法。但是当我附加我的图像时,我可以观察到它实际上按预期工作(即:删除绑定地址)。我可以在容器/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'上创建的服务器套接字。


简单的方法是将mysql unix套接字共享给主机。然后通过插座连接

步骤:

为主机创建共享文件夹,例如:mkdir /host 运行docker container with volume mount option docker Run -it -v /host:/shared <mysql image>。 然后修改mysql的配置文件/etc/my.cnf,修改文件中的socket条目为socket=/shared/mysql.sock 在docker中重启MySQL服务 最后从主机通过套接字MySQL -u root——socket=/host/ MySQL .sock连接到MySQL服务器。如果密码使用-p选项


如果你的Docker MySQL主机运行正常,你可以从本地机器连接到它,但你应该这样指定主机,端口和协议:

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

将3306更改为您从Docker容器转发的端口号(在您的示例中,它将是12345)。

因为你是在Docker容器内运行MySQL, socket是不可用的,你需要通过TCP连接。在mysql命令中设置“——protocol”将改变这一点。


如果你在docker-machine下运行docker ?

执行获取ip:

docker-machine ip <machine>

返回机器的IP并尝试连接mysql:

mysql -h<docker-machine-ip>

将“localhost”更改为您的真实con IP地址 因为它指向mysql_connect()


如果你使用“127.0.0.1”而不是localhost, mysql将使用tcp方法,你应该能够连接容器:

mysql -h 127.0.0.1 -P 3306 -u root

我建议你看看docker-compose。这是如何工作的:

创建名为docker-compose的文件。Yml是这样的:

version: '2'

services:

  mysql:
    image: mariadb:10.1.19
    ports:
      - 8083:3306
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wp

接下来,运行:

$ docker-compose up

注:

有关最新的mariadb图像标签,请参阅https://hub.docker.com/_/mariadb/

现在,你可以这样访问mysql控制台:

$ mysql -P 8083——protocol=tcp -u root -P

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.5.5-10.1.19-MariaDB-1~jessie mariadb.org binary distribution

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>

注:

您可以传递-d标志以分离/后台模式运行mysql/mariadb容器。 密码是“wp”,在docker-compose中定义。yml文件。 与maniekq相同的建议,但docker-compose的完整示例。


我通过在我的服务器上运行一个临时的docker容器来做到这一点,这样我就不必担心主机上安装了什么。首先,我定义了我需要什么(你应该根据自己的目的进行修改):

export MYSQL_SERVER_CONTAINER=mysql-db
export MYSQL_ROOT_PASSWORD=pswd 
export DB_DOCKER_NETWORK=db-net
export MYSQL_PORT=6604

我总是创建一个新的docker网络,其他容器将需要:

docker network create --driver bridge $DB_DOCKER_NETWORK

启动mySQL数据库服务器:

docker run --detach --name=$MYSQL_SERVER_CONTAINER --net=$DB_DOCKER_NETWORK --env="MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" -p ${MYSQL_PORT}:3306 mysql

获取新服务器容器的IP地址

export DBIP="$(docker inspect ${MYSQL_SERVER_CONTAINER} | grep -i 'ipaddress' | grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])')"

打开服务器的命令行接口:

docker run -it -v ${HOST_DATA}:/data --net=$DB_DOCKER_NETWORK --link ${MYSQL_SERVER_CONTAINER}:mysql --rm mysql sh -c "exec mysql -h${DBIP} -uroot -p"

当您退出mySQL界面时,最后一个容器将自行删除,而服务器将继续运行。您还可以在服务器和主机之间共享卷,以便更容易地导入数据或脚本。希望这能有所帮助!


为了进行转换,你可以在host中创建~/.my.cnf文件:

[Mysql]
user=root
password=yourpass
host=127.0.0.1
port=3306

然后下次运行mysql客户端打开连接。


mysql -u root -P 4406 -h localhost --protocol=tcp -p

请记住更改用户、端口和主机,以便与您的配置相匹配。如果您的数据库用户配置了密码,则需要使用-p标志


执行以下命令运行container

docker run --name db_name -e MYSQL_ROOT_PASSWORD=PASS--publish 8306:3306 db_name

运行此命令获取主机中的mysql数据库

mysql -h 127.0.0.1 -P 8306 -uroot  -pPASS

对你来说就是这样

mysql -h 127.0.0.1 -P 12345 -uroot  -pPASS

docker运行-e MYSQL_ROOT_PASSWORD=pass——name sql-db -p 3306:3306 mysql Docker exec -it sql-db bash Mysql -u root -p


我能够连接mysql服务器5.7运行在我的主机使用下面的命令:

mysql -h 10.10.1.7 -P 3307 --protocol=tcp -u root -p  

这里的IP是我的主机IP和3307是在mysql docker转发的端口。输入命令后输入mysql的密码。就是这样。现在你已经从你的主机连接了mysql docker容器。


在终端运行docker exec -it container_name /bin/bash 然后:mysql


好的。我终于解决了这个问题。以下是我在https://sqlflow.org/sqlflow中使用的解决方案。

完整的解决方案

为了使演示独立,我将所有必要的代码移到了https://github.com/wangkuiyi/mysql-server-in-docker。

解决方案的关键

我没有使用DockerHub.com https://hub.docker.com/r/mysql/mysql-server上的官方图片。相反,我自己在Ubuntu 18.04上安装了MySQL。这种方法让我有机会启动mysqld并将其绑定到0.0.0.0(所有ip)。

有关详细信息,请参阅我的GitHub回购中的这些行。

SQLFLOW_MYSQL_HOST=${SQLFLOW_MYSQL_HOST:-0.0.0.0}

echo "Start mysqld ..."
sed -i "s/.*bind-address.*/bind-address = ${SQLFLOW_MYSQL_HOST}/" \
    /etc/mysql/mysql.conf.d/mysqld.cnf
service mysql start

验证我的解决方案

Git clone the aforementioned repo. git clone https://github.com/wangkuiyi/mysql-server-in-docker cd mysql-server-in-docker Build the MySQL server Docker image docker build -t mysql:yi . Start MySQL server in a container docker run --rm -d -p 23306:3306 mysql:yi Install the MySQL client on the host, if not yet. I am running Ubuntu 18.04 on the host (my workstation), so I use apt-get. sudo apt-get install -y mysql-client Connect from the host to the MySQL server running in the container. mysql --host 127.0.0.1 --port 23306 --user root -proot

从同一主机上的另一个容器连接

我们甚至可以从另一个容器(在同一主机上)运行MySQL客户端。

docker run --rm -it --net=host mysql/mysql-server mysql \
   -h 127.0.0.1 -P 13306 -u root -proot

从其他主机连接

在我的iMac上,我使用Homebrew安装MySQL客户端。

brew install mysql-client
export PATH="/usr/local/opt/mysql-client/bin:$PATH"

然后,我可以访问上面的Ubuntu主机(192.168.1.22)。

mysql -h 192.168.1.22 -P 13306 -u root -proot

从运行在其他主机上的容器连接

我甚至可以在iMac上的容器中运行MySQL客户端,以连接到我的Ubuntu工作站上的容器中的MySQL服务器。

docker run --rm -it --net=host mysql/mysql-server mysql \
    -h 192.168.1.22 -P 13306 -u root -proot

特例

在这种情况下,我们在运行在同一主机上的独立容器中运行MySQL客户端和服务器——这可能发生在我们设置CI时,我们不需要构建我们自己的MySQL服务器Docker镜像。相反,我们可以在运行客户端容器时使用——net=container:mysql_server_container_name。

启动服务器

docker run --rm -d --name mysql mysql/mysql-server

启动客户端

docker run --rm -it --net=container:mysql mysql/mysql-server mysql \
 -h 127.0.0.1 -P 3306 -u root -proot

你应该检查分配给运行容器的IP地址,然后连接到该主机:

docker inspect -f '{{range . networksettings . networks}}{{。IPAddress}}{{end}} ` <容器名称或id>

比你能联系到的:

mysql -h < inspect命令提供的IP > -P <port> -u <user> -P <db name> . mysql

https://mariadb.com/kb/en/installing-and-using-mariadb-via-docker/#connecting-to-mariadb-from-outside-the-container


根据图片,进入docker桌面应用中的project -> MySQL -> inspect选项卡,修改数据库.env文件的信息。

.env文件示例:

DB_CONNECTION=mysql
DB_HOST=0.0.0.0:3306
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=sail
DB_PASSWORD=password


首先,查看日志是否有任何错误。

docker ps -a
docker logs container_name

如果有任何错误,搜索该特定错误的解决方案,如果没有错误,则可以进行下一步。

请记住,启动容器MySQL后需要几分钟才能启动,因此在3-4分钟后运行这些命令。

docker exec -it container_name bash
# ONCE YOU ARE INSIDE CONTAINER 
mysql -u root -p
SHOW DATABASES;
exit

从终端或命令提示符连接

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

如果这能帮到别人的话:

我的首选方案

添加~/.my.cnf的内容

[client]
user=<yourusername>
password=typethepasswordhere
host=127.0.0.1
port=3306

然后从终端运行>$ mysql,你应该在你的SQL cmd。

硬核替代品

你也可以这样连接

docker exec -it containername mysql  

进入sql cmd

or

docker exec -it contaiinername bash (or sh) 

在容器中连接,然后运行>$ mysql


我尝试过同样的事情,我也面临着同样的问题,但我注意到一件事,每当我试图用/bin/bash运行docker容器时,如下所示:

docker容器运行-it——name test_mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:最新/bin/bash

在点击上面的命令后,我的容器启动,但面临同样的错误“error 2002 (HY000):不能连接到本地MySQL服务器通过socket '/var/run/mysqld/mysqld。袜子”(2)

现在,我尝试用下面的命令代替上面的命令:

docker容器运行-itd——name test_mysql -e MYSQL_ROOT_PASSWORD=password -p 3306:3306 mysql:最新的

Docker容器exec test_mysql /bin/bash

然后使用命令

mysql -uroot -P3306 -p

希望这个想法对你有用。

谢谢 爱Arora