【读书笔记-首页】基于世界500强的高薪实战Kubernetes课程
第4章 dockerfile基础篇-基本语法
- dockerfile :构建镜像的文本文件
1、FROM
作用:基础镜像来源
2、MAINTAINER
作用:作者信息
3、RUN
作用:构建过程中运行的命令
4、EXPOSE
作用: 申明端口
-
docker build 构建镜像时运行
-
docker run -P 时,会自动随机映射 EXPOSE 的端口。
-
可以指定多个 EXPOSE
格式:
EXPOSE <端口 1> [<端口 2>...]
5、CMD
作用:为启动的容器 指定默认要运行的程序 (会被 docker run 覆盖)
-
docker run 时运行
-
程序运行结束,容器也就结束
-
CMD 指令指定的程序可被docker run 命令行参数中指定要运行的程序所覆盖
两种模式
-
exec 模式 如:CMD ["程序名","参数1","参数2"]
-
Shell 模式 如:CMD command
6、ENTERYPOINT
作用:为启动的容器 指定默认要运行的程序 (会被 docker run --entrypoint 覆盖)
-
类似于 CMD 指令,但不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
-
docker run 时 --entrypoint 选项,将覆盖 entrypoint 指令指定的程序
-
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需参数
-
注意: Dockerfile 中多个 ENTRYPOINT 指令,仅最后一个生效
格式:
-
ENTERYPOINT ["程序名","参数1","参数2"](exec 模式)
-
ENTERYPOINT command (shell 模式)
可以搭配 CMD 命令使用:
一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参
示例:
> 假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
1、不传参运行
$ docker run nginx:test
容器内会默认运行以下命令,启动主进程。
nginx -c /etc/nginx/nginx.conf
2、传参运行 (new.conf 覆盖nginx.conf)
$ docker run nginx:test -c /etc/nginx/new.conf
容器内会默认运行以下命令,启动主进程
nginx -c /etc/nginx/new.conf
(/etc/nginx/new.conf:假设容器内已有此文件)
7、COPY
作用:复制文件或者目录到容器
格式:
-
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
-
COPY [--chown=<user>:<group>] ["<源路径>",... "<目标路径>"]
[--chown=<user>:<group>]:
可选参数,用户改变复制到容器内文件的拥有者和属组。
<源路径>:
源文件/目录,支持 Go 的 filepath.Match 通配符
例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目标路径>:
容器内的指定路径,路径不存在,会自动创建
8、ADD
作用:功能类似COPY,官方推荐使用 COPY
优点:
自动解压 为 tar<源文件> 到 <目标路径>
缺点:
在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
例:替换/usr/share/nginx 下的 index.html
Dockerfile 文件
bash
cd /root/dockerfile/test1
cat dockerfile
FROM centos
MAINTAINER xianchao
RUN yum install wget -y
RUN yum install nginx -y
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
实战:
bash
# 构建镜像,并打标签(-t <标签名> ,其中t为tag)
docker build -t="dockerfile/copy:v1" .
# 根据镜像运行容器,-d <后台运行> ,-p <容器内端口> ,--name <容器名>
docker run -d -p 80 --name html3 dockerfile/copy:v1
# 查看所有镜像 , grep <过滤名称>
docker ps | grep html3
显示如下:
bash
478868402ac4 dockerfile/copy:v1 "/usr/sbin/nginx -
g ..." 15 seconds ago Up 12 seconds 0.0.0.0:32771->80/tcp html3
访问页面
curl 192.168.40.180:32771 显示的就是替换后的页面
9、VOLUME
作用:定义匿名数据卷
-
避免重要的数据,因容器重启而丢失,这是非常致命的。
-
避免容器不断变大
-
docker run 通过 -v 参数修改挂载点
格式:
-
VOLUME ["<路径 1>", "<路径 2>"...]
-
VOLUME <路径>
10、WORKDIR
作用:指定工作目录 (必须提前创建好)(填写绝对路径)
-
用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在
-
每一个 RUN 命令都是新建的一层
-
只有通过 WORKDIR 创建的目录才会一直存在
格式:
- WORKDIR <工作目录路径>
示例
WORKDIR /path/to/workdir
11、ENV
作用:设置环境变量
格式:
-
ENV <key> <value>
-
ENV <key>=<value>...
示例
以下示例设置 NODE_VERSION =6.6.6,
在后续的指令中可以通过 $NODE_VERSION 引用: ENV NODE_VERSION 6.6.6
bash
RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz"
\
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
12、USER
作用:切换后续命令执行的用户(用户和用户组必须存在)
格式:
USER <用户名>[:<用户组>]
示例:
bash
USER daemon
USER nginx
USER user
USER uid
USER user:group
USER uid:gid
USER user:gid
USER uid:group
13、ONBUILD
作用:用于延迟构建命令的执行
Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,构建时会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
格式:
- ONBUILD <其它指令>
场景:为镜像添加触发器
当一个镜像被其他镜像作为基础镜像时需要写上 OBNBUILD ,会在构建时插入触发器指令
14、LABEL
作用:给镜像添加元数据(metadata)
格式:
- LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
bash
LABEL org.opencontainers.image.authors="lijiong"
15、HEALTHCHECK
作用:指定某个程序或者指令来监控 docker 容器服务的运行状态
格式:
-
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况
-
HEALTHCHECK NONE:屏蔽基础镜像自带的健康检查
-
HEALTHCHECK [选项] CMD <命令> : 参考 CMD 的用法
16、ARG
作用:构建参数,与 ENV 作用域不同
-
作用域:仅对 Dockerfile 内有效,即只有 docker build 中有效
-
docker build 中用 --build-arg <参数名>=<值> 来覆盖
格式:
- ARG <参数名>[=<默认值>]