从主机

时间:2015-10-07 20:21:44

标签: mysql docker

(这可能是一个愚蠢的问题,因为我对Docker或mysql管理的知识有限,但因为我在这个问题上度过了整整一个晚上,我敢问它。)

简而言之

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

更多细节

  • 我看到有一个问题looks like mine。但是,它实际上并不相同(并且它无论如何都没有任何答案)
    • 我看到有图片dedicated to mysql,但我没有取得更多成功
    • 我的grep -v可能会觉得很奇怪。无可否认,可能有更清洁的方法。但当我附加到我的图像时,我可以观察它实际上按预期工作(即:删除了bind-address)。我可以在容器/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'。

14 个答案:

答案 0 :(得分:96)

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

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

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

因为您在Docker容器中运行MySQL,所以套接字不可用,您需要通过TCP连接。在mysql命令中设置“--protocol”将改变它。

答案 1 :(得分:31)

如果您使用&#34; 127.0.0.1&#34;而不是localhost mysql将使用tcp方法,你应该能够连接容器:

mysql -h 127.0.0.1 -P 3306 -u root

答案 2 :(得分:17)

我建议查看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

注意:

现在,您可以访问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的完整示例。

答案 3 :(得分:12)

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

步骤:

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

答案 4 :(得分:6)

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

执行以获取IP:

docker-machine ip <machine>

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

mysql -h<docker-machine-ip>

答案 5 :(得分:4)

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

答案 6 :(得分:4)

好。我终于解决了这个问题。以下是我在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存储库中的these lines

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

要验证我的解决方案

  1. Git克隆上述仓库。
    git clone https://github.com/wangkuiyi/mysql-server-in-docker
    cd mysql-server-in-docker
    
  2. 构建MySQL服务器Docker映像
    docker build -t mysql:yi .
    
  3. 在容器中启动MySQL服务器
    docker run --rm -d -p 23306:3306 mysql:yi
    
  4. 在主机上安装MySQL客户端(如果尚未安装)。我在主机(我的工作站)上运行Ubuntu 18.04,所以我使用apt-get
    sudo apt-get install -y mysql-client
    
  5. 从主机连接到容器中运行的MySQL服务器。
    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

答案 7 :(得分:3)

我是通过在我的服务器上运行临时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界面时,最后一个容器将自行删除,而服务器将继续运行。您还可以在服务器和主机之间共享卷,以便更轻松地导入数据或脚本。希望这有帮助!

答案 8 :(得分:3)

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

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

答案 9 :(得分:1)

要进行转换,您可以在主机中创建~/.my.cnf文件:

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

然后下一次只需运行mysql来使mysql客户端打开连接。

答案 10 :(得分:0)

运行以下命令以运行容器

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

答案 11 :(得分:0)

  • docker run -e MYSQL_ROOT_PASSWORD = pass --name sql-db -p 3306:3306 mysql

  • docker exec -it sql-db bash

  • mysql -u root -p

答案 12 :(得分:0)

我能够使用以下命令连接在主机上运行的sql server5.7: mysql -h 10.10.1.7 -P 3307 --protocol = tcp -u root -p其中给定的ip是我的主机ip,3307是mysql docker中的端口。输入命令后,输入myql的密码。现在,您已经从主机上连接了mysql docker容器

答案 13 :(得分:-6)

将“localhost”更改为您真正的con ip addr
因为它是mysql_connect()