目录
一、前置知识
1.镜像结构
2.Dockerfile是什么
二、自定义一个 java 项目镜像
1.创建一个空目录,在这个空目录中创建一个文件,命名为 DockerFile,最后将 java 项目打包成 jar 包,放到这个目录中
2.编写 Dockerfile 文件
3.使用 docker build 构建为一个镜像
4.使用 docker run 运行镜像
一、前置知识
1.镜像结构
我们知道镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成,那么它的层次结构是怎么的呢?
镜像是分层结构,每一层称为一个Layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其它层:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
2.Dockerfile是什么
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
以下参考官网文档(只是列举了一些常用的)
Dockerfile reference | Docker DocumentationFind all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.https://docs.docker.com/engine/reference/builder
指令 | 说明 | 示例 |
FROM | 指定基础镜像(Dockerfile 第一行必须是 FROM,从基础镜像来构建,基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine) | FROM centos:7 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./mysql-5.7.rpm /tmp |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
二、自定义一个 java 项目镜像
1.创建一个空目录,在这个空目录中创建一个文件,命名为 DockerFile,最后将 java 项目打包成 jar 包,放到这个目录中
2.编写 Dockerfile 文件
主要编写以下信息:
- 基于 java:8-alpine 作为基础镜像
- 将 app.jar 拷贝到镜像中
- 暴露端口
- 编写入口 ENTRYPOINT
Ps:Dockerfile的第一行必须是FROM;从一个基础镜像来构建基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
# 指定基础镜像
FROM java:8-alpine
# 拷贝 java 项目包
COPY ./docker-demo.jar /tmp/app.jar
# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
3.使用 docker build 构建为一个镜像
参数说明:
- -t 表示设置镜像名和版本号(自定义)
- . 表示 Dockerfile 所在目录,因为刚刚我是将 Dockerfile 放在了当前文件目录下,所以就用 . 来表示当前目录
通过 docker images 就可以看到刚刚构建好的镜像
4.使用 docker run 运行镜像
这时候你就可以根据服务器 IP 和自己配置的镜像映射端口号以及项目地址就可以访问了~
注意:如果需要访问,别忘了开放云服务器的端口号的防火墙哦~
Ps:最后也可以使用 docker push 发布镜像(DockerHub、阿里云镜像仓库)