构建docker镜像服务之基于dockerfile

Dockerfile组成

Dockerfile是由一组命令组成的文件
Dockfile 是一种被Docker程序解释的脚本文件,Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令,Docker程序将这些Dockerfile指令翻译真正的Linux命令;Dockerfile有自己书写格式和支持的命令,Docker程序解决这些命令间的依赖关系,类似于Makefile,Docker程序将读取Dockerfile,根据指令生成定制的image。
Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为注释,每一行只支持一条连续的指令,每条指令可以携带多个参数。
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层, 因此每一条指令的内容,就是描述该层应当如何构建。

Dockerfile结构四部分

基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令

Dockerfile的注释

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#”开头的注释

Dockerfile操作指令

FROM

格式为 FROM 或 FROM :

第一条指令必须为 FROM 指令。并且,如果在同一个 Dockerfile 中创建多个阶段时,可以使用多个 FROM 指令(每个阶段一次)

MAINTAINER

格式为 MAINTAINER ,指定维护者信息。已弃用,推荐使用 LABEL

LABEL

给构建的镜像打标签。格式:LABEL = = = …

RUN

格式为 RUN 或 RUN [“executable”, “param1”, “param2”]

推荐 RUN 把所有需要执行的 shell 命令写一行

CMD

支持三种格式

CMD [“executable”,“param1”,“param2”] 使用 exec 执行,推荐方式;

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;

CMD [“param1”,“param2”] 提供给 ENTRYPOINT 的默认参数;

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。

EXPOSE

格式为 EXPOSE […]

声明 Docker 服务端容器暴露的端口号,供外部系统使用。在启动容器时需要通过 -p指定端口号

ENV

格式为 ENV 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持

ADD

格式为 格式为 ADD ,在 docker ce 17.09以上版本支持 格式为 ADD --chown=:

COPY

格式为 COPY ,在 docker ce 17.09以上版本支持 格式为 COPY --chown=:

ENTRYPOINT

支持两种格式:

ENTRYPOINT [“executable”, “param1”, “param2”]

ENTRYPOINT command param1 param2(shell中执行)

VOLUME

格式为 VOLUME ["/data"]

创建一个可以从本地主机或其它容器挂载的挂载点,用来保持数据不被销毁

USER

格式为 USER daemon

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户

容器不推荐使用 root 权限

WORKDIR

格式为 WORKDIR /path/to/workdir

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录

可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最后输出路径为 /a/b/c

ONBUILD

为他人做嫁衣,格式为 ONBUILD [INSTRUCTION]

配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

HEALTHCHECK

健康检查,格式: HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令 HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK 支持下列选项:

–interval=<间隔>:两次健康检查的间隔,默认为30秒;

–timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被 视为失败,默认30 秒;

–retries=<次数>:当连续失败指定次数后,则将容器状态视为unhealthy,默认3 次

和CMD ,ENTRYPOINT一样, HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效

ARG

构建参数,格式:ARG<参数名>[=<默认值>]

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

Dockerfile实战

Nginx镜像创建

创建文件夹

mkdir /nginx

记得上传Nginx安装包

编辑Dockerfile

vim Dockerfile
FROM centos:7
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
ADD nginx-1.12.0.tar.gz /opt/nginx
WORKDIR /opt/nginx/nginx-1.12.0
RUN ./configure \
    --prefix=/usr/local/nginx \
    --with-http_stub_status_module && make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

查看镜像

docker build -t nginx:v1 .
docker images

运行镜像

docker run -itd nginx:v1
docker ps -a

检查

在这里插入图片描述

tomcat镜像创建

创建文件夹

mkdir /opt/zzz

记得上传安装包

编写Dockerfile

FROM centos:7
WORKDIR /usr
RUN mkdir jdk tomcat
ADD jdk-8u91-linux-x64.tar.gz /usr/jdk
ADD apache-tomcat-9.0.16.tar.gz /usr/tomcat
ENV JAVA_HOME=/usr/jdk/jdk1.8.0_91
ENV CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH=$JAVA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/usr/tomcat/apache-tomcat-9.0.16/bin/startup.sh","run"]

查看镜像

docker build -t nginx:v1 .
docker images

运行镜像在容器

docker run -itd tomcat:v1
docker ps -a

检查

在这里插入图片描述

总结

dockerfile的优化

不需要的输出指令丢入/dev/null
减少RUN创建
多阶段构建

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值