容器化你的 Spring Boot 工程——Docker
环境声明:
Gradle + Docker + Spring Boot 2.1.5.RELEASE
目的
利用docker容器技术简化项目部署
配置Docker服务(Ubuntu)
卸载旧版本docker(全新安装时,无需执行该步骤)
sudo apt-get remove docker docker-engine docker.io
更新系统软件
sudo apt-get update
安装依赖包
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
添加官方密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
如果出现‘sudo: unable to resolve host {你的主机名}’,需要编辑你的hosts文件
vim /etc/hosts
127.0.0.1 localhost
# 添加下边这行
127.0.0.1 {你的主机名}
添加仓库
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
再次更新软件
sudo apt-get update
安装
apt-get install docker-ce
修改源
vim /etc/docker/daemon.json
{ "registry-mirrors": [ "https://kv3qfp85.mirror.aliyuncs.com" ] }
开放远程 2375 端口访问
-
修改docker配置文件
vim /lib/systemd/system/docker.service
修改如下内容
#ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
- 重载配置和重启
systemctl daemon-reload
sudo service docker restart
-
查看服务
开发环境配置
idea连接远程Docker
构建镜像
- gradle配置,增加 gradle 的 Docker 插件
parent build.gradle
......
buildscript {
......
dependencies {
......
classpath('gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.19.2')
}
}
......
subprojects {
......
apply plugin: 'application'
apply plugin: 'com.palantir.docker'
......
jar {
enabled = true
}
bootJar {
classifier = 'boot'
}
}
- 编写Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD build/libs/*-boot.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
- 构建可运行jar包,打好的包在build-libs目录内*-boot.jar
为了方便查看(当然不这样做也是可以的),假设我的项目是多模块架构,项目名为 demo,现在为我的子模块model1构建和部署镜像
最下边Command preview也就是原生的Docker构建镜像的命令:
docker build -t demo/model1:v1 . && docker run -p 8061:8061 --name demo-model1-container demo/model1:v1
run it (莫慌,骚微一等)
Deploy log:
Deploying 'demo-model1-container Dockerfile: model1/Dockerfile'...
Building image...
Step 1/6 : FROM openjdk:8-jdk-alpine
---> a3562aa0b991
Step 2/6 : VOLUME /tmp
---> Using cache
---> 0ccc6c4dcc3f
Step 3/6 : ADD build/libs/*-boot.jar app.jar
---> Using cache
---> 999503a5bf26
Step 4/6 : RUN sh -c 'touch /app.jar'
---> Using cache
---> d99dd527cb5b
Step 5/6 : ENV JAVA_OPTS=""
---> Using cache
---> 468e80ce7f62
Step 6/6 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
---> Using cache
---> d8d32a964e71
Successfully built d8d32a964e71
Successfully tagged demo/model1:v1
Creating container...
Container Id: 0f91b3f38e771cb1288fb7b01451aeeef917d83f4f2fbe803a65a091684a7430
Container name: 'demo-model1-container'
Attaching to container 'demo-model1-container'...
Starting container 'demo-model1-container'
Failed to deploy 'demo-model1-container Dockerfile: data-collect-server/Dockerfile': com.github.dockerjava.api.exception.InternalServerErrorException: {"message":"driver failed programming external connectivity on endpoint demo-model1-container (10fcfb5d05feffb40b75715b531c7504a8ee7262c2af43b642d2202e9e3f4b31): Bind for 0.0.0.0:8061 failed: port is already allocated"}
启动成功,访问测试
示例项目:gradle-docker

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
浅谈lambda表达式
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。 lambda体中调用方法的参数列表和返回值类型,要和函数式接口中抽象方法的参数列表和返回值类型保持一致。 一、替代匿名内部类 lambda表达式用的最多的场合就是替代匿名内部类,实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类! package OSChina.Lambda; import org.junit.Test; import java.util.Co...
-
下一篇
MySQL——RDS下的分区表实践
实践背景 项目中有的表空间太大,且行数太多,故决定对一些表进行分库分表。再研究选型方案的时候发现常用的一些分库分表的解决方案对业务代码修改较多,故决定采用MySQL的分区方案。 其实在我个人看来,分区表就是MySQL帮我们实现了底层的分库分表,不需要涉及业务代码的修改,不需要关注分布式事务。因为就访问数据库而言,逻辑上还是只有一个表,但是实际上确有多个物理分区对象组成,会根据具体的分区规则查询具体的分区。 介绍一下这次实践的表,表空间大小172G,1亿2千万条记录。 数据库版本:RDS MySQL 5.6 工具:阿里云DTS 一、为什么分区? 优点: 对已过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据,它的效率远比DELETE高 在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率 例如下面语句: SELECT * FROM t PARTITION(p0,p1)WHERE c <5 仅选择与WHERE条件匹配的分区p0和p1中的记录 涉及聚合函数SUM()、COUNT(...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- MySQL数据库在高并发下的优化方案
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS8编译安装MySQL8.0.19
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案