在docker容器里连接上本地mysql8.0.30数据库的方法

本文详细指导如何在Docker容器中配置MySQL允许远程连接,包括修改配置、重启服务、验证端口和IP,以及解决访问权限问题,确保容器内的应用能连接主机数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

概述

具体步骤


概述

默认情况下,Docker会创建一个名为docker0的网桥。 Docker主机和Docker容器在该网桥上都有一个IP地址。在这个模式下,docker容器与主机的网络是不互通的,docker 及docker下的容器之间有个地址相同 (同ip段),外网访问只能通过端口映射。如果docker容器里的nginx需要连本机mysql , 那么可以将mysql的3306端口打开,通过外网去连接。

具体步骤

(1). 切换到root账号,否则保存文件时会提示文件处于只读状态。

在主机命令行里运行命令:

su root


(2). 修改mysql配置文件,修改配置为允许远程连接,并开放3306端口。

在主机命令行里运行命令:

vim  /etc/mysql/mysql.conf.d/mysqld.cnf


然后用字符#注释掉如下两行代码:

bind-address        = 127.0.0.1
mysqlx-bind-address    = 127.0.0.1


(3). 重启mysql服务。

在主机命令行里运行命令:

service mysql stop
service mysql start


(4). 检查3306端口是否开启成功。
在主机命令行里运行命令:

netstat -an|grep 3306


如果出现:::3306,而不是127.0.0.1:::3306,那么就表示3306端口已开启成功。

运行结果示例图:

 
(5). 查看docker容器连接主机的ip地址。
在主机命令行里运行命令:

ifconfig

在结果列表中找到docker0这一项对应的inet值。

运行结果示例图:

也可以在主机命令行里运行命令:

ip addr show docker0

来找到对应的inet值。

运行结果示例图:

 
(6). 修改对应程序.env文件里的mysql配置项,其中hostname这一项填写前面步骤里找到的docker0网桥的inet值【例如172.17.0.1】,并对应着修改mysql配置项里的数据库名称、用户名、密码为自己本地mysql软件里对应数据库的名称、用户名、密码。


(7). 重启容器并检查容器状态是否为正在运行中(running)。

在项目容器目录下运行命令:
 

# 重启容器
docker-compose restart

# 查看容器列表
docker-compose ps 

容器列表中status这一列的值为running就表示容器状态为正在运行中,即刚才重启容器的操作已成功执行完毕。

(8). 运行项目程序并访问项目地址,检查项目程序是否可以正常运行、使用的数据来源是否是本地mysql数据库里的数据等。

(9). 运行完前面的(8)步骤后,如果运行程序报如下的错误:
[PDOException]                             
  SQLSTATE[HY000] [2002] Connection refused

那么很可能是因为账号权限方面的问题。一种可以尝试的解决办法如下:

运行mysql -u root -p后输入密码,进入mysql控制台,完成如下I、II、III、IV步骤。
I.创建账户。
  

create user '用户名A'@'docker0网桥的inet值【例如172.17.0.1】' identified by '用户名A对应的密码';

II.赋予权限。
    

grant all privileges on *.* ro '用户名A'@'docker0网桥的inet值【例如172.17.0.1】';

        如果是修改权限,那么还需要在上面这条命令末尾分号前加上with grant option。
III.刷新权限。
    

flush privileges;

IV. 重启mysql服务。
  

service mysql stop
service mysql start

<think>嗯,用户想了解如何在Docker中启动Keycloak并连接MySQL数据库,而且MySQL是通过IP和端口提供的。我需要一步步来,确保每个细节都正确。 首先,我需要确认用户的需求。用户已经有一个运行中的MySQL实例,可能不在Docker,或者是在另一个容器,所以需要用IP和端口连接。这时候,Docker中的Keycloak需要配置数据库连接信息,而不是使用默认的H2数据库。 接下来,我得回忆一下Keycloak的官方Docker镜像文档,看看他们推荐的环境变量。Keycloak通常使用环境变量来配置数据库连接。关键的环境变量应该包括数据库的URL、用户名、密码、驱动等。比如,DB_VAR、DB_ADDR、DB_PORT、DB_USER、DB_PASSWORD这些。 然后,正确的JDBC URL格式是什么样的?用户提供的MySQL是IP加端口,所以URL应该是jdbc:mysql://IP:PORT/DB_NAME,这可能需要加上时区参数,比如useSSL=false&serverTimezone=UTC,特别是如果MySQL版本较新或者有SSL问题的话。 然后,Docker命令或者docker-compose.yml的写法。用户可能更倾向于使用docker run命令或者docker-compose文件。两种方式都需要配置环境变量,映射端口,设置admin的账号密码。 要注意的是,Keycloak的镜像可能需要指定版本,比如quay.io/keycloak/keycloak:latest,但最好推荐使用具体版本,比如22.0.0,避免更新导致的问题。 另外,数据库驱动的问题。Keycloak的官方镜像可能默认不带MySQL的JDBC驱动,所以需要用户自己下载并添加到容器的目录。或者,用户可以在启动命令中通过安装curl和下载驱动,或者使用Dockerfile来构建自定义镜像。这可能需要分步骤说明,或者提供两种方法:一种是手动下载驱动,另一种是在启动时自动下载。 还要考虑数据库是否已经存在,如果MySQL实例没有创建对应的数据库和用户,用户需要先执行SQL语句创建数据库和赋予权限。这部分也需要在步骤中提醒用户,避免连接失败。 可能遇到的错误包括:驱动未找到,导致Keycloak启动失败;数据库连接字符串错误,比如端口或IP不对;权限问题,比如数据库用户没有访问权限;SSL配置问题,如果MySQL强制SSL而连接字符串中没有配置的话。 所以,总结下来步骤应该是: 1. 确保MySQL服务可用,创建数据库和用户。 2. 下载MySQL JDBC驱动,并挂载到Keycloak的容器中。 3. 编写Docker命令或docker-compose文件,正确配置环境变量。 4. 启动容器,检查日志确认连接是否成功。 另外,用户可能不太清楚环境变量的具体名称,需要给出正确的变量名,比如DB_ADDR应该是DB_VAR=mysql,但可能实际是KC_DB_URL_HOST之类的,这可能需要查证Keycloak的最新文档。比如,Keycloak从17版本开始,环境变量的命名规则可能有变化,比如使用KC_前缀,例如KC_DB_URL、KC_DB_USERNAME等。 比如,正确的环境变量应该是: KC_DB=mysql KC_DB_URL_HOST=IP地址 KC_DB_URL_PORT=端口 KC_DB_NAME=数据库名 KC_DB_USERNAME=用户 KC_DB_PASSWORD=密码 KC_HOSTNAME=主机名(如果需要) 或者,可能需要直接通过KC_DB_URL来指定完整的URL,比如: KC_DB_URL=jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&serverTimezone=UTC 这时候,其他变量可能不需要单独设置,只需要设置URL、用户名和密码。 所以,我需要确认最新的Keycloak环境变量命名方式,避免给出过时的信息。查阅Keycloak官方文档,发现从17版本开始,Keycloak使用了新的配置方式,环境变量以KC_开头,并且数据库配置包括: KC_DB=mysql KC_DB_URL_HOST=... KC_DB_URL_PORT=... KC_DB_URL_DATABASE=... KC_DB_USERNAME=... KC_DB_PASSWORD=... 或者,也可以直接使用KC_DB_URL来覆盖整个JDBC URL。 例如,使用KC_DB_URL指定完整的连接字符串会更直接,尤其是当用户需要自定义参数时。 所以,正确的环境变量应该是: KC_DB=mysql KC_DB_URL=jdbc:mysql://IP:PORT/DB_NAME?useSSL=false&serverTimezone=UTC KC_DB_USERNAME=username KC_DB_PASSWORD=password KC_HOSTNAME=hostname(可选) 同时,可能需要设置数据库驱动的位置,如果驱动没有自动加载的话。不过,Keycloak的Docker镜像可能已经包含了MySQL驱动,但需要确认。如果未包含,用户需要将驱动JAR文件放到/providers目录下。 例如,在Docker命令中,可以通过-v参数挂载驱动到容器的/opt/keycloak/providers/目录,或者在Dockerfile中添加。 假设用户需要手动下载驱动,可以这样做: 下载MySQL Connector/J的JAR文件,例如mysql-connector-java-8.0.30.jar,然后挂载到容器中。 所以,Docker命令可能包括: docker run -d \ --name keycloak \ -p 8080:8080 \ -e KC_DB_URL=jdbc:mysql://192.168.1.100:3306/keycloak \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -v /path/to/mysql-connector.jar:/opt/keycloak/providers/mysql-connector.jar \ quay.io/keycloak/keycloak:22.0.0 \ start-dev 不过,这可能有个问题,就是Keycloak的镜像是否已经包含MySQL驱动。根据Keycloak的文档,默认可能没有,需要用户自行添加。比如,在构建自定义镜像时,添加驱动,或者在启动时挂载。 另外,启动命令中的start-dev可能只适用于开发模式,生产环境可能需要不同的命令,比如start,但用户可能只是想快速启动测试环境,所以用start-dev也可以。 不过,用户可能使用较新的Keycloak版本,需要注意命令参数的变化。例如,某些版本可能需要使用kc.sh start-dev来代替之前的命令。 总结,正确的步骤应该是: 1. 准备MySQL数据库,创建用户和数据库。 2. 下载MySQL JDBC驱动。 3. 编写Docker命令或docker-compose.yml,配置环境变量并挂载驱动。 4. 启动Keycloak容器,验证连接。 在docker-compose的例子中,需要同时定义服务和卷,或者直接挂载驱动文件。 可能还需要注意Keycloak的版本,不同版本的环境变量可能不同,需要根据最新文档调整。例如,旧版本可能使用DB_VAR,而新版本使用KC_DB。 最后,测试连接时,可以查看容器日志,确认没有数据库连接错误,或者登录Keycloak的管理界面,确认正常运行。</think>### 分步说明:Docker启动Keycloak连接MySQL数据库 --- #### **步骤1:准备MySQL数据库** 1.MySQL服务器上创建专用数据库和用户(若未提前创建): ```sql CREATE DATABASE keycloak_db; CREATE USER 'keycloak_user'@'%' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON keycloak_db.* TO 'keycloak_user'@'%'; FLUSH PRIVILEGES; ``` --- #### **步骤2:下载MySQL驱动** Keycloak镜像默认不包含MySQL驱动,需手动下载JDBC驱动: - 从 [MySQL官网](https://dev.mysql.com/downloads/connector/j/) 下载 `mysql-connector-java-x.x.x.jar` - 或直接通过命令下载(示例版本为8.0.30): ```bash wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.0.30/mysql-connector-j-8.0.30.jar ``` --- #### **步骤3:编写Docker启动命令** 通过`docker run`直接启动Keycloak容器: ```bash docker run -d \ --name keycloak \ -p 8080:8080 \ -e KC_DB=mysql \ -e KC_DB_URL_HOST=192.168.1.100 \ # MySQL服务器IP -e KC_DB_URL_PORT=3306 \ # MySQL端口 -e KC_DB_NAME=keycloak_db \ # 数据库名 -e KC_DB_USERNAME=keycloak_user \ -e KC_DB_PASSWORD=your_password \ -e KC_HOSTNAME=localhost \ # Keycloak访问域名(按需修改) -e KEYCLOAK_ADMIN=admin \ # 管理员账号 -e KEYCLOAK_ADMIN_PASSWORD=admin \ -v /path/to/mysql-connector-j-8.0.30.jar:/opt/keycloak/providers/mysql-connector.jar \ quay.io/keycloak/keycloak:22.0.0 \ start-dev ``` --- #### **或使用docker-compose.yml** ```yaml version: '3' services: keycloak: image: quay.io/keycloak/keycloak:22.0.0 container_name: keycloak ports: - "8080:8080" volumes: - ./mysql-connector-j-8.0.30.jar:/opt/keycloak/providers/mysql-connector.jar environment: KC_DB: mysql KC_DB_URL_HOST: 192.168.1.100 # MySQL服务器IP KC_DB_URL_PORT: 3306 # MySQL端口 KC_DB_NAME: keycloak_db KC_DB_USERNAME: keycloak_user KC_DB_PASSWORD: your_password KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin command: ["start-dev"] ``` --- #### **关键配置说明** 1. **环境变量**: - `KC_DB=mysql`:指定数据库类型 - `KC_DB_URL_HOST`和`KC_DB_URL_PORT`:MySQL服务器地址和端口 - `KC_DB_NAME`:数据库名称 - `KC_DB_USERNAME`和`KC_DB_PASSWORD`:数据库账号密码 2. **驱动挂载**:将MySQL驱动挂载到容器内`/opt/keycloak/providers/`目录 3. **Admin账号**:通过`KEYCLOAK_ADMIN`和`KEYCLOAK_ADMIN_PASSWORD`设置管理员 --- #### **验证启动** 1. 查看容器日志: ```bash docker logs keycloak ``` 2. 访问管理界面: - 打开浏览器访问 `http://localhost:8080` - 使用 `admin/admin` 登录 --- #### **常见问题** 1. **驱动加载失败**:检查驱动文件路径和权限,确保容器内路径正确 2. **数据库连接超时**:确认MySQL允许远程访问(检查`bind-address`和防火墙) 3. **时区问题**:在JDBC URL中添加`?serverTimezone=UTC`(例如:`KC_DB_URL=jdbc:mysql://IP:PORT/DB_NAME?serverTimezone=UTC`) 通过以上步骤,Keycloak即可通过Docker连接外部MySQL数据库运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值