我在docker容器中使用mysql服务器并且能够访问docker内部。如何在我的本地(主机)上运行的mysql工作台中创建连接。
答案 0 :(得分:17)
您必须在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容器了。
答案 1 :(得分:14)
2个与泊坞有关的条件:
首先,您的docker run必须将mysql端口映射到主机端口:
docker run -p host:container
(例如:docker run -d -p 3306:3306 tutum/mysql
)
第二,如果您在VM(docker-machine,使用boot2docker)中使用docker,则需要使用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"
答案 2 :(得分:10)
默认情况下,部署后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 |
+-----------+---------------+
答案 3 :(得分:3)
假设您拥有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"
答案 4 :(得分:2)
@ Krishna的答案有效,但稍有改动 - 用户添加如下
create user 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';
请参阅Authentication plugin 'caching_sha2_password' cannot be loaded
答案 5 :(得分:2)
我正尝试从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
答案 6 :(得分:1)
我通过在 主机名:127.0.0.1 (Localhost)中设置字段值来获得此解决方案,默认情况下为3306,包含您的信用
答案 7 :(得分: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
。答案 8 :(得分:0)
我遵循了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
)
答案 9 :(得分:0)
您需要在“设置->网络->端口转发”中将主机/来宾IP配置为0.0.0.0
,将主机/来宾端口配置为3306
。
答案 10 :(得分:0)
我解决了该问题,它下载了MySQL Workbench的最新版本,然后使用端口为0.0.0.0
的主机3306
。
答案 11 :(得分:0)
我找到了一段视频,该视频展示了另一种使它起作用的方法。您可以在传入端口号时指定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