docker训练-使用dockerfile构建自己的java项目

构建镜像的方式

  • export 导出一个容器:docker export –o mynginx.tar mynginx1
  • commit 从容器创建一个新的镜像:docker commit –a “yql” –m “my nginx” mynginx1 mynginx:v1
  • 使用dockerifle构建

下面将介绍如何使用dockerfile来构建自己的java项目

dockerfile介绍

Docker镜像是分层的,每一条指令就是一层。熟悉docker的人会知道docker镜像的定制实际上就是定制每一层所添加的配置、文件。Dockerfile 是一个用于创建docker镜像的文本文件,使用规定的语法格式写出一条条指令,docker会按照该指令一步步的构建,即Dockerfile是一种构建镜像的脚本。

常用指令

RUN命令
  • shell格式为: RUN <命令>,就像直接在命令行中输入的命令一样
  • 示例:RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • Exec格式为: RUN [“可执行文件”, “参数1”, “参数2”] 。
  • RUN [“apt-get”,“install”,“ngixn”]
  • 为了减少镜像的层数,应该尽可能将RUN指令写成一行,使用 &&符号连接
COPY 复制文件

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:

COPY test.conf /usr/local/

格式:

  • COPY [--chown=<user>:<group>] <源路径>... <目标路径>
  • COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

其中源路径可以是多个,甚至通配符:

COPY hom* /mydir/
COPY hom?.txt /mydir/

使用COPY命令时,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。同时也可以添加--chown=<user>:<group>选项来改变文件的所属用户及所属组:

COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/
ADD复制文件

ADD命令的格式、作用与COPY保持一致,ADD新增的特性如下:

  • ADD过来的压缩包可以在目标路径自动解压
  • 原始路径可以是一个链接,ADD过程会从该链接下载所需的文件到目标目录
  • ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢

使用场景:虽然ADD具备比COPY更复杂的功能,但也不推荐使用ADD,因为其行为不一定清晰,并且构建速度缓慢。所以一般只有在需要自动解压缩的场景才使用。

CMD容器命令

Docker 不是虚拟机,而容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器主进程的启动命令的。

CMD 指令的格式和 RUN 相似,格式为:

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
  • 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数
ENTRYPOINT 入口点

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。

当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:

<ENTRYPOINT> "<CMD>"

具体格式:

  • ENTRYPOINT < command >
  • ENTRYPOINT ["","","",…]
ENV 设置环境变量

该命令的作用就是设置镜像运行所需要的环境变量,格式为:

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>...
ARG 构建参数

构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。

格式为:ARG <参数名>[=<默认值>]

Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。

VOLUME 定义匿名卷

容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

格式为:

  • VOLUME ["<路径1>", "<路径2>"...]
  • VOLUME <路径>
EXPOSE 声明端口

声明运行容器时可以映射的端口,并不会实际在物理机上映射这个端口。

格式为:EXPOSE <端口1> [<端口2>…]

FROM指令
  • 格式为 FROM 或 FROM :
  • 第一条指令必须是FROM指令
  • FROM scratch 表示以空白镜像为基础
WORKDIR 指定工作目录

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。

格式: WORKDIR <工作目录路径>

**注意:**在构建的时候不要使用cd命令切换目录,在docker中每一层都属于不同的执行环境,属于不同进程,使用cd不能达到切换目录的作用。因此如果需要改变目录,请使用WORKDIR命令

USER 指定当前用户

USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。

格式:USER <用户名>[:<用户组>]

LABEL指令
  • 格式为 LABEL<key>=<value> <key>=<value>
  • LABEL会继承基础镜像的LABEL,key值相同时就覆盖

准备java镜像

标题是要将自己的java项目构建为镜像,所以需要一个具备java环境的镜像来作为基础镜像,在docker官网上有openjdkOracleJava的镜像,使用docker pull命令可拉取到本地。如果要使用OracleJava需要注册账号并授权。

官方的安装说明如下:

在从Docker Store中提取此映像之前,需要确保Docker客户端已使用以下docker login命令成功登录:

# docker login
Username: <docker>
Password: <docker>
Login successful.

成功登录后,您可以从Docker Store中提取Oracle Server JRE映像:

docker pull store/oracle/serverjre:8

详细请访问:https://hub.docker.com/u/jarome/content/sub-8171e9d6-c48f-4337-8816-4126f2c085a7

编写dockerfile脚本

首先先准备一个springboot导出的jar。然后新建目录,目录结构如下:

|.dockerignore
|Dockerfile
|image-sign.jar
|logs

.dockerignore内容如下:

logs/

Dockerfilen内容如下:

FROM store/oracle/serverjre:8
COPY image-sign.jar /usr/local/jarome/image-sign/
VOLUME ["/usr/logal/jarome/image-sign/logs"]
WORKDIR /usr/local/jarome/image-sign
ENTRYPOINT ["java","-jar","image-sign.jar"]

构建镜像:docker build -t image-sign:1 .

docker build 格式:docker build -t 镜像名称:版本 上下文目录

镜像构建完成,使用docker images查看镜像,使用run命令运行镜像:

$ docker images 
REPOSITORY TAG     IMAGE ID    CREATED       SIZE
image-sign  1   3529f6c02a42    16       seconds ago      303MB
docker run -itd -p 9466:9466 -v ~/develop/docker/image-sign/logs:/usr/logal/jarome/image-sign/logs image-sign:1
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐