0.简介

本文主要是在学习黑马程序员Docker快速入门到项目部署过程中,

对遇到的问题进行了相关的总结梳理

1.本地已存在mysql服务占用3306端口

问题

当我使用docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql准备创建mysql容器时

报错:docker: Error response from daemon: driver failed programming external connectivity on endpoint mysql (733e95fcda57dde10a6cd938e83a1eb8f7441d3bbb5edcd98a53b2eb9c734cbb): Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use.

这个错误消息表示端口 3306 已经被占用,因此 Docker 无法将容器的 MySQL 服务端口映射到该端口。通常,这可能是因为本地主机上已经运行了另一个 MySQL 实例或其他进程正在监听相同的端口。

由于我之前跟着黑马程序员学习过前置Linux课程,在其上已安装过Mysql数据库,所以这里会发生端口冲突

解决

1.更改 Docker 容器端口映射:

如果端口 3306 在本地主机上被其他应用程序占用,你可以尝试将容器的 MySQL 服务端口映射到主机上的另一个端口,例如 3307

docker run -d --name mysql -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

2.卸载本机的Mysql数据库

1.停止MySQL服务

sudo systemctl stop mysql

2.卸载Mysql

参考链接:Centos7 完全卸载mysql

1、查看mysql安装了哪些东西

rpm -qa |grep -i mysql

2.将安装的项目均进行卸载
yum remove mysql-community-common-5.7.20-1.el7.x86_64
yum remove mysql-community-client-5.7.20-1.el7.x86_64
yum remove mysql57-community-release-el7-11.noarch
yum remove mysql-community-libs-5.7.20-1.el7.x86_64
yum remove mysql-community-server-5.7.20-1.el7.x86_64
3.查看是否卸载完成

rpm -qa |grep -i mysql

若显示为空即可

4.查找mysql相关目录

find / -name mysql

5.删除相关目录

rm -rf ...

2.Mysql版本过低导致在导入其sql脚本时报错

问题

这个我是先去数据库导入sql脚本的,这里用的还是之前学习Linux中的老版Mysql(5.7.43),并没有用Docker进行部署(用了的话应该会自动帮你升级成最新的)

例子

例一:

错误

CREATE DATABASE IF NOT EXISTS hmall /!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci / /!80016 DEFAULT ENCRYPTION='N'/;

报错:应为 CHAR, CHARACTER, CHARSET 或 COLLATE,得到 'ENCRYPTION'

原因

这个错误是因为在创建数据库时使用了一个不支持的选项 DEFAULT ENCRYPTION。

在 MySQL 中,DEFAULT ENCRYPTION 选项用于指定数据库的默认加密级别,但在早期的 MySQL 版本中(40100),它可能不被支持。

例二:

错误

[2023-11-02 22:58:19] [HY000][1273] Unknown collation: 'utf8mb4_0900_ai_ci'

[2023-11-02 22:58:19] [HY000][1273] Unknown collation: 'utf8mb4_0900_ai_ci'

原因

未知的排序规则(collation)'utf8mb4_0900_ai_ci'。

这个错误通常出现在 MySQL 版本中,不支持或不识别特定的排序规则。在 MySQL 8.0 之前的版本中,通常使用的 utf8mb4 字符集的默认排序规则是 'utf8mb4_general_ci',而不是 'utf8mb4_0900_ai_ci'。

解决方法

同上条,删除了本机的Mysql数据库,然后使用Docker部署了新版本的Mysql数据库就解决了问题。

3.在部署Nginx时需要使用80端口,和Apache HTTP 服务器发生端口冲突

问题

在使用docker run -d --name nginx -p 80:80 nginx准备进行Nginx容器创建时,发生报错:

[root@localhost docker]# docker run -d --name nginx -p 80:80 nginx
2b0240a1672b8299d03a256fd9c241a3c9fe8bc993cfb2bfef618a47fe0a7283
docker: Error response from daemon: driver failed programming external connectivity on endpoint nginx (a9ddf8564f84136fcc96d40aeb9fe64e2cbfff5c11d6f70bcf4cbd5fd65857bc): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use.

解决方法

通过lsof -i命令得知目前占用80端口的是Apache HTTP 服务器,我们这里并不使用,所以接下来选择直接杀死进程。

[root@localhost docker]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 6869 root 4u IPv6 56084 0t0 TCP *:http (LISTEN)
httpd 8591 apache 4u IPv6 56084 0t0 TCP *:http (LISTEN)
httpd 8592 apache 4u IPv6 56084 0t0 TCP *:http (LISTEN)
httpd 8593 apache 4u IPv6 56084 0t0 TCP *:http (LISTEN)
httpd 8594 apache 4u IPv6 56084 0t0 TCP *:http (LISTEN)
httpd 8595 apache 4u IPv6 56084 0t0 TCP *:http (LISTEN)

使用fuser -k 80/tcp杀死进程,再进行容器创建即可。

4.未将Mysql,Nginx,hmall(Java项目即应用程序)连接到同一桥接网络(bridge)导致错误

问题

在访问 (虚拟机IP地址):80/search/list?pageNo=1&pageSize=5时,

返回的并不是数据而是{"code":500,"msg":"服务器内部异常","data":null}

解决方式

1.首先查看java项目运行日志

使用docker logs -f hmall进行追踪,发现关键错误如下:

Caused by: java.net.UnknownHostException: mysql
at java.base/java.net.InetAddress$CachedAddresses.get(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName0(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(Unknown Source) ~[na:na]
at java.base/java.net.InetAddress.getAllByName(Unknown Source) ~[na:na]
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:132) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
... 95 common frames omitted

解析:

这个错误是 MySQL 客户端无法解析主机名 "mysql",因此无法连接到 MySQL 服务器。

联想到我们在java项目中的配置。

这里并不是使用实际ip地址,而是灵活使用我们定义的host名,具体的定义根据dev寻找到application-dev.yaml文件。

application-dev.yaml文件内容如下:

这里使用的host名为容器名,即mysql,所以java项目在连接数据库时,定是应该先将容器名转化为实际的ip地址,然后进行连接。

2.定位错误原因



这里注意到只有在同一个自定义网络中的容器,才可以通过别名互相访问,我这里并没有设置别名,用的就是默认的容器名。

具体错误的原因是什么呢?我是同时看黑马视频和文档进行学习的,中间学习mysql部署和java项目部署隔了一段时间,mysql部署时跟的是文档来的,接入了hmall桥接网络中。而在后面部署hmall(java项目)时,跟的是视频来的,接入了heima桥接网络中,二者并不在同一桥接网络中,导致无法互相通过容器名访问。

3.解决方法

将hmall从heima桥接网络中断开连接,连接至hmall桥接网络即可。

docker network disconnect heima hmall
docker network disconnect hmall hmall

5.重新启动虚拟机后,虽启动docker内所有容器,但是mysql服务实际上未启动

问题

重新启动虚拟机后,进行测试,发现无法正常打开网页?

追踪java日志得知关键错误所在: Connection refused(数据库拒绝连接)

        at java.base/java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(Unknown Source) ~[na:na]
at java.base/java.net.Socket.connect(Unknown Source) ~[na:na]
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155) ~[mysql-connector-java-8.0.23.jar!/:8.0.23]
... 95 common frames omitted

解决

这里数据库拒绝连接有多种可能:

  1. MySQL 服务器未运行:请确保 MySQL 服务器已正确启动。您可以使用 docker ps 命令检查是否存在运行中的 MySQL 容器。

  2. MySQL 服务器端口不正确:如果 MySQL 服务器在容器内运行,确保您的应用程序的数据库连接配置中的端口与 MySQL 服务器的端口匹配。默认情况下,MySQL 使用 3306 端口。

  3. 防火墙问题:如果 MySQL 服务器运行在不同的主机上,确保防火墙允许应用程序服务器连接到 MySQL 服务器的端口。

  4. 网络配置错误:确保应用程序容器与 MySQL 容器连接到相同的 Docker 网络。在您的 docker run 命令中,您可以使用 --network 选项指定网络,以确保容器可以互相通信。

  5. MySQL 凭证问题:检查应用程序的数据库连接配置,包括主机名、端口、用户名和密码,确保它们正确。

    但由于之前测试成功,所以可以排除后面几种可能,应当就是未开启mysql

那么便进入容器中启动即可

(进入容器)docker exec -it mysql bash
(开启数据库)mysqld

这里有一个小问题,就是 MySQL 8.0 版本引入了更严格的安全性控制,不再允许将 MySQL 服务器以 root 用户身份运行。(经实际测试,数据库还是成功启动的)。但是有需要的话,即可以以其他身份用户运行数据库即可。

2023-11-03T10:37:09.997056Z 0 [ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
2023-11-03T10:37:09.997153Z 0 [ERROR] [MY-010119] [Server] Aborting
2023-11-03T10:37:10.555109Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.27) MySQL Community Server - GPL.

使用Docker部署java项目时遇到的几个错误的更多相关文章

  1. docker 部署 java 项目

    Docker Docker官方网址: https://docs.docker.com/  英文地址 Docker中文网址: http://www.docker.org.cn/ 中文地址 Docker是 ...

  2. 使用docker部署java项目

    在接触了docker后,干什么都想用docker来弄.最近刚做完毕业设计,本来是说将项目简单在本地部署就行了,结果老师说如果部署在服务器的话有加加分,于是果断用docker来搞,多加点分. java项 ...

  3. 通过Docker部署Java项目的日志输出到宿主机指定目录

    之前写过2篇关于Docker部署的文章: 1.超!超!超简单,Linux安装Docker 2.Docker通过阿里云镜像仓库使用Gitlab_CI部署SpringBoot项目 用上篇博客部署Java程 ...

  4. jenkins+docker部署java项目

    jenkins + maven + jdk + docker + docker register + dockerfile jenkins插件 # 安装插件 SSH # 配置 系统设置-> SS ...

  5. 手把手docker部署java应用(初级篇)

    本篇原创发布于 Flex 的个人博客:点击跳转 前言   在没有 docker 前,项目转测试是比较麻烦的一件事.首先会化较长的时间搭建测试环境,然后在测试过程中又经常出现测试说是 bug,开发说无法 ...

  6. Docker网络配置、Docker部署分布式项目

    目标 1.Docker网络配置 2.Docker部署SpringCloud项目 Docker网络配置 Docker网络模式介绍 Docker在创建容器时有四种网络模式:bridge/host/cont ...

  7. tomcat部署java项目

    tomcat部署java项目 1.启动tomcat 进入到tomcat安装目录下的bin #cd /opt/tomcat/bin #./startup.sh // 执行重启命令 2.重建一个新目录导入 ...

  8. windows一键部署java项目

    windows一键部署java项目 因为公司需求,要在windows的环境上做一键部署启动java项目,同时还要支持从安装界面动态修改配置文件的IP地址.就像安装软件一样将jdk,tomcat,mys ...

  9. jenkins部署java项目,脚本文件放在远程仓库中 和jar一起打包(六)

    jenkins部署java项目到远程linux上,脚本文件和项目一起上传到gogs上,直接执行gogs上的脚本文件来执行项目 (1)新建maven项目 pom.xml的配置 <project x ...

  10. 通过Jenkins部署java项目

    部署java项目-创建私有仓库 Jenkins大多数情况下都是用来部署Java项目,Java项目有一个特点是需要编译和打包的,一般情况下编译和打包都是用maven完成,所以系统环境中需要安装maven ...

随机推荐

  1. 华企盾DSC造成扫描仪无法扫描成pdf文件

    解决方法:去掉缩略图策略,重启电脑

  2. Cesium最简单的视效升级方案,无需修改代码即可实现

    Cesium依靠其开源免费的特点基本上完全垄断了GIS这一块,并且其中99%的用户都是使用的CesiumJS,然而,对于一些使用Cesium的项目来说,要想升级视效可能需要进行繁琐的代码修改,增加了开 ...

  3. int和String的相互转换

  4. Pikachu漏洞靶场 Sql Inject(SQL注入)

    SQLi 哦,SQL注入漏洞,可怕的漏洞. 文章目录 SQLi 数字型注入(post) 字符型注入(get) 搜索型注入 xx型注入 "insert/update"注入 inser ...

  5. 劫持 PE 文件:新建节表并插入指定 DLL 文件

    PE格式简介 PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe.dll.vxd.sys和vdm等)的标准文件格式.PE格式衍生于早期建立在VAX(R) ...

  6. CIDR技术划分和计算

    CIDR:无类域间路由 由于早期的IP地址的划分会浪费太多的IP地址,所以,现在都是用CIDR表示法,为此引入了子网掩码的概念,即网络位的个数可以任意指定.该方法兼容早期的IP划分方法. CIDR表示 ...

  7. 使用XDT提高开发效率

    使用XDT提高开发效率 XDT介绍 XDT(XML Document Transformation)技术是一种用于对XML文档进行转换的技术.它通常用于在部署或配置过程中,根据不同的环境或条件自动修改 ...

  8. SQL Server系列:系统函数之日期和时间函数

    1.current_timestamp :获取数据库系统时间戳 --获取数据库系统时间戳 select current_timestamp go 2.getdate() :获取数据库系统时间戳 --获 ...

  9. PC端和移动端应用的开发差异

    PC端和移动端应用的开发差异主要体现在用户界面(UI)和用户体验(UX)设计.交互设计.性能优化.适配策略等方面.  

  10. 基于ModelArts进行流感患者密接排查

    摘要:针对疫情期间存在的排查实时性差.排查效率低.无法追踪密接者等问题,可以使用基于YOLOv4的行人检测.行人距离估计.多目标跟踪的方案进行解决. 本文分享自华为云社区<基于ModelArts ...