docker训练-使用dockerfile构建自己的java项目
docker训练-使用dockerfile构建自己的java项目构建镜像的方式export 导出一个容器:docker export –o mynginx.tar mynginx1commit 从容器创建一个新的镜像:docker commit –a “yql” –m “my nginx” mynginx1 mynginx:v1使用dockerifle构建下面将介绍如何使用docke...
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官网上有openjdk
、OracleJava
的镜像,使用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
更多推荐
所有评论(0)