上回书说到containerd的基础命令,但是containerd无法构建镜像,但dockerfile可以,所以这一节我们就来探究一下何为dockerfile?
dockerfile 是一种用于定义和构建 docker 镜像的文本文件,由一行行指令和参数组成,用于描述镜像的构建和配置过程;由基础映像、软件包安装、文件拷贝、环境变量设置等组成;
基于dockerfile构建镜像可以使用docker build命令,使用 -f 可以指定具体的dockerfile文件;
使用dockerfile构建镜像的步骤如下:编写dockerfile文件-->docker build构建镜像-->docker run运行镜像;
我们可以看看dockerfile构建镜像的过程:
1)docker从基础镜像运行一个容器,比如说centos;
2) docker执行一条RUN的指令,执行类似docker commit 的操作提交一个新的镜像层;
3)docker基于刚才提交的镜像去运行一个新的容器;
4)执行下一条指令,提交一个新的镜像层,直到所有的指令完成;
ps:编写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"] |
作用:指定容器docker run时运行的命令;与RUN的区别在于RUN 是在 docker build 构建镜像时运行的,CMD 则是在 docker run 时运行,CMD的指令可被覆盖,如果有多个CMD指令,只有最后一个生效;
shell格式: CMD作为ENTRYPOINT指令的默认参数: CMD [“param1”,“param2”]
格式:ENV
格式:VOLUME ["<路径1>", "<路径2>"...]
格式:ONBUILD<其他指令>
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" .
docker run -d -p 80 --name nginx2 chililopp/nginx:v1
5、查询一下容器运行状态
docker ps|grep nginx2
6、查询一下容器中的进程
docker top nginx2
docker exec -it nginx2 /bin/bash
8、查看一下进程
9、访问一下服务,没有问题;
我是chililopp,正在学习k8s,之后如果有新的总结或者体验也会发出来,如果有说的不对的地方,还请指点,十分感谢阅读!