无快不破,在本地 docker 运行 IDEA 里面的项目?
前言
之前我们用docker部署了springboot,redis,mysql的项目,但是是部署在三个不同的容器里,还需要先知道redis和mysql的ip地址,手动配置到springboot应用容器里,我只是想快速在本地进行测试啊,这样成本太高了,有没有什么办法,把他们集中管理呢?比如把它构建成为一个镜像。
办法总是有的,那就是Docker Compose。
之前的项目地址:https://github.com/Damaer/DemoCode/tree/main/springboot/springDocker
上一篇:http://aphysia.cn/archives/ru-he-ji-yu-dockerkuai-su-da-jian-springbootmysqlredisxiang-mu-
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:
<groupId>com.aphysia</groupId>
<artifactId>dockerdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dockerdemo</name>
<packaging>jar</packaging>
除此之外还需要配置插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!-- 将插件绑定在某个phase执行 -->
<executions>
<execution>
<id>build-image</id>
<!-- 用户只需执行mvn package ,就会自动执行mvn docker:build -->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<dockerDirectory>src/main/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
除此之外,Dockerfile是必要的,上面的插件中已经配置了我们dockerFile需要放在<dockerDirectory>src/main/docker</dockerDirectory>这个位置,DockerFile里面配置如下:
FROM openjdk:8-jdk-alpine
EXPOSE 8081
VOLUME /tmp
# 重写命名为app.jar
ADD dockerdemo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
理论上到这个时候,我们使用mvn clean package就会生成对应的jar包:

docker compose最重要的是配置docker-compose.yml,这个文件我们放在项目的根目录就可以,和pom.xml平级:
version: "3"
services:
redis:
image: redis:latest
restart: always
ports:
- "6389:6379"
volumes:
- /tmp/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_USER: 'root'
MYSQL_PASS: '123456'
ports:
- "3306:3306"
volumes:
- "./db:/var/lib/mysql"
- "./conf/my.cnf:/etc/my.cnf"
- "./init:/docker-entrypoint-initdb.d/"
# 指定服务名称
webapp:
# 指定服务使用的镜像
image: aphysia/dockerdemo
# 指定容器名称
container_name: dockerdemo
# 指定服务运行的端口
ports:
- 8081:8081
# 指定容器中需要挂载的文件
volumes:
- /etc/localtime:/etc/localtime
- /tmp/dockerdemo/logs:/var/logs
值得注意的点:
service里面就是我们配置的镜像,包含了
redis,mysql,webapp,webapp其实就是我们的应用。"6389:6379"中6389其实是我们主机的端口,也就是我的Mac连接redis容器需要使用6389,而容器之间连接需要使用6379,这是容器的端口。/tmp/redis.conf:/etc/redis/redis.conf中/tmp/redis.conf是主机的目录,而这个目录需要在docker里面配置才可以,要不就会报错(执行记得加管理员权限):docker ERROR: * start service *: Mounts denied

mysql8.0 可能会报错java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed,这个是因为url链接少了一个参数:allowPublicKeyRetrieval=true
启动可能出现的坑点
启动后可能链接不上mysql或者redis,但是看容器运行情况又是正常的:
DockerCompose % docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32fd6ce598ba aphysia/dockerdemo "java -jar /app.jar" 7 minutes ago Up 7 minutes 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp dockerdemo
585b9b6bd71d redis:latest "docker-entrypoint.s…" 10 minutes ago Up 7 minutes 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp dockercompose_redis_1
d96ba57941d9 mysql:latest "docker-entrypoint.s…" 16 minutes ago Up 7 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp dockercompose_mysql_1
执行docker-compose up 没有报错,请求的时候报错:
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:
server:
port: 8081
spring:
#数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/test?characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: redis ## redis所在的服务器IP
port: 6379
##密码,我这里没有设置,所以不填
password:
## 设置最大连接数,0为无限
pool:
max-active: 8
min-idle: 0
max-idle: 8
max-wait: -1
#mybatis的相关配置
mybatis:
#mapper配置文件
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.aphysia.springdocker.model
#开启驼峰命名
configuration:
map-underscore-to-camel-case: true
logging:
level:
root: debug
还有一个问题,就是docker-compose.yml里面配置的镜像名字一定要对,要不docker-compose up执行的时候,就会出现:
Pulling xxxx...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.
Continue with the new image? [yN]y
Pulling xxxx...
ERROR: pull access denied for postgresql, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
我还以为是登录的原因,本来是本地镜像,应该直接create而不是pull,如果不知道名字,可以通过以下命令查看,REPOSITORY就是名字:
DockerCompose % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
aphysia/dockerdemo latest 1429aa26790a 54 minutes ago 137MB
<none> <none> ceb493583d7c 57 minutes ago 137MB
<none> <none> dffcc47602a2 About an hour ago 137MB
<none> <none> a695cf2cd2df About an hour ago 137MB
<none> <none> 209ce4f96d34 2 hours ago 137MB
redis latest 40c68ed3a4d2 10 days ago 113MB
mysql latest e1d7dc9731da 14 months ago 544MB
openjdk 8-jdk-alpine a3562aa0b991 2 years ago 105MB
最后启动命令:
sudo docker-compose up
成功启动:

启动之后记得初始化一下数据库数据表!!!
drop database IF EXISTS test;
CREATE DATABASE test;
use test;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT "",
`age` int(11) DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES (1, '李四', 11);
INSERT INTO `user` VALUES (2, '王五', 11);

至此,大功告成,看似简单的命令,其实还是有不少坑点。
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人写作方向:Java源码解析,JDBC,Mybatis,Spring,redis,分布式,剑指Offer,LeetCode等,认真写好每一篇文章,不喜欢标题党,不喜欢花里胡哨,大多写系列文章,不能保证我写的都完全正确,但是我保证所写的均经过实践或者查找资料。遗漏或者错误之处,还望指正。
无快不破,在本地 docker 运行 IDEA 里面的项目?的更多相关文章
- docker 运行jenkins及vue项目与springboot项目(三.jenkins的使用及自动打包vue项目)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- docker 运行jenkins及vue项目与springboot项目(一.安装docker)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- docker 运行jenkins及vue项目与springboot项目(四.docker运行nginx)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- docker 运行jenkins及vue项目与springboot项目(五.jenkins打包springboot服务且在docker中运行)
docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...
- 天下武功,无快不破,Python开发必备的6个库
01 Python 必备之 PyPy PyPy 主要用于何处? 如果你需要更快的 Python 应用程序,最简单的实现的方法就是通过 PyPy ,Python 运行时与实时(JIT)编译器.与使用普通 ...
- 实验吧--web--天下武功唯快不破
---恢复内容开始--- 英文翻译过来嘛,就是:天下武功无快不破嘛.(出题者还是挺切题的) 看看前端源码: 注意这里 please post what you find with parameter: ...
- 本地docker镜像上传Docker Hub,并且在腾讯云上pull该镜像,最后运行成功。
1:在docker hub 上注册一个账号(本人直接能注册,有的说不能),然后创建自己的仓库. 2:登录docker hub ( longdbdocker --hub账号,longdb --仓库名称) ...
- 林帆:Docker运行GUI软件的方法
继上周的“Kubernetes v1.0特性解析”分享之后,本周我们邀请到ThoughtWorks咨询师林帆为大家带来主题为“Docker运行GUI软件的方法”的分享. 嘉宾简介:林帆,Thought ...
- Docker运行GUI软件的方法
转自 https://www.csdn.net/article/2015-07-30/2825340 简介: Docker通过namespace将容器与主机上的网络和运行环境进行了隔离,默认情况下,在 ...
随机推荐
- 有哪些让你「 爽到爆炸 」的 Windows 软件?
前言 本文源于知乎的一个提问,如标题所示:有哪些让你「 爽到爆炸 」的 Windows 软件?今天大姚给大家分享6款C#/.NET开源且免费的Windows软件,希望可以帮助大家提高学习.开发.办公效 ...
- LLog:Spring轻量级请求日志监控组件,集成管理面板,支持多条件查询检索
开源地址 https://gitee.com/lboot/LLog 简介 LLog是基于AOP构建的请求日志记录和查询工具库,通过引入该工具库,完成配置,实现对接口请求日志的记录.查询检索等功能. 请 ...
- SQL Server Aggregate Functions
SUM 如果 row count = 0 返回的是 NULL 而不是 0 哦, 如果要 0 可以使用 ISNULL 来处理 如果其中一些 row 是 NULL, 那无所谓, 它只会 SUM 数字出来 ...
- HiveServer2 文件描述符泄漏
现象 用户反馈 hs2 打开的文件描述符的数量一直在涨,但是当前 hs2 的连接只有个位数. 排查过程 首先找到 hs2 进程持有了哪些文件描述符,通过 lsof 命令 lsof -p $pid ,看 ...
- aarch64 和 ARMV8 的区别
aarch64 和 ARMv8 是紧密相关但涵义不同的术语,在解释他们的区别之前,让我们先简单理解它们各自的含义: ARMv8: ARMv8 是指 ARM 架构的第八个版本,这是由 ARM Holdi ...
- 利用3Dslice提取血管中心线
1.首先进入官网下载你需要的版本.你也可以安装老版本,我已经用红色框框出来了. 2.开始安装,等个几十秒钟就ok了. 3.当然要实现提取中心线,还需要 VMTK 这个玩意, 打开应用,找到 insta ...
- npy转换为png和nii文件
#coding:utf-8 import matplotlib.pyplot as plt import numpy as np import os from skimage.transform im ...
- Kulla-Conty BRDF
question: brdf中的几何因子考虑了微表面的自遮挡,当表面粗糙度较大或者与法线夹角越大时,这个因子越小,导致颜色越暗.这部分能量相等于直接忽略掉了,实际上被遮挡的光线会被反射,然后经过若干次 ...
- 13. 说一下$set,用在Vue2还是Vue3
$set 是 vue2 中对象用来追加响应式数据的方法 : 使用格式 : $set(对象 , 属性名 , 值 ) vue3中使用 proxy 替代了 Object.defineProperty 实现对 ...
- 云原生周刊:2023 年 Java 开发人员可以学习的 25 大技术技能
文章推荐 2023 年 Java 开发人员可以学习的 25 大技术技能 这篇文章为 Java 开发人员提供了 2023 年需要学习的一些重要技能,这些技能涵盖了现代 Java 开发.大数据和人工智能. ...