网站建设所要花费的资金,上海做网站的公司有哪些,郑州seo顾问热狗网,今天国内重大新闻事件前言
知识点整理
Dockerfile 简介
它是一个没有后缀名的文本文档#xff0c;里面是组合镜像的一些命令#xff0c;Docker build命令构建镜像时#xff0c;通过读取Dockerfile中的指令的顺序#xff08;自上到下#xff09;自动生成镜像。
Dockerfile 命令
1. FROM 指…前言
知识点整理
Dockerfile 简介
它是一个没有后缀名的文本文档里面是组合镜像的一些命令Docker build命令构建镜像时通过读取Dockerfile中的指令的顺序自上到下自动生成镜像。
Dockerfile 命令
1. FROM 指定基础镜像并且必须是第一条指令。 如果不以任何镜像为基础那么写法为FROM scratch。 同时意味着接下来所写的指令将作为镜像的第一层开始 语法
FROM image
FROM image:tag
FROM image:digest三种写法其中和 是可选项如果没有选择那么默认值为latest
2. MAINTAINER 指明镜像的归属者或维护团体/机构名称/域名 语法
MAINTAINER name示例
MAINTAINER csdn.xxx
MAINTAINER csdn
MAINTAINER csdnqq.com3. RUN 在生成镜像时需要执行的命令 Dockerfile中的RUN命令只有在docker build 命令构建镜像时会自动运行 docker run的时候并不会运行 RUN命令有两种格式
# 第一种后边直接跟shell命令
RUN command# 第二种是类似于函数调用, 可将executable理解成为可执行文件后面就是两个参数
RUN [executable, param1, param2]在linux操作系统上默认 /bin/sh -c 在windows操作系统上默认 cmd /S /C
注意多行命令不要写多个RUN原因是Dockerfile中每一个指令都会建立一层. 多少个RUN就构建了多少层镜像会造成镜像的臃肿、多层不仅仅增加了构件部署的时间还容易出错。 RUN书写时的换行符是\
4. CMD 功能为容器启动时要运行的命令 语法有三种写法
# 1. 可执行文件加上参数的形式
CMD [executable,param1,param2]
CMD [param1,param2]# 2. shell的执行方式和写法
CMD command param1 param2举例说明两种写法
CMD [ sh, -c, echo $HOME
CMD [ echo, $HOME ]补充细节这里边包括参数的一定要用双引号就是,不能是单引号。千万不能写成单引号。 原因是参数传递后docker解析的是一个JSON array
RUN vs CMD RUN是构件容器时就运行的命令以及提交运行结果 CMD是容器启动时执行的命令在构件时并不运行构件时紧紧指定了这个命令到底是个什么样子。Dockerfile中多个CMD命令只有最后一个生效 5. LABEL 功能是为镜像指定标签作为MAINTAINE的补充更为详细的一些描述信息 语法
LABEL keyvalue keyvalue keyvalue ...一个Dockerfile种可以有多个LABEL如下
LABEL com.example.vendorACME Incorporated
LABEL com.example.label-with-valuefoo
LABEL version1.0
LABEL descriptionThis text illustrates that label-values can span multiple lines.但是并不建议这样写最好就写成一行如太长需要换行的话则使用符号 如下
LABEL multi.label1value1
multi.label2value2
othervalue3说明LABEL会继承基础镜像种的LABEL如遇到key相同则值覆盖
MAINTAINER vs LABEL 增强镜像的阅读性不会对功能造成影响 6. EXPOSE 指定对外的端口。功能为暴漏容器运行时的监听端口给外部 但是EXPOSE并不会使容器访问主机的端口 如果想使得容器与主机的端口有映射关系必须在容器启动的时候加上 -P参数 7. ENV 功能为设置环境变量 简单的说它就是一个全局常量被设置后进入容器内部在任意位置都可以访问这个常量的值比如# echo $var_bl。 好比本地设置了JAVA_HOME环境变量一样在CMD窗口任意目录都可以打印/获取该常量。
语法有两种
ENV keyvalue
ENV keyvalue ...两者的区别就是第一种是一次设置一个第二种是一次设置多个
示例
ENV WORKPATH /tmp
ENV http_proxy
ENV JAVA_HOME /usr/local/openjdk8
ENV testmayun-xiaoma
ENV mycatmimiRUN $JAVA_HOME/bin/java-jar test.jar尽量使用环境常量可提高程序维护性如果JAVA_HOME需要调整为其他JDK版本那么只需要调整一处位置即可比如把/usr/local/openjdk8调整为jdk9。
注意这些环境常量可以通过docker run命令的–env 或-e参数来进行修改。
8. ADD 一个复制命令把文件复制到景象中。 如果把虚拟机与容器想象成两台linux服务器的话那么这个命令就类似于scp只是scp需要加用户名和密码的权限验证而ADD不用。 语法如下
# src (为宿主机目录)文件dest(为容器内目录)文件
ADD src... dest
ADD [src,... dest]路径的填写可以是容器内的绝对路径也可以是相对于工作目录的相对路径 可以是一个本地文件或者是一个本地压缩文件还可以是一个url 如果把写成一个url那么ADD就类似于wget命令 尽量不要把写成一个文件夹如果是一个文件夹了复制整个目录的内容,包括文件系统元数据 如以下写法都是可以的
#把hello从宿主机复制到容器内部的根路径
ADD hello /
#把压缩包从宿主机添加到容器的根目录后自动解压
ADD test.tar.gz /
#把hello文件复制到当前workdir工作目录的根目录
ADD hello .
#仅从宿主机复制文件到容器内部的指定目录
COPY test.txt /etc/nginx
#复制文件并自动解压到指定目录
ADD demo.tar.gz /usr/share/nginx/html 宿主目录默认是执行docker build时所在的宿主机目录 示例中后面的/是指容器内部根目录而 . 是容器内部的当前目录默认是WORKDIR的目录
9. COPY 复制命令 语法如下
COPY src... dest
COPY [src,... dest]ADD vs COPY
COPY 的只能是本地文件ADD可以充当wget命令添加远程文件ADD 是增强版的COPYADD自带解压COPY不带解压。两者都支持目录中有空格。
注意 ADD指令不支持认证从远程获取资源如果需要认证交互则只能使用RUN wget或RUN curl替代。如果不是需要解压优先使用COPY命令效率更高、更节省资源。 10. ENTRYPOINT 功能是启动时的默认命令 语法如下
ENTRYPOINT [executable, param1, param2]
ENTRYPOINT command param1 param2CMD vs ENTRYPOINT
相同点 只能写一条如果写了多条那么只有最后一条生效容器启动时才运行运行时机相同 不同点 ENTRYPOINT不会被运行的command覆盖而CMD则会被覆盖 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD并且CMD指令不是一个完整的可执行命令那么CMD指定的内容将会作为ENTRYPOINT的参数
如下
FROM ubuntu
ENTRYPOINT [top, -b]
CMD [-c]如果我们在Dockerfile种同时写了ENTRYPOINT和CMD并且CMD是一个完整的指令那么它们两个会互相覆盖谁在最后谁生效
如下
FROM ubuntu
ENTRYPOINT [top, -b]
CMD ls -al那么将执行ls -al ,top -b不会执行。
11. VOLUME 设置卷挂载主机目录。可实现挂载功能可以将内地文件夹或者其他容器种得文件夹挂载到这个容器中 语法为
VOLUME [/data]说明 [“/data”]可以是一个JsonArray 也可以是多个值。所以如下几种写法都是正确的
VOLUME [/var/log/]
VOLUME /var/log
VOLUME /var/log /var/db一般的使用场景为需要持久化存储数据时 容器使用的是AUFS这种文件系统不能持久化数据当容器关闭后所有的更改都会丢失。 所以当数据需要持久化时用这个命令。
12. USER 设置启动容器的用户可以是用户名或UID 只有下面的两种写法是正确的
USER daemo
USER UID注意如果设置了容器以daemon用户去运行那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行
13. WORKDIR WORKDIR 设置的目录需要是绝对路径如果不存在会自动创建。 在Dockerfile最外层首次出现则是指明通过docker exec -it 进入容器内部后默认进入的工作目录无需再用cd命令切换。 如果Dockerfile中命令比较多需要来回切换工作目录则可以随时再次定义新的WORKDIR 语法
WORKDIR /path/to/workdir设置工作目录对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建也可以设置多次。如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwdpwd执行的结果是/a/b/c
14. ARG 设置变量命令 语法
# 设置变量命令ARG命令定义了一个变量在docker build创建镜像的时候使用 --build-arg varnamevalue来指定参数
ARG name[default value]如果用户在build镜像时指定了一个参数没有定义在Dockerfile种那么将有一个Warning 提示如下 [Warning] One or more build-args [foo] were not consumed. 我们可以定义一个或多个参数如下
FROM busybox
ARG user1
ARG buildno
...也可以给参数一个默认值
FROM busybox
ARG user1someuser
ARG buildno1
...如果我们给了ARG定义的参数默认值那么当build镜像时没有指定参数值将会使用这个默认值
15. ONBUILD 这个命令只对当前镜像的子镜像生效 语法
ONBUILD [INSTRUCTION]比如当前镜像为A在Dockerfile中添加
ONBUILD RUN ls -al这个 ls -al 命令不会在A镜像构建或启动的时候执行 此时有一个镜像B是基于A镜像构建的那么这个ls -al 命令会在B镜像构建的时候被执行。
16. STOPSIGNAL 作用是当容器退出时给系统发送什么样的指令 语法
STOPSIGNAL signal17. HEALTHCHECK 容器健康状况检查命令 语法有两种
# 在容器内部运行一个命令来检查容器的健康状况
HEALTHCHECK [OPTIONS] CMD command# 在基础镜像中取消健康检查命令
HEALTHCHECK NONE[OPTIONS]的选项支持以下三中选项 intervalDURATION 两次检查默认的时间间隔为30秒timeoutDURATION 健康检查命令运行超时时长默认30秒retriesN 当连续失败指定次数后则容器被认为是不健康的状态为unhealthy默认次数是3 注意 HEALTHCHECK命令只能出现一次如果出现了多次只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功具体的返回值如下 0: success - 表示容器是健康的 1: unhealthy - 表示容器已经不能工作了 2: reserved - 保留值 例子
HEALTHCHECK --interval5m --timeout3s
CMD curl -f http://localhost/ || exit 1健康检查命令是curl -f http://localhost/ || exit 1 两次检查的间隔时间是5秒 命令超时时间为3秒
Dockerfile案例
部署JavaWeb项目 新建并编辑 Dockerfile
# 指定基于的容器镜像
FROM tomcat
# 维护者信息
MAINTAINER itstyle 12345678qq.com
# 复制项目到Tomcat指定目录
ADD test.war /usr/local/tomcat/webapps/
# 容器启动时执行指令
CMD [catalina.sh, run]构建镜像
docker build -t itstyle/tomcat .PS
文件名只能是Dockerfile不同的构建文件通过文件夹名称来区分命令最后的点 “.” 表示读取当前目录下的 Dockerfile 进行构建-t表示为当前镜像命名
运行镜像
docker run -d -p 8888:8080 -v /home/docker/web:/usr/local/tomcat/webapps --name app itstyle/tomcat在 /home/docker/web 目录下存放项目War
案例2部署SpringBoot微服务
# 基础镜像仓库是java
FROM java:8-jre
# 当前镜像的维护者和联系方式
MAINTAINER itstyle 12345678qq.com
# 挂载卷
VOLUME /tmp
# 将打包好的springBoot程序拷贝到容器中的指定位置
ADD itstyle_stats.jar /opt/app.jar
# 容器对外暴露端口
EXPOSE 8080
# 容器启动后需要执行的命令
CMD java -jar /opt/app.jar
# ENTRYPOINT [java,-jar,-DenvDEV,/opt/app.jar]知识回顾 构建镜像
# 这里的 -f 用于指定Dockerfile文件路径
docker bulid -t -f Dockerfile路径# 使用当前目录下的Dockerfile构建镜像镜像命名为 nginx:env
docker build . -t nginx:env
#启动容器
docker run -t --rm --name nginx-env nginx:env
#启动容器并进入容器内部
docker run -it --rm --name nginx-env nginx:env /bin/sh
#直接进入容器内部
docker exec -it nginx:env /bin/bash
#打印环境变量
echo $mycat
#退出容器返回宿主机
exit 本文参考链接