如何将 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 IP
到 0.0.0.0
Host/Guest Port
转 3306
【讨论】:
【参考方案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 这里我指的是工作台字段,例如 hostname、port、username 和 password 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 <VMname>
的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)?