如何用Docker Compose部署项目?
前言
之前我们用docker
部署了springboot
,redis
,mysql
的项目,但是是部署在三个不同的容器里,还需要先知道redis
和mysql
的ip
地址,手动配置到springboot
应用容器里,我只是想快速在本地进行测试啊,这样成本太高了,有没有什么办法,把他们集中管理呢?比如把它构建成为一个镜像。
办法总是有的,那就是Docker Compose
。
之前的项目地址:https://github.com/Damaer/DemoCode/tree/main/springboot/springDocker
Docker Compose
1. Docker Compose是什么?
Docker Compose
其实就是用来定义和运行复杂应用的Docker
工具,什么叫复杂应用,比如前面写的springboot
+redis
+mysql
,里面就有三个容器,这种多个容器的,用一个工具来管理,它不香么?
docker compose 通过配置文件来管理多个
Docker
容器,在配置文件中,所有的容器通过service
来进行定义,然后使用docker-compose
脚本来启动、停止、重启应用以及应用中的服务和所依赖的容器等。
2. Docker Compose 的具体步骤
一般是三个步骤:
- 使用
Dockerfile
来定义应用程序的环境 - 在
docker-compose.yml
定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 - 执行
docker-compose up
命令来启动并运行整个应用程序。
我使用的是Mac OS
,装Docker
的时候已经把Docker Compose
也安装好了,不需要单独安装。
3. 如何在IDEA项目里面使用Docker Compose
首先pom.xml
文件中需要注意配置小写的artifactId
:
除此之外还需要配置插件:
除此之外,Dockerfile
是必要的,上面的插件中已经配置了我们dockerFile
需要放在<dockerDirectory>src/main/docker</dockerDirectory>
这个位置,DockerFile
里面配置如下:
理论上到这个时候,我们使用mvn clean package
就会生成对应的jar
包:
docker compose
最重要的是配置docker-compose.yml
,这个文件我们放在项目的根目录就可以,和pom.xml
平级:
值得注意的点:
-
service里面就是我们配置的镜像,包含了
redis
,mysql
,webapp
,webapp
其实就是我们的应用。 -
"6389:6379"
中6389
其实是我们主机的端口,也就是我的Mac
连接redis
容器需要使用6389
,而容器之间连接需要使用6379
,这是容器的端口。 -
/tmp/redis.conf:/etc/redis/redis.conf
中/tmp/redis.conf
是主机的目录,而这个目录需要在docker里面配置才可以,要不就会报错(执行记得加管理员权限): -
mysql
8.0 可能会报错java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
,这个是因为url
链接少了一个参数:allowPublicKeyRetrieval=true
启动可能出现的坑点
启动后可能链接不上mysql
或者redis
,但是看容器运行情况又是正常的:
执行docker-compose up
没有报错,请求的时候报错:
这是因为容器之间的请求不能用127.0.0.1
,必须用mysql
,redis
代表容器的网络,比如:jdbc:mysql://mysql:3306/test?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
完整的application.yml
:
还有一个问题,就是docker-compose.yml
里面配置的镜像名字一定要对,要不docker-compose up
执行的时候,就会出现:
我还以为是登录的原因,本来是本地镜像,应该直接create
而不是pull
,如果不知道名字,可以通过以下命令查看,REPOSITORY
就是名字:
最后启动命令:
成功启动:
启动之后记得初始化一下数据库数据表!!!
至此,大功告成,看似简单的命令,其实还是有不少坑点。
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析
,JDBC
,Mybatis
,Spring
,redis
,分布式
,剑指Offer
,LeetCode
等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
__EOF__

本文链接:https://www.cnblogs.com/Damaer/p/15713848.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库