下面将介绍如何使用dockerfile
来构建自己的java项目
Docker镜像是分层的,每一条指令就是一层。熟悉docker的人会知道docker镜像的定制实际上就是定制每一层所添加的配置、文件。Dockerfile 是一个用于创建docker镜像的文本文件,使用规定的语法格式写出一条条指令,docker会按照该指令一步步的构建,即Dockerfile是一种构建镜像的脚本。
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY
指令将从构建上下文目录中 <源路径>
的文件/目录复制到新的一层的镜像内的 <目标路径>
位置。比如:
COPY test.conf /usr/local/
格式:
COPY [--chown=:] <源路径>... <目标路径>
COPY [--chown=:] ["<源路径1>",... "<目标路径>"]
其中源路径可以是多个,甚至通配符:
COPY hom* /mydir/
COPY hom?.txt /mydir/
使用COPY
命令时,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。同时也可以添加--chown=
选项来改变文件的所属用户及所属组:
COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/
ADD
命令的格式、作用与COPY
保持一致,ADD
新增的特性如下:
使用场景:虽然ADD
具备比COPY
更复杂的功能,但也不推荐使用ADD
,因为其行为不一定清晰,并且构建速度缓慢。所以一般只有在需要自动解压缩的场景才使用。
Docker 不是虚拟机,而容器就是进程。既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD
指令就是用于指定默认的容器主进程的启动命令的。
CMD
指令的格式和 RUN
相似,格式为:
shell
格式:CMD <命令>
exec
格式:CMD ["可执行文件", "参数1", "参数2"...]
CMD ["参数1", "参数2"...]
。在指定了 ENTRYPOINT
指令后,用 CMD
指定具体的参数ENTRYPOINT
的目的和 CMD
一样,都是在指定容器启动程序及参数。ENTRYPOINT
在运行时也可以替代,不过比 CMD
要略显繁琐,需要通过 docker run
的参数 --entrypoint
来指定。
当指定了 ENTRYPOINT
后,CMD
的含义就发生了改变,不再是直接的运行其命令,而是将 CMD
的内容作为参数传给 ENTRYPOINT
指令,换句话说实际执行时,将变为:
<ENTRYPOINT> ""
具体格式:
该命令的作用就是设置镜像运行所需要的环境变量,格式为:
ENV
ENV = =...
构建参数和 ENV
的效果一样,都是设置环境变量。所不同的是,ARG
所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG
保存密码之类的信息,因为 docker history
还是可以看到所有值的。
格式为:ARG <参数名>[=<默认值>]
Dockerfile
中的 ARG
指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build
中用 --build-arg <参数名>=<值>
来覆盖。
容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中,后面的章节我们会进一步介绍 Docker 卷的概念。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile
中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
格式为:
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
声明运行容器时可以映射的端口,并不会实际在物理机上映射这个端口。
格式为:EXPOSE <端口1> [<端口2>…]
使用 WORKDIR
指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR
会帮你建立目录。
格式: WORKDIR <工作目录路径>
**注意:**在构建的时候不要使用cd
命令切换目录,在docker中每一层都属于不同的执行环境,属于不同进程,使用cd
不能达到切换目录的作用。因此如果需要改变目录,请使用WORKDIR
命令
USER
指令和 WORKDIR
相似,都是改变环境状态并影响以后的层。WORKDIR
是改变工作目录,USER
则是改变之后层的执行 RUN
, CMD
以及 ENTRYPOINT
这类命令的身份。
格式:USER <用户名>[:<用户组>]
= =
标题是要将自己的java项目构建为镜像,所以需要一个具备java环境的镜像来作为基础镜像,在docker官网上有openjdk
、OracleJava
的镜像,使用docker pull命令可拉取到本地。如果要使用OracleJava需要注册账号并授权。
官方的安装说明如下:
在从Docker Store中提取此映像之前,需要确保Docker客户端已使用以下docker login
命令成功登录:
# docker login
Username:
Password:
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
首先先准备一个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