1. 虚拟机和宿主机概念
-
宿主机(Host Machine):是物理机器,运行虚拟化软件的机器。宿主机上安装了虚拟化软件(如 VMware、VirtualBox、KVM),它可以创建和管理多个虚拟机。
-
虚拟机(VM, Virtual Machine):是运行在宿主机上的一个虚拟计算机,通常是通过虚拟化软件创建的。虚拟机有自己的操作系统和虚拟硬件,独立于宿主机的操作系统。
对于 Docker 容器:
- 宿主机:指的是运行 Docker 的物理服务器或虚拟机,也可以是你的本地开发机器。
- 容器(Container):是 Docker 提供的轻量级虚拟化环境,与虚拟机不同,容器共享宿主机的操作系统内核,并且容器之间相互隔离。Docker 容器通常用来运行应用程序及其依赖。
注意:对于 Docker 容器来说,宿主机是运行 Docker 引擎的机器,也可以是虚拟机。如果你在虚拟机内运行 Docker,那么虚拟机就是 Docker 容器的宿主机。
2. MySQL 和 Docker 配置
配置 MySQL 容器的连接
-
创建 MySQL 容器时暴露端口:
- 通过
docker run
命令创建 MySQL 容器并暴露端口,确保端口能从外部访问。 - 使用
-p 3307:3306
映射宿主机端口 3307 到容器的 3306 端口。
- 通过
-
允许远程连接:
-
MySQL 默认只允许从本地主机连接,需要修改 MySQL 配置文件,设置
bind-address = 0.0.0.0
以允许所有 IP 地址连接. -
通过命令:
echo "bind-address = 0.0.0.0" | tee -a /etc/my.cnf
使 MySQL 接受所有地址的连接。
-
-
防火墙配置:
-
确保防火墙允许端口 3306 或 3307 的流量,通过命令:
firewall-cmd --permanent --add-port=3307/tcp firewall-cmd --reload
打开 MySQL 连接所需的端口。
MySQL 用户权限配置
-
-
创建远程用户权限:
-
给 MySQL 用户赋予从任何地方(
%
)访问的权限:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
-
3. 常见命令讲解
-
docker ps
:列出当前正在运行的容器。 -
docker exec -it <container_id> mysql -u root -p
:进入容器并启动 MySQL 客户端。 -
ss -tuln
:查看系统的网络连接状态。ss
是替代netstat
的工具,提供了类似功能。-t
:显示 TCP 连接-u
:显示 UDP 连接-l
:显示正在监听的端口-n
:显示数字格式的端口号和 IP 地址
4. Docker 镜像和端口管理
- 容器端口映射:使用
-p
参数进行端口映射,格式为宿主机端口:容器端口
。例如,-p 3307:3306
表示宿主机的 3307 端口映射到容器的 3306 端口。 docker run -d
:表示容器以 detached mode后台模式运行。-d
(detached):容器在后台运行,不会占用当前终端的输出。
5. 配置文件中的 bind-address
设置
bind-address = 0.0.0.0
:该设置告诉 MySQL 监听来自任何 IP 地址的连接。如果你希望 MySQL 接受远程连接(如通过虚拟机访问数据库),需要设置bind-address = 0.0.0.0
。- IPv6 与 IPv4:
ss -tuln
显示的两个端口监听地址,通常情况下会同时显示 IPv4 和 IPv6 的监听端口。可以保留这两行,以便兼容不同的连接方式。禁用 IPv6 地址监听也不会影响正常使用。
6. 常见的错误及解决方案
-
错误:
ERROR 2003 (HY000): Can't connect to MySQL server
- 解决方案:确保防火墙已开放所需端口,且 MySQL 容器正确配置为接受外部连接(例如,通过
bind-address
设置)。
- 解决方案:确保防火墙已开放所需端口,且 MySQL 容器正确配置为接受外部连接(例如,通过
-
错误:
Public Key Retrieval is not allowed
-
解决方案:在 JDBC 连接 URL 中添加
allowPublicKeyRetrieval=true
,禁用 SSL 时可以设置useSSL=false
:jdbc:mysql://192.168.150.101:3307?allowPublicKeyRetrieval=true&useSSL=false
-
7. Docker 相关命令
docker ps
:查看正在运行的容器。docker exec -it <container_name> <command>
:进入容器并执行命令。docker restart <container_name>
:重启容器。docker stop <container_name>
:停止容器。docker run -d
:后台运行容器。docker run -p
:映射端口。