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

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

【问题讨论】:

    标签: mysql docker mysql-workbench


    【解决方案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 从任何主机连接(例如,出于开发目的),请执行以下操作:

            1. 使用所需的所有端口映射启动您的 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
            
            1. 如果这是全新安装 - 获取默认密码:

              docker logs mysql57 2>&1 | grep GENERATED

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

              docker exec -it mysql57 mysql -uroot -p

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

            4. 运行 SQL:

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

            5. 退出mysql 客户端。

            6. 重启容器:

              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     |
            +-----------+---------------+
            

            【讨论】:

            • 谢谢,这个回答对我帮助很大。只有更改密码在这里没有记录,在这里找到了答案:stackoverflow.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】:
            1. 指定您的配置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
              
            2. 运行此命令docker-compose up 和另一个终端运行docker ps 以查看您的容器。
            3. 访问您的泊坞窗:docker exec -it test-mysql bash
            4. 在容器内,连接mysql命令行类型,运行mysql -u root -p
            5. Create a new user
            6. 最后配置您的 MySQL 工作台

            【讨论】:

              【解决方案9】:

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

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

              Authentication plugin 'caching_sha2_password' cannot be loaded

              【讨论】:

                【解决方案10】:

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

                1. 在 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
                  
                2. 重新启动 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 容器。

                3. 在您的 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 创建新容器时,我能够连接。
                猜你喜欢
                • 1970-01-01
                • 2021-12-15
                • 1970-01-01
                • 2017-05-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多