从主机连接到docker容器中的mysql

(由于我在Docker或mysqlpipe理方面的知识有限,这可能是一个愚蠢的问题,但是因为我在这个问题上花了整整一个晚上,所以我敢问。)

简而言之

我想在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 

在有这个文件的目录中,我可以成功地构build图像并运行它

 > 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”parsing为“0.0.0.0”; 在IP上创build的服务器套接字:“0.0.0.0”。

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

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

将3306更改为您从Docker容器转发的端口号(在您的情况下,将为12345)。

因为你在Docker容器中运行MySQL,所以socket不可用,你需要通过TCP连接。 在mysql命令中设置“–protocol”会改变它。

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

 mysql -h 127.0.0.1 -P 3306 -u root 

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

脚步:

  • 为主机创build共享文件夹,例如: mkdir /host
  • 使用卷安装选项docker run -it -v /host:/shared <mysql image>容器docker run -it -v /host:/shared <mysql image>
  • 然后更改mysqlconfiguration文件/etc/my.cnf并将文件中的套接字条目更改为socket=/shared/mysql.sock
  • 在docker中重新启动MySQL服务service mysql restart
  • 最后通过套接字mysql -u root --socket=/host/mysql.sock从主机连接到MySQL服务器。 如果密码使用-p选项

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

执行获取IP:

 docker-machine ip <machine> 

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

 mysql -h<docker-machine-ip> 

我build议检查一下docker-compose。 这是如何工作的:

创build一个名为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

笔记:

现在,你可以这样访问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容器。

  • 密码是在docker-compose.yml文件中定义的“wp”。

  • 与maniekq相同的build议,但docker合成的完整例子。

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

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

我总是创build一个新的dockernetworking,任何其他容器将需要:

 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接口时,这个最后一个容器将自动移除,而服务器将继续运行。 您还可以在服务器和主机之间共享卷,以便更轻松地导入数据或脚本。 希望这可以帮助!

改变“本地主机”到您的真正的IP地址
因为这是mysql_connect()