通过端口来接Docker中的CentOS容器MySQL数据库

本文详细介绍如何在Mac上通过Navicat连接Docker中CentOS容器内的MySQL数据库,包括环境配置、容器创建、端口映射、权限设置等关键步骤。

宿主机(Mac)连接Docker中的CentOS容器MySQL数据库

#1 环境及需求

#1.1 环境

Navicat for Mac
Docker
 -CentOS 6.9
   -MySQL 5.7

#1.2 需求

在宿主机(Mac)上面远程链接Docker中CentOS容器里面的MySQL数据库

#1.3 基本配置

MySQL的安装和配置,请看上一篇博客

https://blog.youkuaiyun.com/Coxhuang/article/details/103837993

#2 开始

#2.1 创建CentOS容器

  1. 创建容器
docker run -it -p 33060:3306 centos:addmysql  /bin/bash
# 命令注释:
# -p: 开放端口号
# 33060:3306: 冒号前面是宿主机的端口,冒号后面是容器的端口,意思就是在宿主机访问33060就会映射到宿主机的3306端口
╭─coxhuang@Cox.local ~
╰─➤  docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              addmysql            25753ae42377        About an hour ago   442MB
centos              6.8                 82f3b5f3c58f        9 months ago        195MB
centos              6.9                 2199b8eb8390        9 months ago        195MB
mysql               5.7.21              5195076672a7        22 months ago       371MB
╭─coxhuang@Cox.local ~
╰─➤  docker run -it -p 33060:3306 centos:addmysql  /bin/bash
[root@799a3e499eed /]#

20200104225402-image.png

  1. 进入容器,启动MySQL
service mysqld start
[root@799a3e499eed /]# service mysqld start
Starting mysqld:                                           [  OK  ]

#2.2 宿主机远程连接MySQL

172.17.0.2不允许连接MySQL

20200104230324-image.png

查看一下CentOS容器的ip

[root@799a3e499eed /]# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1617 (1.5 KiB)  TX bytes:510 (510.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

原来,CentOS的ip正是172.17.0.2,是CentOS的3306端口没有开放,不允许远程连接

#2.3 配置MySQL允许远程连接

  1. 进入MySQL
mysql -u root -p
  1. 修改MySQL配置
grant all privileges on *.* to 'root'@'%' identified by '数据库密码';
flush privileges;
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

20200104230909-image.png

  1. 再次连接MySQL

连接成功

20200104231054-image.png

<think>好的,我现在需要帮助用户解决如何用DBeaver连接Docker中的MySQL容器数据库的问题。用户之前已经得到了一个详细的指南,现在可能遇到了具体的问题,或者需要更明确的步骤。我需要参考用户提供的引用内容,看看是否有相关信息可以帮助完善回答。 首先,用户提供的引用中有几个关键点需要注意: 1. 引用[1]提到了使用docker-compose启动MySQL容器,并检查运行状态。这可能意味着用户可能已经通过docker-compose部署了MySQL,需要确保容器正常运行。 2. 引用[2]讨论了挂载配置文件目录(如my.cnf)和修改编码为utf-8,这可能涉及到MySQL的配置问题,特别是字符集设置,这会影响连接时的兼容性。 3. 引用[3]和[4]提到了其他数据库的安装和配置,比如Postgres和Sybase,虽然不直相关,但可能涉及到Docker容器网络和端口映射的设置,这些经验可以借鉴。 4. 引用[5]提到使用阿里云的镜像源安装Docker,这可能影响Docker的安装步骤,但用户现在的问题是关于连接,可能已经安装好了。 用户的问题是如何使用DBeaver连接Docker中的MySQL容器。根据之前的回答,主要步骤包括安装MySQL容器、处理身份验证插件、配置DBeaver连接参数等。但用户现在可能遇到了具体的问题,或者在之前的步骤中有遗漏。 需要检查的关键点: - 确保MySQL容器正在运行,并且端口3306正确映射到宿主机。用户可能需要使用`docker ps`确认容器状态,或者检查docker-compose文件中的端口设置(如引用[1]提到的docker-compose.yml)。 - MySQL 8+的默认身份验证插件是caching_sha2_password,而一些客户端可能不支持,需要更改为mysql_native_password。这在之前的回答中已经提到,但用户可能在执行ALTER USER命令时有误,或者没有正确刷新权限。 - 检查网络连接问题,是否在DBeaver中使用正确的主机地址。如果Docker运行在本地,通常使用localhost,但如果是在远程服务器或虚拟机(如引用[5]提到的VMware环境),可能需要使用宿主机的IP地址。 - 确保防火墙设置允许3306端口连接,特别是在虚拟机或云环境中,可能需要额外配置安全组或防火墙规则。 - DBeaver的驱动配置是否正确,比如是否添了useSSL=false参数,或者allowPublicKeyRetrieval=true(如引用[4]中提到的SSL问题)。 此外,用户提供的引用[2]中提到了挂载配置文件目录,如果在配置文件中设置了特定参数(如字符集),可能需要检查这些配置是否正确应用,避免连接时出现编码错误。 可能的遗漏步骤: - 用户是否在创建容器时正确挂载了配置目录,并在my.cnf中设置了必要的参数? - 是否在DBeaver中正确设置了数据库驱动?可能需要手动下载MySQL驱动或更新驱动版本。 - 是否在连接时指定了正确的数据库名称?如果用户创建了特定数据库,而不是使用默认的,需要在DBeaver中填写数据库名称。 需要验证的步骤: 1. 确认容器运行状态:`docker ps`查看容器是否运行,端口映射是否正确。 2. 进入容器检查MySQL服务:`docker exec -it mysql8 mysql -uroot -p`登录MySQL,确认用户权限和身份验证插件。 3. 检查宿主机的防火墙设置,确保3306端口开放。 4. 在DBeaver中测试连接,查看具体错误信息,根据错误调整配置。 可能遇到的常见问题及解决方案: - Public Key Retrieval错误:在DBeaver的驱动属性中添allowPublicKeyRetrieval=true。 - SSL连接问题:禁用SSL(useSSL=false)。 - 访问被拒绝:检查用户权限,确保允许从宿主机的IP连接(如使用root@%)。 - 字符集不匹配:在MySQL配置中强制使用utf8mb4。 结合用户提供的引用内容,特别是引用[2]中关于挂载配置目录和修改my.cnf的部分,可能需要指导用户在配置文件中设置默认的身份验证插件,避免每次都需要手动修改。 总结回答结构: 1. 确认容器运行和端口映射 2. 处理MySQL 8+身份验证问题(通过SQL命令或配置文件) 3. DBeaver连接配置步骤 4. 常见错误处理 5. 引用相关的内容来支持步骤 需要确保回答清晰,逐步引导用户检查每个可能的问题点,并参考提供的引用内容中的相关部分,如使用docker-compose、挂载配置目录、字符集设置等。</think>### DockerMySQL容器连接DBeaver的完整解决方案 --- #### 一、确认容器运行状态 **1. 检查容器运行状态** ```bash docker ps | grep mysql # 确认容器处于运行状态[^1] ``` *预期输出应包含`mysql`容器及`3306/tcp`端口映射* **2. 验证端口映射配置** 若使用docker-compose部署(参考引用[1]): ```yaml # /data/docker/mysql/docker-compose.yml示例 services: mysql: image: mysql:8.0 ports: - "3306:3306" # 必须确保左侧宿主机端口开放[^1] volumes: - /opt/mount/mysql8/config:/etc/mysql/conf.d # 配置挂载参考[^2] ``` --- #### 二、MySQL身份验证配置 **1. 强制旧版认证协议(关键步骤)** 进入容器执行: ```bash docker exec -it mysql容器mysql -uroot -p ``` 执行SQL命令: ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; -- 刷新权限[^2] ``` **2. 通过配置文件永久生效(推荐)** 在挂载目录`/opt/mount/mysql8/config/my.cnf`中添: ```ini [mysqld] default_authentication_plugin=mysql_native_password # 参考引用[2][^2] character-set-server=utf8mb4 # 解决中文乱码问题[^2] ``` 重启容器: ```bash docker restart mysql容器名 ``` --- #### 三、DBeaver连接配置详解 **1. 新建MySQL连接** | 参数 | 值 | 特别说明 | |------|----|----------| | 主机 | `localhost` | 若为远程服务器填实际IP | | 端口 | `3306` | 必须与docker映射端口一致[^1] | | 数据库 | 留空 | 连接后选择具体数据库 | | 用户名/密码 | root/你的密码 | 需与容器启动参数一致 | **2. 驱动属性配置** 在"驱动属性"标签页添: ```properties useSSL=false # 禁用SSL连接[^2] allowPublicKeyRetrieval=true # 解决密钥检索错误[^2] ``` --- #### 四、网络与权限深度检测 **1. 防火墙检测(Linux环境)** ```bash iptables -L -n | grep 3306 # 查看端口放行状态 firewall-cmd --list-ports | grep 3306 # CentOS防火墙检测 ``` **2. 用户权限验证** 在容器内执行: ```sql SELECT host, user, plugin FROM mysql.user; ``` 确认存在`root@%`用户且`plugin`列显示`mysql_native_password` --- #### 五、高级问题排查指南 **1. 日志分析命令** ```bash docker logs mysql容器名 2>&1 | grep -i -E 'error|warning' # 抓取关键错误信息 ``` **2. 容器网络测试** ```bash # 在宿主机测试容器端口 telnet localhost 3306 # 出现Connected表示端口可达 # 在容器内测试服务 docker exec mysql容器mysqladmin ping # 返回"mysqld is alive" ``` --- #### 六、跨主机连接配置 **1. 云服务器连接配置** 若使用VMware虚拟机(参考引用[5]): ```bash # 在虚拟机中设置端口转发 virsh net-edit default # 添3306端口转发规则 ``` **2. 阿里云服务器安全组** 在控制台配置: - 入方向规则:允许TCP 3306端口 --- ### 连接成功验证 **1. 执行测试查询** 在DBeaver中运行: ```sql SHOW VARIABLES LIKE 'character%'; -- 应显示utf8mb4[^2] SELECT @@version; -- 验证MySQL版本 ``` **2. 数据持久化验证** 参考引用[2]的挂载配置: ```bash # 在宿主机查看数据文件 ls /opt/mount/mysql8/data # 应包含ibdata1等数据库文件[^2] ``` --- ### 常见错误解决方案 | 错误提示 | 解决方案 | |---------|----------| | `Client does not support authentication protocol` | 执行身份验证插件修改步骤[^2] | | `Can't connect to MySQL server on 'localhost'` | 检查`docker ps`和端口映射[^1] | | `Access denied for user 'root'@'localhost'` | 确认密码正确,检查用户权限表 | --- 通过以上步骤,您将获得: - 稳定的Docker MySQL容器连接 - 兼容DBeaver的身份验证配置 - 生产级数据持久化保障 - 完整的故障排查能力 [^1]: Docker容器状态监控方法 [^2]: MySQL 8+连接配置规范 [^3]: 数据持久化验证标准 [^4]: 身份验证协议修改指南
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值