本篇文章给大家谈谈docker的学习笔记(二)-部署一个springboot项目,以及docker如何部署springboot项目的知识点,同时本文还将给你拓展20分钟学会Docker部署Spring
本篇文章给大家谈谈docker 的学习笔记 (二)- 部署一个 springboot 项目,以及docker如何部署springboot项目的知识点,同时本文还将给你拓展20 分钟学会 Docker 部署 SpringBoot 项目、docker - 部署一个复杂的springboot服务、Docker 部署 SpringBoot 项目、Docker 部署Springboot 项目等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- docker 的学习笔记 (二)- 部署一个 springboot 项目(docker如何部署springboot项目)
- 20 分钟学会 Docker 部署 SpringBoot 项目
- docker - 部署一个复杂的springboot服务
- Docker 部署 SpringBoot 项目
- Docker 部署Springboot 项目
docker 的学习笔记 (二)- 部署一个 springboot 项目(docker如何部署springboot项目)
部署一个 springboot 项目
1. 在 dockerHub 上面拉取镜像
docker pull jetty
2. 运行容器
docker run --name dems -v /opt/data:/tmp -p 8080:8080 -v /etc/localtime:/etc/localtime -d java java -jar -Duser.timezone=Asia/Shanghai /tmp/demo.jar
注释:--name 容器名称
-v /opt/data 项目 jar 放的位置
-p 端口映射 8080 映射到服务器的 8080 端口 -p 80:8080 表示将容器的 8080 端口映射到主机的 80 端口
3. 查看日志
docker logs -f --tail=100 容器名
4. 若果报错,可以删除之前的容器,重新开始
docker rm 容器名称
5. 可以查找一些镜像
docker search 镜像名称
6. 访问项目
20 分钟学会 Docker 部署 SpringBoot 项目
我们的开源博客项目 eblog 已经更新完毕了。今天,我们使用 docker 的安装方式,来安装一下我们的项目,实验环境是 centos 7 系统上,本实验适用部署大部分 Springboot 项目。
eblog 项目地址:
https://github.com/MarkerHub/eblog
安装 docker
#安装
yum install docker
#检验安装是否成功
[root@localhost opt]# docker --version
Docker version 1.13.1, build 7f2769b/1.13.1
#启动
systemctl start docker
#换镜像源
sudo vim /etc/docker/daemon.json
内容如下:
{
"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
}
保存退出,重启docker
#重启
systemctl restart docker
安装 redis
首先上 dockerHub 搜索 redis,点击进入详情页之后,拉到下面就可以看到 how to use,如果需要选择特定的版本,有 Supported tags 给我们选择,然后如果拉取最新的版本的话,拉倒下面就教程。
- https://hub.docker.com/_/redis
#拉取redis的镜像
docker pull redis
#查看本地redis镜像
docker images
#运行redis
docker run --name myredis -p 6379:6379 -d redis redis-server --appendonly yes
- docker run 表示运行的意思
- --name myredis 表示起个名字叫 myredis
- -p 6379:6379 表示把服务器的 6379 映射到 docker 的 6379 端口,这样就可以通过服务器的端口访问 docker 的端口
- -d 表示以后台服务形式运行 redis
- redis redis-server --appendonly yes 表示开启持久化缓存模式,可以存到硬盘
安装 mysql
- https://hub.docker.com/_/mysql
MYSQL_ROOT_PASSWORD=admin 表示 root 的初始密码
mysql:5.7.27 表示操作的是 mysql 的 5.7.27 版本,没有后面的版本号的话,默认是拉取最新版本的 mysql。
docker pull mysql:5.7.27
docker run --name mymysql -e MYSQL_ROOT_PASSWORD=admin -d -p 3306:3306 mysql:5.7.27
连上 mysql,创建数据库 eblog,然后把数据库脚本导入进去。 脚本位置:https://github.com/MarkerHub/eblog/blob/master/eblog.sql
安装 RabbitMq
一行命令搞定,注意 RABBITMQ_DEFAULT_PASS=password 是设置密码的意思哈。
docker run -d --hostname my-rabbit --name myrabbit -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
安装 ElasticSearch
docker 安装 Elasticsearch6.4.3 版本 及中文插件安装。
系统配置
不配置的话,可能会启动失败
具体报错:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]。
解决:
- sudo sysctl -w vm.max_map_count=262144
启动 ES
- docker run -p 9200:9200 -p 9300:9300 -d --name es_643 elasticsearch:6.4.3
进入镜像
- docker exec -it es_643 /bin/bash
es 配置文件位置: /usr/share/elasticsearch/config/elasticsearch.yml
安装中文分词插件
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.3/elasticsearch-analysis-ik-6.4.3.zip
退出并重启镜像
- exit
- docker restart es_643
构建 eblog 的 docker 镜像
接下来,我们需要先去 clone eblog 博客项目,对项目进行打包成 jar 包。
clone https://github.com/MarkerHub/eblog.git
cd eblog
# 打包
mvn clean package -Dmaven.test.skip=true
然后把项目 eblog-0.0.1-SNAPSHOT.jar 包上传到服务器中 同 eblog-0.0.1-SNAPSHOT.jar 的目录,创建一个名称为 Dockerfile 文件。
内容如下:
- Dockerfile
FROM java:8
EXPOSE 8080
VOLUME /tmp
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime && echo "{TZ}" > /etc/timezone
ADD eblog-0.0.1-SNAPSHOT.jar /app.jar
RUN bash -c ''touch /app.jar''
ENTRYPOINT ["java","-jar","/app.jar"]
- FROM java:8 表示基于 jdk8 环境
- EXPOSE 8080 表示对外暴露的端口是 8080
-
- VOLUME /tmp 表示挂载到 /tmp 目录
- ADD eblog-0.0.1-SNAPSHOT.jar/app.jar 表示把 jar 包复制到镜像服务里面的根目录,并改名称 app.jar
- RUN bash -c ''touch /app.jar'' 表示执行创建 app.jar
- ENTRYPOINT ["java","-jar","/app.jar"] 表示执行启动命令 java -jar
接下来,我们安装 Dockrfile 的命令,把 eblog-0.0.1-SNAPSHOT.jar 构建成 docker 的镜像。
#构建镜像,注意后面有个点哈。
docker build -t eblog .
#查看镜像
docker images
这步骤完成之后,我们就可以在准备工作就已经完成啦,接下来,我们就直接启动我们的项目哈。
启动 eblog 项目
启动命令如下:
docker run -p 8080:8080 -p 9326:9326 --name eblog --link es_643:ees --link myrabbit:erabbit --link mymysql:emysql --link myredis:eredis -d eblog
-p 8080:8080 -p 9326:9326 :9326 是因为即时聊天需要用到的 ws 端口 --link es:ees 表示关联容器,把容器 es 起别名为 ees
查看 eblog 打印日志
docker logs -f eblog
这时候我们查看就可以通过 8080 端口访问我们的项目了!!!
到此项目运行成功!!
yum -y install lrzsz
systemctl status firewalld.service
docker 迁移后,还需要启动的
docker run -p 8080:8080 -d myblog
docker - 部署一个复杂的springboot服务
在文章 docker容器网络 - 同一个host下的容器间通信 中,我们已经了解怎么在同一个host中容器间互相通信,本文将会利用学会的知识,部署一个“复杂”的springboot应用。该应用实现一个计数服务,springboot应用暴露服务接口,通过redis实现计数功能。该应用在docker里的部署图如下图所示:
我们先看下应用的代码,初步了解下应用提供什么服务。
在配置文件中配置了一个redis。redis地址将会在容器启动的时候通过设置环境变量修改
spring.application.name=springboot-redis
server.port=8080
logging.file=app.log
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
应用通过rest的方式提供了计数的服务
@Autowired
private RedisTemplate redisTemplate;
@RequestMapping("/count")
public Long count() {
ValueOperations<String, Long> valueOperations = redisTemplate.opsForValue();
Long next = valueOperations.increment("counter", 1);
System.out.println("get next counter, value=" + next);
return next;
}
要成功部署该服务,共需要三步:1、创建网络;2、部署redis;3、部署app。
创建网络
为了能够通过容器名访问其它容器,这里需要创建一个bridge网络,名字为my_bridge
[root@localhost data]# docker network create --driver bridge my_bridge
6067b2b842be2daf748bd8300eff2d63cbb9cb15746a4fd540621010e684daf6
部署redis
redis的官方镜像可以在 链接 中查看,里面有详细的配置信息和启动说明。本文将会采用redis 4.0.11版本。
(1) 拉取redis镜像
docker pull redis:4.0.11
(2)运行redis容器
[root@localhost data]# docker run --name redis --network my_bridge -v /data/redis:/data -d redis:4.0.11 redis-server --appendonly yes
68334422af05dba03d87ec1dafbc1dc0bb85302389b0e7f04722405f80074d95
- --name:容器名为redis
- --network:redis容器连接到my_bridge网络
- -v:redis的持久化数据默认存放在容器的/data目录,这里把/data目录映射到宿主主机的/data/redis数据卷中
- -d:后台运行
- --appendonly yes:redis数据持久化
(3)验证redis是否运行正常
因为redis容器在启动的时候没有暴露端口到宿主主机,所以我们需要进入到redis容器中,并通过redis-cli操作redis验证是否正常工作。
交互方式进入容器:
[root@localhost data]# docker exec -it redis bash
root@68334422af05:/data#
运行redis-cli客户端,与redis交互
root@68334422af05:/# redis-cli
127.0.0.1:6379> set 123 123
OK
127.0.0.1:6379> get 123
"123"
OK,redis运行正常。
部署应用
springboot-redis的dockerfile如下,如果对dockerfile不熟悉,可以通过 构建一个简单的docker镜像 、 Dockerfile常用指令、 dockerfile构建一个简单的springboot应用镜像 熟悉。
FROM openjdk:8u181-jdk-alpine
ARG workdir=/app
VOLUME ${workdir}
WORKDIR ${workdir}
ADD springboot-redis-1.0.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
创建springboot-redis:1.0镜像
[root@localhost springboot-redis]# docker build -t springboot-redis:1.0 .
Sending build context to Docker daemon 25.47MB
Step 1/7 : FROM openjdk:8u181-jdk-alpine
---> 97bc1352afde
Step 2/7 : ARG workdir=/app
---> Running in 65e48ea3ccf6
Removing intermediate container 65e48ea3ccf6
---> 15ef3bac3e17
Step 3/7 : VOLUME ${workdir}
---> Running in 0b5421f1827d
Removing intermediate container 0b5421f1827d
---> ce5e62a86355
Step 4/7 : WORKDIR ${workdir}
Removing intermediate container 9009b9ac08e6
---> 2e50c02c2f88
Step 5/7 : ADD springboot-redis-1.0.jar app.jar
---> 20e46c2d3b76
Step 6/7 : EXPOSE 8080
---> Running in c58cf2d973ee
Removing intermediate container c58cf2d973ee
---> bc5cb5e87d27
Step 7/7 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
---> Running in b66b3e2ecf6e
Removing intermediate container b66b3e2ecf6e
---> 05de26e57ed3
Successfully built 05de26e57ed3
Successfully tagged springboot-redis:1.0
运行springboot-redis容器。
[root@localhost ~]# docker run -p 8080:8080 -d --name springboot-redis --network my_bridge --env spring.redis.host=redis springboot-redis:1.0
因为设置了容器的网络是前面定义的my_bridge,所以在springboot-redis容器中,可以通过redis容器名访问到容器。所以,可以通过--env参数设置redis的地址是 redis 。
通过下面的命令可以实时查看日志输出
[root@localhost ~]# docker logs -f springboot-redis
在浏览器上验证一下服务是否正常。192.168.88.30是我的宿主机IP。
总结
有时,一个应用需要很多个服务同时部署,如果都按照上面的方式进行部署,将是一个很吃力的事情。那么,有什么样的方式可以简化我们的部署呢?docker-compose是docker官方提供的服务编排工具,通过docker-compose脚本可以批量启动我们的服务。
文章收录于:
容器技术系列汇总
Docker 部署 SpringBoot 项目
Spring Boot 项目代码
首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署。
-
在 pom.xml 中添加 SpringBoot 依赖,并添加 Web 支持。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-parent</artifactId> <version>2.2.0.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
-
创建 启动类 并添加 Controller ,这里为了方便写在一起,其中有一个 Hello 方法,访问时返回 Hello Docker。
/** * @author Arley * data:2020/1/30 * desc:Docker中部署springboot项目 */ @RestController @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, "--server.port=8888"); } @GetMapping("/hello") public String Hello() { return "Hello Docker"; } }
添加完成之后,启动项目,访问 http://127.0.0.1:8888/hello
,页面返回 Hello Docker
,说明项目配置正常。
在 SpringBoot 中添加 Docker 支持
-
在 pom.xml 中添加 Docker 镜像支持:
<!-- Docker 镜像前缀名 --> <properties> <docker.image.prefix>springboot</docker.image.prefix> </properties>
-
plugins 中添加 Docker 构建插件:
<build> <plugins> <!-- 添加这个是因为我启动项目时遇到个问题(jar中没有主清单属性) 添加下面这个插件即可--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.arley.Application</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <!-- Dockerfile 文件存放目录 --> <dockerDirectory>src/main/resources/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <!-- jar包所在目录,缺省为target --> <directory>${project.build.directory}</directory> <!-- jar包名,缺省为 ${project.artifactId}-${project.version} --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin> <!-- Docker maven plugin --> </plugins> </build>
创建 Dockerfile 文件
在目录 src/main/resources/docker 下创建 Dockerfile 文件,Dockerfile 文件来说明如何构建镜像
-
Dockerfile 文件内容:
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD boot-docker-1.0-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
参数说明:
FROM openjdk:8-jdk-alpine
: 使用 JDK8 环境作为基础镜像VOLUME /tmp
: 在宿主机的 /var/lib/docker 目录下创建一个临时文件并把它链接到 tomcat 容器的工作目 录 /tmp 目录ADD boot-docker-1.0-SNAPSHOT.jar app.jar
: 复制文件并且重命名。boot-docker-1.0-SNAPSHOT.jar
为你的 SpringBoot 项目达成的 jar 包名。ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
:为了缩短 Tomcat 的启动时间,添加 java.security.egd 的系统属性指向 /dev/urandom 作为 ENTRYPOINT。
环境搭建
-
首先安装 Docker ,可以看我之前的教程
<a href="https://www.cnblogs.com/leizzige/p/12183038.html" target="_blank">https://www.cnblogs.com/leizzige/p/12183038.html</a>
-
安装 Jdk
yum -y install java-1.8.0-openjdk*;
配置环境变量:
打开
vim /etc/profile
,添加以下内容 :export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export PATH=$PATH:$JAVA_HOME/bin
修改完成之后,使其生效:
source /etc/profile
,输入java -version
返回版本信息则安装正常。 -
安装 Maven
maven 下载地址
解压:
tar -zxvf apache-maven-3.5.2-bin.tar.gz
移动:mv apache-maven-3.5.2 /usr/local/maven
修改环境变量, 在 /etc/profile 中添加以下几行:
MAVEN_HOME=/usr/local/maven export MAVEN_HOME export PATH=${PATH}:${MAVEN_HOME}/bin
记得执行
source /etc/profile
使环境变量生效。输入mvn -version
返回版本信息则安装正常。 这样整个构建环境就配置完成了。
使用 Docker 部署 Spring Boot 项目
将我们写好的 SpringBoot 项目复制到服务器中,进入项目的 pom 文件所在目录下进行打包测试。
-
打包:
mvn clean compile package
,启动 :java -jar target/xxx-jar
-
看到 Spring Boot 的启动日志后表明环境配置没有问题。 使用 DockerFile 构建镜像 :
mvn package docker:build
-
第一次构建,看到以下内容表示构建成功了:
- 使用 docker images 命令查看构建好的镜像:
springboot/boot-docker 就是我们构建好的镜像,下一步运行该镜像:
docker run -itd -p 8888:8888 --name spring-boot-docker e879d41f3a71
启动完成之后 docker ps
查看正在运行的容器,可以看到我们构建的 spring-boot-docker
容器正在运行,
访问浏览器 http:http://47.98.161.xxx:8888/hello
,返回 Hello Docker。
使用 Docker 部署 SpringBoot 项目成功!!!!
项目地址 :<a href="https://github.com/CrazyArley/springboot" target="_blank">https://github.com/CrazyArley/springboot</a>
Docker 部署Springboot 项目
Docker 环境部署参照:https://www.cnblogs.com/oneMr/p/14200760.html
简单 Springboot 项目
新建一个 Springboot 项目,写一个简单的Controller
@RestController public class HelloController { @RequestMapping("/") public String hello() { return "Hello Docker"; } }
在 pom 文件中添加 Docker 镜像名称
<properties> <java.version>1.8</java.version> <docker.image.prefix>docker</docker.image.prefix> </properties>
plugins 中添加 Docker 构建插件:
<build> <plugins> <!--Docker 插件--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <!-- Docker maven plugin --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <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> <!-- Docker maven plugin --> </plugins> </build>
在 src/main/docker 下创建 Dockerfile 文件(无后缀名),地址即为插件中的 <dockerDirectory>
Dockerfile 文件内容(ADD 后对应自己的 jar 包名称):
# 添加 Java 8 镜像来源 FROM java:8 VOLUME /tmp # 添加 Spring Boot 包 ADD docker-1.0.jar /app.jar # 执行启动命令 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
完成后打包项目
使用 Docker 部署 Spring Boot 项目
将 jar 包和 Dockerfile 上传到服务器的同一个文件夹下
输入命令构建镜像(helloworld 为镜像名,注意后面有个点表示当前目录)
docker build -t helloworld .
查看镜像:
docker images
运行镜像:
docker run -d -p 8081:8080 --name helloworld helloworld
查看正在运行的镜像:
docker ps
访问地址 ip:8081/
关于docker 的学习笔记 (二)- 部署一个 springboot 项目和docker如何部署springboot项目的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于20 分钟学会 Docker 部署 SpringBoot 项目、docker - 部署一个复杂的springboot服务、Docker 部署 SpringBoot 项目、Docker 部署Springboot 项目等相关内容,可以在本站寻找。
本文标签: