【发布时间】:2016-02-22 23:30:52
【问题描述】:
我在 docker 容器内使用 mysql 服务器,并且能够在 docker 内访问。如何在我的本地(主机)上运行的 mysql 工作台中创建连接。
【问题讨论】:
标签: mysql docker mysql-workbench
我在 docker 容器内使用 mysql 服务器,并且能够在 docker 内访问。如何在我的本地(主机)上运行的 mysql 工作台中创建连接。
【问题讨论】:
标签: mysql docker mysql-workbench
我试图从Mysql Workbench 连接,但它不允许我。结果,我忘了提到port。以下是从工作台运行和连接的完整命令:
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
host: localhost
port: 3306
user: admin
password: root
【讨论】:
docker logs mysql8 -f
ERROR 1396 (HY000) at line 1: Operation CREATE USER failed for 'root'@'%'
我发现了一个视频,它展示了另一种实现此功能的方法。传入端口号时可以指定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
【讨论】:
您需要进入Settings -> Network -> Port Forwarding 并进行配置:
Host/Guest IP 到 0.0.0.0
Host/Guest Port 转 3306
【讨论】:
我通过下载最新版本的 MySQL Workbench 解决了这个问题,然后我使用主机 0.0.0.0 和端口 3306。
【讨论】:
我按照 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)
【讨论】:
部署后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 |
+-----------+---------------+
【讨论】:
0.0.0.0 会是正确的......但它是!
【讨论】:
指定您的配置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 -u root -p。【讨论】:
@Krishna 的回答有效,但稍作改动 - 用户添加如下
create user 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
见Authentication plugin 'caching_sha2_password' cannot be loaded
【讨论】:
你必须在你的 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 容器。
【讨论】:
DB_HOST=127.0.0.1 DB_PORT=33061@Krishna,您关于从何处获取 IP 的答案似乎很奇怪,因为人们经常使用 Docker 而不是 Vagrant,AFAIK。此外,如果您设置为 root,或者如果您在尝试创建用户时收到错误消息,因为该用户已经存在,只需设置一个新用户,例如“workbench”。 (您也可以编辑用户的 IP,例如)。否则,这太棒了。谢谢!
我通过在 Hostname: 127.0.0.1 (Localhost) 中设置字段值来解决此问题,默认端口为 3306,并带有您的凭据。
【讨论】:
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 run 确切命令是什么?你用的是什么版本的docker?