如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将使用 docker 创建的 MySQL 连接到另一个端口(不是端口 3306)?

如何将我的 docker Django 实例连接到我的 docker mysql 实例?

无法从 bash 连接到 docker 中的 mysql

如何将MySQL服务器连接到工作台

如何通过 SSH 连接到 MySQL Docker 容器?

[Docker]:将 PHPMyAdmin 连接到 MySQL 不起作用