以我本地的eureka项目为例进行部署:
打包为:JAR
新建一个自己觉得好看的文件夹,将该JAR文件移动到该文件夹下备孕:
进入到该文件夹下,编写Dockerfile文件:
vim Dockerfile
# Docker image for family-eureka-1.0.0-SNAPSHOT file run
# VERSION 1.0.0-SNAPSHOT
# Author: hirsi
# 基础镜像使用java8
FROM java:8
# VOLUME 指定了临时文件目录为/tmp。
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为eureka.jar
ADD family-eureka-1.0.0-SNAPSHOT.jar eureka.jar
# 运行jar包
RUN bash -c 'touch /eureka.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/eureka.jar"]
VOLUME
可实现挂载功能,可以将内地文件夹或者其他容器种得文件夹挂在到这个容器种
语法为:
VOLUME ["/data"]
说明:
["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的
VOLUME ["/var/log/"]
VOLUME /var/log
VOLUME /var/log /var/db
一般的使用场景为需要持久化存储数据时
容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。
所以当数据需要持久化时用这个命令。
ENTRYPOINT
功能是启动时的默认命令
语法如下:
1. ENTRYPOINT ["executable", "param1", "param2"]
2. ENTRYPOINT command param1 param2
部署文件
在服务器新建一个docker文件夹,将maven打包好的jar包和Dockerfile文件复制到服务器的docker文件夹下 ,最后有个. 意思为在当前文件夹下:
docker build -t family-eureka-1.0.0-SNAPSHOT .
注意命名:
解决方法:
出现该问题的原因是docker镜像命名错误:存在大写字母。
docker build -t family-eureka-1.0.0 .
制作完成后通过docker images命令查看我们制作的镜像:
docker run -d -p 7070:7070 family-eureka-1.0.0
-d参数是让容器后台运行
-p 是做端口映射,此时将服务器中的7070端口(: 前面)映射到容器中的7070(项目中端口配置的是7070: 后面)端口
运行报错:No main manifest attribute.
在docker run时通过查看日志看到如此错误,需要设置goal-repackage属性为true,否则打包后文件依赖文件没有一起打包,然后镜像内没有可以运行的程序文件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!-- 指定该Main Class为全局的唯一入口 -->
<mainClass>com.EurekaApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<!--可以把依赖的包都打包到生成的Jar包中-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
重新打包,将新的打包文件替换并重新生成镜像:
查询刚才生成的镜像,并停止它:
docker ps -n 2
docker stop 53bf66af9bff
为防止混淆,删除镜像:
docker rm 53bf66af9bff
进入dockerFile文件夹,重新生成镜像
因为镜像包含操作系统完整的 root
文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。 镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。 分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
可以复用的就不用再次下载
,编译很快
docker build -t family-eureka-1.0.0 .
查看日志:成功了呀!!!
访问网站
直接浏览器访问: http://localhost:7070/