docker 发布连接mysql容器的.netcore6.0项目,踩坑容器通信!踩坑连接mysql失败!

1、新建.netcore  webapi 项目  已经引入mysq

 

 

2、给项目添加dockerfile支持,使用默认的即可

3、将项目上传到ubuntu宿主机上,并且拷贝Dockerfile文件到sln所在的项目根目录下

 4、 进入到Dockerfile文件和sln所在的项目根目录下

 

5、生成项目镜像文件,镜像名字为coremysql3307

docker  build --no-cache -t coremysql3307 -f Dockerfile .

 

5、查看镜像,mysql 是已经提前拉取的数据库镜像

 

6、启动一个mysql镜像,对外映射端口为3307 ,mysql容器名字为mysqltest  这两个参数很重要,是我们项目连接字符串要用到的

docker run -d -p 3307:3306 --name mysqltest -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.31

 

7、启动一个容器运行项目镜像,此步骤是坑点,正确步骤参看13

docker run -it -d  -p 8112:80 --name mysql3307core coremysql3307

 

8、执行以下命令往数据库插入数据和查询数据

curl http://localhost:8112/api/Test/AddPerson
curl http://localhost:8112/api/Test/AddPerson

出现报错信息

 9、打印容器日志

docker logs 983ec44887e0

 10、修改项目配置信息,重新生成镜像文件

 

11、仍然报错

 

 

 12、修改连接字符串中服务器为127.0.0.1 还是报错

 报错信息如下

 

13、总结:fail: Microsoft.EntityFrameworkCore.Database.Connection[20004]  和  MySqlConnector.MySqlException (0x80004005): Connect Timeout expired.

 

是因为没法跟数据库简历连接,可能有两个原因:

1、Data Source = 这里写的是localhost、或者宿主机ip等等,都不对,如果连接mysql容器,必须是容器名称

 

2、donet项目容器和mysql容器间没有建立通信,比如ping 不通,需要使用--link 建立连接

docker run -it -d  -p 8112:80  --link mysqltest:mysqltest --name mysql3307core coremysql3307

#或者
docker run -it -d  -p 8112:80   --name mysql3307core  --link mysqltest:mysqltest      coremysql3307

#注意准备要运行的镜像名称一定是最后一个参数,所以可以把--link方前面比较好

 3、当前面1和2都满足的条件下,如果还是无法连接,那就是MySqlConnector.MySqlException (0x80004005): Connect Timeout expired

解决方法:打开navicat,将容器内的mysql关闭连接,然后再双击打开连接,也就是重新连接一次

 

 然后就可以调用接口命令了

 

远程访问出现报错,也是一样,打开navicat,将容器内的mysql关闭连接,然后再双击打开连接,也就是重新连接一次

 

 然后就可以访问了

 

 

14、总结错误:fail: Microsoft.EntityFrameworkCore.Database.Command[20102]

 如果没有关闭大小写设置,默认都是数据库名和表明首字母大写

 14、将test改为 Test 和persons改为Persons后就可以查询出数据

 15、新增数据

 

posted @ 2023-04-23 17:27  无声袖箭  阅读(305)  评论(0)    收藏  举报