如何将 mysql 工作台连接到在 docker 中运行 mysql?

Posted

技术标签:

【中文标题】如何将 mysql 工作台连接到在 docker 中运行 mysql?【英文标题】:How to connect mysql workbench to running mysql inside docker? 【发布时间】:2016-02-22 23:30:52 【问题描述】:

我在 docker 容器内使用 mysql 服务器,并且能够在 docker 内访问。如何在我的本地(主机)上运行的 mysql 工作台中创建连接。

【问题讨论】:

【参考方案1】:

我试图从Mysql Workbench 连接,但它不允许我。结果,我忘了提到port。以下是从工作台运行和连接的完整命令:

第 1 步 - 运行 docker 容器:

docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=testdb -e MYSQL_USER=admin -e MYSQL_PASSWORD=root -d mysql:8.0.20

上述命令说明:

Mysql v8.0.20

mysql:8.0.20

作为分离的容器运行(ctrl + c 不会停止容器)

-d

容器名称

--name mysql8

端口暴露

-p 3306:3306

设置环境变量

 -e MYSQL_ROOT_PASSWORD=root
 -e MYSQL_DATABASE=testdb
 -e MYSQL_USER=admin
 -e MYSQL_PASSWORD=root

您可以通过以下方式查看容器的实时日志:

docker logs mysql8 -f

第 2 步 - 从 Mysql Workbench 连接:

host: localhost
port: 3306
user: admin
password: root

【讨论】:

这个容器立即退出 @MurtazaHaji 也许端口不可用,或任何其他问题。查看日志docker logs mysql8 -f ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%' 看起来您正在尝试添加一个同名的新用户,而该用户已经存在。销毁您现有的容器,并使用我的回答中提到的命令创建一个新容器。 注意:如果您不知道外部卷地址,您将丢失容器中的所有数据【参考方案2】:

我发现了一个视频,它展示了另一种实现此功能的方法。传入端口号时可以指定IP地址。也就是说,类似-p 127.0.0.1:3307:3306 而不仅仅是-p 3307:3306 我以前从未见过 https://www.youtube.com/watch?v=20om-9Gwuc0#t=7m

启动命令示例

docker run -d -e MYSQL_ROOT_PASSWORD=test --name mysql8 -p 127.0.0.1:3307:3306 mysql:8

然后我可以使用 MYSQL Workbench 在端口 3307 连接到 127.0.0.1

【讨论】:

【参考方案3】:

您需要进入Settings -> Network -> Port Forwarding 并进行配置:

Host/Guest IP0.0.0.0 Host/Guest Port3306

【讨论】:

【参考方案4】:

我通过下载最新版本的 MySQL Workbench 解决了这个问题,然后我使用主机 0.0.0.0 和端口 3306

【讨论】:

【参考方案5】:

我按照 mysql docker hub 中显示的说明进行操作。 写了这个 docker-compose.yml

version: '3.1'

services:
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: example
    ports:
      - 3306:3306

连接时进入mysql工作台,确保清除参数中的密码。现在输入密码(在我的情况下为example

【讨论】:

【参考方案6】:

部署后MySQL默认有以下连接限制:

mysql> select host, user from mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+
4 rows in set (0.00 sec)

显然,出于安全考虑,您将无法在 docker 映像之外连接到它。 如果您需要更改它以允许 root 从任何主机连接(例如,出于开发目的),请执行以下操作:

    使用所需的所有端口映射启动您的 mysql 映像:

    docker run -p 3306:3306 --name=mysql57 -d mysql/mysql-server:5.7

或者,如果需要完整的端口映射:

docker run -p 3306:3306 -p 33060:33060 --name=mysql57 -d mysql/mysql-server:5.7

    如果这是全新安装 - 获取默认密码:

    docker logs mysql57 2>&1 | grep GENERATED

    使用mysql客户端直接连接docker中的mysqld:

    docker exec -it mysql57 mysql -uroot -p

    如果这是全新安装,系统会要求您使用 ALTER USER 命令更改密码。去做吧。

    运行 SQL:

    update mysql.user set host = '%' where user='root';

    退出mysql 客户端。

    重启容器:

    docker restart mysql57

现在您可以从 MySQL Workbench 连接到

host: `0.0.0.0` 
port: `3306`

查询将显示所有更改后:

select host, user from mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | root          |
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys     |
+-----------+---------------+

【讨论】:

谢谢,这个回答对我帮助很大。只有更改密码在这里没有记录,在这里找到了答案:***.com/a/33511149/8439926 谢谢 U Andrey,今天我遇到了这个问题,我已经有大约 3 天的时间尝试连接,我只是使用了你提示的 ip 0.0.0.0 和端口 3306 并且它有效,但我使用 mysqlsh。 在我经验丰富的无知中,我从没想过0.0.0.0 会是正确的......但它是! 谢谢安德烈,这让 '%' 访问权让我不以为然。 当我在 docker 中运行其他应用程序时,只提供我的 ipv4 地址而不是 localhost 允许我连接。现在我无法使用工作台连接到 mysql:latest docker 容器。是因为这个连接限制还是我自己的错误?【参考方案7】:

假设您有docker-compose 文件的下一个内容:

database: image: mysql:5.6 volumes: - dbdata:/var/lib/mysql environment: - "MYSQL_DATABASE=homestead" - "MYSQL_USER=homestead" - "MYSQL_PASSWORD=secret" - "MYSQL_ROOT_PASSWORD=secret" ports: - "33061:3306"

对于本地主机,只需使用主机 127.0.0.1 和 33061 端口

【讨论】:

最佳答案!!您必须查看 docker-compose.yml 文件中的 MySQL 设置。只需使用它们【参考方案8】:

    指定您的配置docker-compose.yml。更多详情here。示例:

    version: '3.1'
    
    services:
      mysql:
        image: mysql:5.6
        container_name: test-mysql
        ports:
          - 3306:3306
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: password
    
    运行此命令docker-compose up 和另一个终端运行docker ps 以查看您的容器。 访问您的泊坞窗:docker exec -it test-mysql bash 在容器内,连接mysql命令行类型,运行mysql -u root -p。 Create a new user 最后配置您的 MySQL 工作台

【讨论】:

【参考方案9】:

@Krishna 的回答有效,但稍作改动 - 用户添加如下

create user 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

见Authentication plugin 'caching_sha2_password' cannot be loaded

【讨论】:

【参考方案10】:

你必须在你的 docker 容器中做一些配置。请按照以下步骤操作。

    在 docker-compose.yml 中指定 mysql 配置块。我在 docker-compose.yml 文件中的 services 对象下有以下 mysql 块。

    services:
        db:
            image: mysql
            volumes:
                - "./.data/db:/var/lib/mysql"
            environment:
                MYSQL_ROOT_PASSWORD: root
                MYSQL_DATABASE: mydb
                MYSQL_USER: user
                MYSQL_PASSWORD: pass
            ports:
                42333:3306
    

    重新启动 docker 容器并运行以下命令以访问 mysql 容器中的 bash shell

    docker ps
    docker exec -it <mysql container name> /bin/bash 
    

    容器内部,连接mysql命令行类型,

    mysql -u root -p
    

    使用 docker-compose.yml 中指定的 MYSQL_ROOT_PASSWORD。执行以下命令创建新用户。

    create user 'user'@'%' identified by 'pass';
    grant all privileges on *.* to 'user'@'%' with grant option;
    flush privileges;
    

    百分号 (%) 表示所有 ip。重启 docker 容器。

    在您的 MySQL Workbench 中提供连接详细信息。使用 docker-compose.yml 文件中指定的 MYSQL_PASSWORD

您现在应该能够连接到您的 mysql 容器。

【讨论】:

你从哪里得到这个IP? 上面显示的IP是我的vagrant box的IP地址。在您的情况下,您可以在 vagrant 文件夹中的 Vagrantfile 中找到它。 IP 通常存储在 .env 文件中,具体取决于您的设置。例如DB_HOST=127.0.0.1 DB_PORT=33061@Krishna,您关于从何处获取 IP 的答案似乎很奇怪,因为人们经常使用 Docker 而不是 Vagrant,AFAIK。此外,如果您设置为 root,或者如果您在尝试创建用户时收到错误消息,因为该用户已经存在,只需设置一个新用户,例如“workbench”。 (您也可以编辑用户的 IP,例如)。否则,这太棒了。谢谢!【参考方案11】:

我通过在 Hostname: 127.0.0.1 (Localhost) 中设置字段值来解决此问题,默认端口为 3306,并带有您的凭据。

【讨论】:

这里指的是哪个字段? @VonC 这里我指的是工作台字段,例如 hostnameportusernamepassword i> 需要连接 mysql 服务器。【参考方案12】:

2个docker相关的条件:

首先,您的 docker run 必须将 mysql 端口映射到主机端口:

docker run -p host:container

(例如:docker run -d -p 3306:3306 tutum/mysql

其次,如果你在VM中使用docker(docker-machine,带有boot2docker),你需要使用docker-machine ip &lt;VMname&gt;的ip,与主机映射的端口。

http://$(docker-machine ip <VMname>):hostPort

如果您需要使用localhost,则需要使用some port forwarding at the VirtualBox level:

VBoxManage controlvm "boot2docker-vm" natpf1 "tcp-port3306,tcp,,3306,,3306"
VBoxManage controlvm "boot2docker-vm" natpf1 "udp-port3306,udp,,3306,,$3306"

(controlvm如果VM正在运行,modifyvm是VM停止) (用你的虚拟机名称替换“boot2docker-vm”:见docker-machine ls


2个mysql相关条件:

nkratzke/EasyMySQL/Dockerfile所示,需要开启远程访问:

# Enable remote access (default is localhost only, we change this
# otherwise our database would not be reachable from outside the container)
RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

您需要在 docker 映像中启动数据库时创建用户。 参见nkratzke/EasyMySQL/start-database.sh,由Dockerfile CMD调用:

/usr/sbin/mysqld &
sleep 5
echo "Creating user"
echo "CREATE USER '$user' IDENTIFIED BY '$password'" | mysql --default-character-set=utf8
echo "REVOKE ALL PRIVILEGES ON *.* FROM '$user'@'%'; FLUSH PRIVILEGES" | mysql --default-character-set=utf8
echo "GRANT SELECT ON *.* TO '$user'@'%'; FLUSH PRIVILEGES" | mysql --default-character-set=utf8
echo "finished"

【讨论】:

Docker 正在我的本地机器上运行。它有 172.17.42.1 IP 地址。当我运行 $select user();它给 +----------------+ |用户() | +----------------+ |根@本地主机 | +----------------+ 集合中的 1 行(0.00 秒)并显示变量给出端口 |第3306章 @PawanSharma 你在 Linux 上吗?如果是,您用来启动容器化 mysql 的 docker run 确切命令是什么?你用的是什么版本的docker? 是的,我在 Ubuntu 机器上,docker 版本是 Docker 版本 1.8.2,构建 0a8c2e3。我可以在 docker 容器中访问 mysql。 @PawanSharma 好的。您用来启动容器化 mysql 的 docker run 确切命令是什么? 你能解释一下吗? github.com/docker-library/mysql/issues/… 我在端口 33060 上使用了我的 ipv4 地址,它不允许我,但是当我使用 -p 3306:3306 创建新容器时,我能够连接。

以上是关于如何将 mysql 工作台连接到在 docker 中运行 mysql?的主要内容,如果未能解决你的问题,请参考以下文章