之前我们用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:
1 | <groupId>com.aphysia</groupId> |
复制
除此之外还需要配置插件:
1 | <build> |
复制
除此之外,Dockerfile是必要的,上面的插件中已经配置了我们dockerFile需要放在<dockerDirectory>src/main/docker</dockerDirectory>这个位置,DockerFile里面配置如下:
1 | FROM openjdk:8-jdk-alpine |
复制
理论上到这个时候,我们使用mvn clean package就会生成对应的jar包:

docker compose最重要的是配置docker-compose.yml,这个文件我们放在项目的根目录就可以,和pom.xml平级:
1 | version: "3" |
值得注意的点:
service里面就是我们配置的镜像,包含了redis,mysql,webapp,webapp其实就是我们的应用。
"6389:6379"中6389其实是我们主机的端口,也就是我的Mac连接redis容器需要使用6389,而容器之间连接需要使用6379,这是容器的端口。
/tmp/redis.conf:/etc/redis/redis.conf中/tmp/redis.conf是主机的目录,而这个目录需要在docker里面配置才可以,要不就会报错(执行记得加管理员权限):
1 | docker ERROR: * start service *: Mounts denied |
复制

1 | mysql` 8.0 可能会报错`java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed`,这个是因为`url`链接少了一个参数:`allowPublicKeyRetrieval=true |
启动可能出现的坑点
启动后可能链接不上mysql或者redis,但是看容器运行情况又是正常的:
1 | DockerCompose % docker container ps |
执行docker-compose up 没有报错,请求的时候报错:
1 | io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: /127.0.0.1:6379 |
这是因为容器之间的请求不能用127.0.0.1,必须用mysql,redis代表容器的网络,比如:jdbc:mysql://mysql:3306/test?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
完整的application.yml:
1 | server: |
还有一个问题,就是docker-compose.yml里面配置的镜像名字一定要对,要不docker-compose up执行的时候,就会出现:
1 | Pulling xxxx... |
我还以为是登录的原因,本来是本地镜像,应该直接create而不是pull,如果不知道名字,可以通过以下命令查看,REPOSITORY就是名字:
1 | DockerCompose % docker images |
最后启动命令:
1 | sudo docker-compose up |
复制
成功启动:

启动之后记得初始化一下数据库数据表!!!
1 | drop database IF EXISTS test; |
复制

至此,大功告成,看似简单的命令,其实还是有不少坑点。