docker-compose部署项目(mysql连接失败)
1.内容概要
主要是想要记录一下部署项目的流程,所以项目涉及内容比较简单,另外,因为初学遇到了很多问题,想记录一下关于mysql出现的问题
docker-compose的核心功能
-
统一配置与管理
通过docker-compose.yml文件集中定义多个容器的参数(如镜像、端口映射、环境变量等),无需逐个手动启动容器,一键完成所有服务的创建、启动、停止等操作。 -
网络自动互联
自动为容器创建独立的桥接网络,使同一项目的容器可通过服务名(而非 IP)直接通信,无需手动配置网络规则。 -
依赖关系处理
支持通过depends_on定义容器启动顺序,确保依赖服务(如数据库)先于应用服务启动,避免运行错误。 -
数据持久化协调
可统一配置数据卷(volumes),让多个容器共享或独立存储数据,并保证容器重启后数据不丢失。
2.流程
2.1 创建项目目录 mkdir -p 目录名
[root@xq101 ~]# mkdir docker_mysql
[root@xq101 ~]# cd docker_mysql/
2.2将项目打成jar包

2.3 用filezilla上传jar包到项目目录

2.3 编写docker-compose.yml文件
[root@xq101 docker_mysql]# vim docker-compose.yml
进入后按照自己的项目要求编写内容,注意一定要注意yml文件的格式,我写的时候内容正确,但不知道哪里缩进错了,也会报错
1)确保所有列表项(如 ports、volumes 等)使用相同的缩进(通常是2个空格)
2)每个连字符 - 后面应该有一个空格
下面是我写的,可以参考流程
关于depends_on一定要拉取相关镜像

version: "3"
services:
microService:
image: account_docker:1.1
container_name: account
ports:
- "7001:7001"
volumes:
- /app/microService:/data
networks:
- myMode
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'mydocker'
MYSQL_USER: 'root'
MYSQL_PASSWORD: '123456'
ports:
- "3307:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- myMode
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
myMode:
2.4 编写Dockerfile
[root@xq101 docker_mysql]# vim Dockerfile
我的内容
这里From后面的镜像为项目的基础镜像,在执行后面命令前一定要拉取这个基础镜像
这里的jdk17是因为的maven项目是基于jdk17的
# 基础镜像使用java
FROM eclipse-temurin:17-jdk
# 作者
MAINTAINER huan
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器
的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为docker_compose_t1-1.0-SNAPSHOT.jar
ADD docker_compose_t1-1.0-SNAPSHOT.jar account_docker.jar
# 运行jar包
RUN bash -c 'touch /account_docker.jar'
ENTRYPOINT ["java","-jar","/account_docker.jar"]
#暴露7001端口作为微服务
EXPOSE 7001
以上流程执行完之后,应有如下目录

2.5 构建镜像
执行docker build -t 镜像名称:版本 空格 .
docker build -t account_docker:1.1 .
2.6 启动docker-compose服务
[root@xq101 docker_mysql]# docker-compose up -d
启动成功应有
[root@xq101 docker_mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1ad65c8f4159 account_docker:1.1 "java -jar /account_…" 10 minutes ago Up 10 minutes 0.0.0.0:7001->7001/tcp, :::7001->7001/tcp account
591be67db0e6 mysql:5.7 "docker-entrypoint.s…" 10 minutes ago Up 10 minutes 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp docker_mysql_mysql_1_538feea5fe8b
查看服务访问的url:宿主机ip:暴露端口/项目指定服务路径
我的访问的路径如下
3.关于mysql的错误
以下都是我犯的错,大家可以参考,若还有其他错误,恳请指正orz
我是启动项目后,到浏览器访问,才发现的错误
然后用docker logs 容器名(account)查找的错误
3.1端口占用
原因:我有其他的mysql容器实例是运行的,而且用了相同的宿主机端口映射3306
ERROR: for docker_mysql_mysql_1_891131b6ba00 Cannot start service mysql: driver failed programming external connectivity on endpoint docker_mysql_mysql_1_d99c30890b2b (1f8e4dcd6982f724a3c249b436f1db10e84e33b9229bf5d3560db7d758daa7c1): Bind for 0.0.0.0:3307 failed: port is already allocated
解决
使用docker rm -f 对应容器名称
docker-compose down 清理之前的失败容器(如果存在)
docker-compose up -d 重新启动服务
3.2 mysql连接失败
主要原因就是连接数据库的url写错了
如果是按照2.2中配置写的话,不会有问题,那个是已经修正的
原因:我一开始写的项目在本地运行,就是用的宿主机的端口3307,但是打成jar包前应该改成mysql容器名:容器内端口号(也就是3307),我忘记了,所以这里就连接失败了 /(ㄒoㄒ)/~~
025-07-27 10:33:58.721 ERROR 1 --- [eate-1487230025] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://mysql:3307/mydocker? useUnicode=true&characterEncoding=utf-8&useSSL=false, errorCode 0, state 08S01
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
解决
更改成正确的端口映射 ,再重新上传到项目目录
3.3 重复报错的url
按理讲,我改掉了项目的原内容,所以我重新打包并上传了,之后又重新执行了docker-compose up -d不会有问题啊
后面问了deepseek 说是未重新构建镜像或未重启容器
2025-07-27 10:34:53.296 ERROR 1 --- [eate-1487230025] com.alibaba.druid.pool.DruidDataSource : create connection SQLException, url: jdbc:mysql://mysql:3307/mydocker? useUnicode=true&characterEncoding=utf-8&useSSL=false, errorCode 0, state 08S01
解决
先停掉docker-compose服务

删除Dockerfile生成的镜像,重新构建后,再次启动docker-compose服务

道且长,
目录
不转弯,就为一片海,越万山
更多推荐


所有评论(0)