从主机连接到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
笔记:
- 有关最新的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容器。
-
密码是在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()