镜像结构
镜像本质上是一个包含应用程序及其运行所需的系统函数库,运行配置,运行环境等文件的单元。
docker会将不同层次的文件分为多个部分 他们就叫做层(Layers)
例如一个java应用的部署可以分为
- 启动程序的脚本
- 程序压缩而成的jar包
- JRE相关以及环境变量
- 启动需要依赖的系统函数库 如Linux中CentOS和Ubuntu
最底层的层次叫做基础镜像 一般存放应用依赖的系统函数库、环境、配置、文件等。
最顶层的层次叫做入口 指的是镜像的运行入口 一般来说是启动程序的脚本和参数
分层带来的优势是:
-
便于后期对函数库等文件进行优化
-
若两个镜像具有相同的基础运行环境,docker不会再次重复安装 大幅度减少容器安装所需的体积
自定义镜像
Dockerfile
可以理解成是一个媒介,通过写在Dockerfile中的每一条指令,来描述并告诉docker,说明构建镜像时所要进行的操作。
常见指令如下:
指令名字 | 指令作用 |
---|---|
FROM | 基础镜像 |
ENV | 设定环境变量 |
RUN | 运行cmd命令 |
COPY | 拷贝文件 可以是拷贝jar包 可以是拷贝其他组件 |
ENTRYPOINT | 设定程序入口 |
WORKDIR | 指定工作目录 |
例子
#基础镜像
FROM openjdk:11.0-jre-buster I
#设定环境变量(时区)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/STZ /etc/localtime &echo $TZ /etc/timezone
#指定工作目录为app包
WORKDIR /app
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口
ENTRYPOINT ["java","-jar","/app.jar"]
ps:还有很多docker相关的命令在官网当中,见https://docs.docker.com/build/building/packaging/
在确定好DockerFile后 就可以在控制台根据此文件创建镜像了
docker build -t demo-jar:1.0 .
# 即
docker build -t repositories:tags path
-t
指定镜像的名字和版本号,如果不写版本号则默认最新latest
.
指定Dockerfile和jar包的相对路径 .
则代表两者同级
构建完成之后,就可以使用docker images
查看构建好的镜像