简单地说
我想在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'上创建的服务器套接字。
我建议你看看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界面时,最后一个容器将自行删除,而服务器将继续运行。您还可以在服务器和主机之间共享卷,以便更容易地导入数据或脚本。希望这能有所帮助!
好的。我终于解决了这个问题。以下是我在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