1、准备springboot Demo代码
- 就一个controller层代码,返回当前时间及hello world
2、项目根目录下,新建DockerFile文件
- 注意,等本地配置完毕后,Dockerfile文件需要与项目helloworld同级,这里先放项目里面
3、docker hub找mevn的linux镜像名称
官网地址:http://hub.docker.com
我打不开官网,用了这个:
Docker Maven镜像tag
4、编写DockerFile
- 注意:执行Dockerfile时,该文件必须与项目helloworld在同一级目录
#请把DokcerFile 放至helloworld同级目录
#来源的基础镜像,这里不需要单独FROM JDK,因为maven镜像里面附带了JDK
FROM maven:alpine
#作者
LABEL authors="shuizhu"#指定环境变量url为/usr/helloworld
ENV url /usr/helloworld#指定容器的工作目录
WORKDIR ${url}#复制helloworld下的所有文件到镜像中的/usr/helloworld目录中
COPY helloworld /usr/helloworld#把maven镜像中的maven配置文件settings.xml,替换为自己的settings.xml,为了加快下载
COPY helloworld/settings.xml /usr/share/maven/conf/settings.xml#MVN 打包
RUN ["mvn","package"]#执行java -jar启动命令
ENTRYPOINT ["java", "-jar","target/helloworld-0.0.1-SNAPSHOT.jar"]
5、Dockerfile使用的参数详解
RUN
- 镜像构建时,执行的命令,会生成新镜像层,一般用于:yum安装源、MVN构建、下载或配置,chmod授权
CMD
- 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么CMD不会执行
- 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后)
ENTRYPOINT
- 容器启动时执行的命令,若容器run时(docker run),附带有启动参数,那么参数会拼接到ENTRYPOINT后面
RUN、CMD、ENTRYPOINT总结
1> dockerfile存在多个CMD或ENTRYPOINT时,只会执行最后一个CMD或ENTRYPOINT
2> RUN可以存在多个,且都会执行
3> 当CMD与ENTRYPOINT共存时,CMD会当做参数,传递给ENTRYPOINT(相当于字符串,拼接到ENTRYPOINT后),因此,不需要变动的参数我们一般写到ENTRYPOINT中,需要变动的参数一般写到CMD中,传递给ENTRYPOINT
4> 当docker run时附带有启动参数,那么CMD不会执行,且启动参数会附带在ENTRYPOINT后面
5> 三种语法相同:
- 方式一:RUN ["值1","值2",...] ,推荐使用这种方式,该方式会被解析为JSON数组,必须使用双引号
- 方式二:RUN 值1 值2 ....
COPY
- 语法:COPY 目录或普通文件 路径
- 当COPY的为目录时,不会复制目录本身,只会复制其内容
ADD
- 语法:ADD 目录或普通文件/压缩文件等特殊文件/链接 路径
- 压缩文件CPOY后,镜像内会自动解压
- 当为目录时,不会复制目录本身,只会复制其内容
COPY 与ADD总结
- docker都是根据上下文去构建容器的,因此第一个参数不能出现../(容器会找不到),可以出现 ./ 表示当前目录
- ADD是COPY的增强版
6、复制项目文件到linux
把项目文件helloworld上传到服务器任意目录
7、移动Dockerfile
网上的教程都是直接上传jar文件的,Dockerfile里面直接去执行jar即可
我这需要对springboot项目进行打包,再运行,这个操作都是在docker容器中进行的,而Dockerfile在项目中,而我没办法在dockerfile COPY时去操作上层目录helloworld,因此我在构建镜像前,把Dockerfile移到helloworld同一目录。
如下:
8、构建镜像
- 需要确保helloworld文件中有settings.xml文件,否则镜像构建时,会使用默认maven下载链接,构建会很久甚至失败
在Dockerfile目录中,执行:
docker build -t mydemo:v1.0 .
-t:tag标签,对构建的镜像打标签,格式:镜像名称:版本
ps:RUN ["mvn" , "package"]:RUN是在镜像构建时执行的,因此在构建时,package动作会很久,正常的云环境中,这一步骤一般是交给jenkins实现的
构建用了201s,大部分时间花费在maven打包上,而且这还是在使用阿里maven仓库的基础上.....
9、查看构成成功的镜像
docker images
10、启动镜像
docker run -d -p 8080:8080 --name helloworld mydemo:v1.0
-d:后台运行
-p 8080:8080:docker容器中的8080端口与宿主机的8080端口映射
--name helloworld:给启动的镜像容器命名为helloworld
mydemo:v1.0:需要启动的镜像是哪个
执行后,使用 docker ps 查看正在运行的容器
11、查看镜像启动日志
docker logs helloworld
得知:镜像启动时(docker run),执行了Dockerfile中的ENTRYPOINT命令,去启动了springboot项目
12、访问镜像
- 我们springboot项目存在一个/hello接口
- 需确保linux开放了8080端口,否则外部访问不到
- 我这里使用的是腾讯云云服务器,直接通过 http://ip:8080/hello 访问即可
如下:
访问成功