上回书说到containerd的基础命令,但是containerd无法构建镜像,但dockerfile可以,所以这一节我们就来探究一下何为dockerfile?
一、什么是dockerfile
dockerfile 是一种用于定义和构建 docker 镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成;
基于dockerfile构建镜像可以使用docker build命令,使用 -f 可以指定具体的dockerfile文件;
使用dockerfile构建镜像的步骤如下:编写dockerfile文件-->docker build构建镜像-->docker run运行镜像;
二、dockerfile构建镜像过程
我们可以看看dockerfile构建镜像的过程:
1)docker从基础镜像运行一个容器,比如说centos;
2) docker执行一条RUN的指令,执行类似docker commit 的操作提交一个新的镜像层;
3)docker基于刚才提交的镜像去运行一个新的容器;
4)执行下一条指令,提交一个新的镜像层,直到所有的指令完成;
ps:编写dockerfile时,切勿编写过多无意义的指令,否则会造成镜像膨胀过大!
三、dockerfile基本构成
我们可以看一下dockerfile的基本构成:dockerfile指令 | 说明 | 示例 |
FROM | 指定基础镜像,用于后续的指令构建镜像缓存 | FROM centos |
MAINTAINER | 指定镜像的作者信息 | MAINTAINER chililopp |
LABEL | 以键值对形式添加镜像元数据 | LABEL version="1.0" |
RUN | 在当前镜像构建时要运行的命令 | RUN yum install nginx |
CMD | 指定容器docker run时运行的命令,可被覆盖 | CMD ["/usr/sbin/nginx","-g","daemon off;"] |
ENTRYPOINT | 类似于CMD,但不可被覆盖 | ENTRYPOINT ["nginx", "-c"] |
EXPOSE | 声明容器运行时监听的端口 | EXPOSE 80 |
WORKDIR | 设置后续指令的工作目录。 | WORKDIR /etc/sbin |
ENV | 设置环境变量 | ENV NODE_VERSION 6.6.6 |
ARG | 和ENG类似,但作用域仅在dockerfile有效 | ARG NODE_VERSION 6.6.6 |
USER | 指定执行后续指令的用户和用户组 | USER nginx |
ADD | 将文件或目录拷贝到镜像中,且会自动处理URL和解压tar压缩包 | ADD index.html /usr/app/nginx/html/ |
COPY | 将文件或目录拷贝到镜像中 | COPY index.html /usr/app/nginx/html/ |
VOLUME | 定义数据卷 | VOLUME [“/data”] |
STOPSIGNAL | 设置发送给容器以退出的系统调用信号 | STOPSIGNAL signal |
ONBUILD | 用于延迟构建命令的执行 | ONBUILD COPY index.html /usr/app/nginx/html/ |
HEALTHCHECK | 定义周期性检查容器健康状态的命令 | HEALTHCHECK --interval=5s --timeout=3s |
SHELL | 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令 | SHELL ["powershell", "-command"] |
1.FROM
作用:指定基础镜像,所有定制的镜像都是基于 FROM 的镜像,比如说我们的centos镜像; 格式: FROM [imagename]2. MAINTAINER
作用:指定镜像的作者信息; 格式: MAINTAINER [authorname]3.LABEL
作用:以键值对形式添加镜像元数据,它比MAINTAINER更为灵活,可以替代MAINTAINER; 格式: LABEL <key1>=<value1> <key2>=<value2> <key3>=<value3> ...4.RUN
作用:在当前镜像构建时要运行的命令,有shell和exec两种格式; shell格式: RUN <commond> exec格式:RUN [“executable”,“param1”,“param2”]5.CMD
作用:指定容器docker run时运行的命令;与RUN的区别在于RUN 是在 docker build 构建镜像时运行的,CMD 则是在 docker run 时运行,CMD的指令可被覆盖,如果有多个CMD指令,只有最后一个生效;
shell格式: CMD <commond> exec格式:CMD [“executable”,“param1”,“param2”]作为ENTRYPOINT指令的默认参数: CMD [“param1”,“param2”]
6.ENTRYPOINT
作用:指定容器docker run时运行的命令,与CMD类似,命令行参数会被作为ENTRYPOINT 指令指定的程序的参数,如果docker run 时使用了--entrypoint,会覆盖ENTRYPOINT 指令; shell格式: ENTERYPOINT command exec格式:ENTERYPOINT [“executable”,“param1”,“param2”] 搭配CMD: ENTERYPOINT [“executable”,“param1”,“param2”] CMD [“param1”,“param2”]7.EXPOSE
作用:声明容器运行时监听的端口,可以帮助镜像使用者配置映射; 格式: EXPOSE <port1> [<port2>...]8.WORKDIR
作用:设置后续指令的工作目录,用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 建立该目录; 格式: WORKDIR <dir>9.ENV
作用:设置环境变量;格式:ENV <key> <value> 或者 ENV <key1>=<value1> <key2>=<value2>
10.ARG
作用:设置环境变量,但是与ENV有区别;ARG 设置的环境变量仅在dockerfile内有效; 格式: ARG <key> [=<value>]11.USER
作用:用于指定执行后续命令的用户和用户组,只是切换后续命令执行的用户,用户和用户组必须提前已经存在; 格式: USER <user> [:<group>]12.ADD
作用:将文件或目录拷贝到镜像中,且会自动处理URL和解压tar压缩包; 格式: ADD [--chown=<user>:<group>] <源路径1>... <目标路径> ADD [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]13.COPY
作用: 将文件或目录拷贝到镜像中,类似于ADD,但是不会解压缩,如果只是单纯的复制,推荐使用copy; 格式: COPY [--chown=<user>:<group>] <源路径1>... <目标路径> COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]14.VOLUME
作用:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷;格式:VOLUME ["<路径1>", "<路径2>"...]
15.STOPSIGNAL
作用:设置将发送到容器以退出的系统调用信号; 格式: STOPSIGNAL [signal]16.ONBUILD
作用:为镜像添加触发器,在本次构建镜像的过程中不会执行,当有新的dockerfile使用了之前构建的镜像,此时会触发ONBUILD指定的指令;格式:ONBUILD<其他指令>
17.HEALTHCHECK
作用:指定某个程序或者指令来监控 docker 容器服务的运行状态; 格式: HEALTHCHECK [选项] CMD18.SHELL
作用:覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令; 格式: SHELL ["executable", "parameters"]四、dockerfile实践
接下来,我也来实践一下dockerfile,比如说使用dockerfile安装一个nginx; 1、编写dockerfile文件vim dockerfile_nginx
FROM centos
MAINTAINER chililopp
LABEL version="1.0"
WORKDIR /etc
RUN rm -rf yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum install nginx -y
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off;"]
2、构建镜像
docker build -f /docker/dockerfile/dockerfile_nginx -t "chililopp/nginx:v1" .
3、查看镜像 4、基于刚才的镜像启动容器 docker run -d -p 80 --name nginx2 chililopp/nginx:v1
5、查询一下容器运行状态
docker ps|grep nginx2
6、查询一下容器中的进程
docker top nginx2
7、进入容器看看 docker exec -it nginx2 /bin/bash
8、查看一下进程
9、访问一下服务,没有问题;
我是chililopp,正在学习k8s,之后如果有新的总结或者体验也会发出来,如果有说的不对的地方,还请指点,十分感谢阅读!