首页 > 编程语言 >使用Docker部署java项目时遇到的几个错误

使用Docker部署java项目时遇到的几个错误

时间:2023-11-03 18:46:19浏览次数:97  
标签:hmall java 80 部署 MySQL mysql Docker docker

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
image

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
若显示为空即可
image

4.查找mysql相关目录

find / -name mysql
image

5.删除相关目录

rm -rf ...
image

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文件。
image

application-dev.yaml文件内容如下:
这里使用的host名为容器名,即mysql,所以java项目在连接数据库时,定是应该先将容器名转化为实际的ip地址,然后进行连接。
image

2.定位错误原因

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

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

3.解决方法

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

docker network disconnect heima hmall
docker network disconnect hmall hmall

标签:hmall,java,80,部署,MySQL,mysql,Docker,docker
From: https://www.cnblogs.com/trmbh12/p/17808189.html

相关文章

  • 如何获取URL参数使用jQuery或纯JavaScript?
    内容来自DOChttps://q.houxu6.top/?s=如何获取URL参数使用jQuery或纯JavaScript?我看过很多jQuery示例,其中参数的大小和名称是未知的。我的URL只会有一个字符串:http://example.com?sent=yes我只想检测:sent是否存在?它是否等于"yes"?最佳解决方案这里。vargetUrlPar......
  • Java八股面试整理(3)
    21.说一说hashCode()和equals()的关系hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定:如果两个对象相等,则它们必须有相同的哈希码。如果两个对象有相同的哈希码,则它们未必相等。22.为什么要重写hashCode()和equals()?Object类提供的equ......
  • docker数据卷挂载
    挂载映射:dockerrun-p[外部映射端口]:[容器服务端口]--name[容器名]\>-v外部地址:容器内部\>-e环境\>-d镜像:版本 -p3306:3306:指定宿主机端口与容器端口映射关系--namemysql:创建的容器名称--restart=always:总是跟随docker启动--privileged=true:获取宿......
  • java判断按键是否按下
    Java判断按键是否按下的实现1.简介在Java中,可以使用java.awt.event.KeyEvent类来判断按键是否按下。本文将为刚入行的小白介绍如何实现Java判断按键是否按下的方法。2.实现步骤以下是实现Java判断按键是否按下的步骤:步骤 描述步骤1 创建一个KeyListener对象步骤2 实现KeyList......
  • prometheus docker部署安装
    prometheusprometheusdocker部署安装之前用docker-compose部署过一套自动注册的prometheus,也用k8s的operator部署过一套,详情见promethues栏的文档。时隔许久,今天在自己虚拟机部署一套promethues玩玩准备工作准备三台虚拟机,规格均为1C2G20G,因为是自己玩,所以对性能啥的不要......
  • java获得之前的时间, 时间的减法运算实现
    //方法一SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");StringmaxDateStr="2018-01-01";StringminDateStr="";Calendarcalc=Calendar.getInstance();try{......
  • haproxy+keepalived部署高可用k8s集群
    四台机器节点名称节点ip节点角色基础配置1、升级机器内核2、将机器ip名称写入到/etc/hosts中3、基础环境准备#关闭防火墙,selinuxsystemctlstopfirewalldsystemctldisablefirewalldsed-i's/enforcing/disabled/'/etc/selinux/configsetenforce0##关闭swaps......
  • Ubuntu系统下安装Dockers
    1、更新系统软件包在安装Docker前,首先需要更新系统软件包,确保系统上的软件都是最新的版本。可以使用以下命令来更新系统:sudoaptupdatesudoaptupgrade2、安装DockerCEDocker提供了不同版本的安装包,分为社区版(CommunityEdition,简称CE)和企业版(EnterpriseEdi......
  • RKE2 部署K8S1.28.x 高可用集群
    标签(空格分隔):kubernetes系列一:RKE2的介绍k8s官方部署安装集群的是使用kubeadm方式,但是该方式比较复杂繁琐,所以产生了一些新的部署安装集群方式,比如k3s和rke2等新方式k3s有着非常庞大的社区支持,部署安装也非常简单,设计为轻量级的k8s,可以很好的运行在物联网设备或者边缘计算......
  • Centos7安装Docker
    在CentOS7上安装Docker需要以下步骤:更新系统:使用以下命令更新CentOS系统,确保已经安装了最新的软件包和依赖项。sudoyumupdate安装Docker依赖项:Docker运行需要一些依赖项,使用以下命令安装这些依赖项。sudoyuminstall-yyum-utilsdevice-mapper-persistent-da......