写点什么

【云原生】Docker—Dockerfile 写法与用法以及 dockerfile 简介与构建镜像详解【附加实战】

作者:A-刘晨阳
  • 2023-04-16
    北京
  • 本文字数:3226 字

    阅读完需:约 11 分钟

一、dockerfile 简介

  什么是 dockerfile?

  Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令(Instruction)和操作命令;每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建(也就是你要执行的操作命令)。

  dockerfile 是什么?

  •  dockerfile 是纯文本文件;

  •  dockerfile 是用来构建镜像的;

  •  dockerfile 用于指示 docker image build 命令自动构建 Image 的源代码;


dockerfile 构建镜像的的格式:


docker build -t 要打的镜像名:版本号 Dockerfile路径
复制代码


dockerfile 构建镜像的的实例:


docker build -t work:v1 .
复制代码

  为什么要用 dockerfile?

  ❓在 dockerhub 中官方提供很多镜像已经能满足我们 99%的服务了,为什么还需要自定义镜像?


  🤔️解析:是,官方的镜像很多,同时也可以满足我们 99%的服务;但是,如果有的公司要做自己的产品,那么,官网的镜像肯定是没有的,这时候就需要用到自定义镜像,而自定义镜像就是 dockerfile 构建成的;


  🥳我们可以用 dockerfile 自定义写需要的操作,来用 dockerfile 的指令来实现,最终采用 docker build 来构建镜像,构建完镜像可以采用 docker save 命令打成 tar 包,以便于日后在其他服务器上使用,也可以采用 docker push 提交到私有镜像仓库或 dockerhub 中。



如上图所示,Dockerfile 是独立于本地 docker 实例的一个文本文件,用于自动化地构建具有特定功能的 docker 镜像。


Dockerfile 镜像构建三部曲:(1)构建 Dockerfile 文件;(2)采用 docker build 命令构建镜像;(3)采用 docker run 命令依据镜像运行容器实例。

  Dockerfile、Docker 镜像和 Docker 容器的关系

从应用软件开发角度来看,它们分别表示软件开发的三个阶段:


  • (1)Dockerfile 是软件开发的原材料;

  • (2)Docker 镜像是软件的交付品;

  • (3)Docker 容器是 Docker 交付镜像的实例化,代表软件的实际运行过程。



总结:Dockerfile 面向开发,Docker 镜像为交付标准,Docker 容器与部署、运维相关,三则相辅相成缺一不可,他们是 Docker 的三大基石。Docker 在实际运行中,Dockerfile、Docker 镜像、Docker 容器三者的运作内容如下所示:


  • 1、Dockerfile 定义了进程需要的一切内容,包括:代码执行、文件/环境变量、依赖包、运行环境、操作系统发行版本、服务进程、内核进程等等,很多与操作系统底层相关的内容。

  • 2、通过 docker build 指令会生成一个 Docker 镜像,它是为用户提供各种服务的基础;

  • 3、Docker 容器则是一个实例化的服务进程。

二、DockerFile 需要注意的编写规范

1. # 代表注释

2.指令必须要大写,后面最少需要带一个参数,最多无限制;

3.执行 dockerfile 的时候,指令是按照从上到下的顺序执行的;

三、Docekrfile 指令解析

注意:指令全部都必须为大写,后面跟的是你要执行的操作命令



四、常用的 Dockerfile 指令详解、格式与用法

(必须)是写 dockerfile 必须有的,没有加的是(可选)的。


4.1 FROM(必须)

指定一个基础镜像,必须为第一个命令。


格式


FROM 基础镜像
复制代码


举例


一个 nvidia、cuda10.1 的 centos7 基础镜像


FROM nvidia/cuda:10.1-cudnn7-devel-centos7
复制代码

4.2 MAINTAINER

维护者信息,可以写邮箱,编辑人等等。


格式


MAINTAINER 邮箱/名字
复制代码


举例


展示邮箱和名字


MAINTAINER liucyMAINTAINER 121212@qq.comMAINTAINER 121212@163.com
复制代码

4.3 USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用 USER 指定用户时,可以使用用户名、UID 或 GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户


格式


USER 用户名&&USER user:group && USER uid  &&USER uid:gid  &&USER user:gid  &&USER uid:group
复制代码


举例


指定 root 用户


USER root
复制代码

4.4 ENV(必须)

设置环境变量


格式


ENV 环境变量路径
复制代码


举例


设置 jdk1.8 的环境变量


ENV JAVA_HOME=/usr/local/jdk1.8.0_333/ENV export JRE_HOME=$JAVA_HOME/jreENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/libENV PATH=$JAVA_HOME/bin:$PATH
复制代码

4.5 VOLUME

用于指定持久化目录(指定此目录可以被挂载出去)


格式


VOLUME 挂载路径
复制代码


举例


挂载到/data 目录


VOLUME ["/data"]
复制代码

4.6 EXPOSE

设置端口,EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应该就会开启这个端口的服务。

在 Dockerfile 中写入这样的声明有两个好处:是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;在运行是使随机端口映射时,也就是 docker run -P(大写)时,会自动随机映射 EXPOSE 端口。


格式


EXPOSE 端口号
复制代码


举例


设置一个 8080 端口


EXPOSE 8080
复制代码

4.7 COPY

复制文件,相当于 linux 命令中的 cp 命令;功能类似 ADD,但是是不会自动解压文件,也不能访问网络资源


格式


COPY 源文件及路径 目标路径
复制代码


举例


复制一个 mysql 到/usr/local/下


COPY /root/mysql /usr/local/
复制代码

4.8 ADD

将本地文件添加到容器中,tar 类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget。


格式


ADD 源文件及路径 目标路径
复制代码


举例


移动一个 mysql-2-2.tar


ADD /usr/local/mysql-2-2.tar /root/
复制代码

4.9 WORKDIR

切换目录,相当于 linux 命令中的 cd 命令,切换到这个目录,进入容器时就是这个目录,所以,workdir 就属于启动默认的目录。


格式


WORKDIR 目录名
复制代码


举例


设置启动就在/data/目录


WORKDIR /data/
复制代码

4.10 RUN(必须)

构建镜像时执行的命令,执行的命令就是你指定的要他干什么,使用 linux 命令就可以。


格式


RUN 要执行的命令
复制代码


举例


打镜像时下载一个 netstat 命令


RUN yum -y install net-tools
复制代码

4.11 CMD

构建镜像后调用,也就是在容器启动时才进行调用。写一次 dockerfile 只能出现一次 CMD,而出现 CMD 的地方,就属于结尾,如果下面有 RUN 指令,则都不执行。


格式


CMD 要执行的命令
复制代码


举例


执行删除 dockerfile(打完镜像,要删除 dockerfile)


CMD rm -rf /data/dockerfile
复制代码

五、docker build 构建镜像

dockerfile 构建镜像的的格式:


docker build -t 要打的镜像名:版本号 Dockerfile路径
复制代码


dockerfile 构建镜像的的实例:


docker build -t work:v1 .
复制代码

六、【实战】docker 自定义镜像

说明:


  此处只是测试使用,并不能用到生产中,(生产中要根据自己的情况来写),可以构建成镜像,也可以创建容器,可以进入容器查看这些文件,但是 web 页面访问不到,因为没有加入 jar 包之类的,可以自行放入一个 jar 包,端口设置 3000,然后启动 jar 包就可以了去访问 web 页面了。


前言:  有一点特别重要,构建镜像的时候要看好你的文件是不是这个目录,要不然打到一半会报错,说找不到文件,切记要记得放文件,在放文件的目录执行。

1、编写 Dockerfile

#创建Dockerfile文本vim Dockerfile
复制代码


#设置基础镜像FROM nvidia/cuda:10.1-cudnn7-devel-centos7#维护者信息MAINTAINER liucyMAINTAINER 121212@qq.comMAINTAINER 121212@163.com#指定运行时的用户以及镜像的实际用户USER root#下载netstat命令RUN yum -y install net-tools#设置jdk1.8的环境ENV JAVA_HOME=/usr/local/jdk1.8.0_333/ENV export JRE_HOME=$JAVA_HOME/jreENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/libENV PATH=$JAVA_HOME/bin:$PATH#开放一个3000端口EXPOSE 3000#移动并解压Grafana.tar安装包ADD /root/Grafana.tar /home/#复制当前目录下的所有到/data/cs/里COPY ./ /data/home/#设置python3.6.8环境RUN cd /data/Python-3.6.8/ && ./configure --prefix=/root/python36 && make && make install && ln -s /root/python36/bin/python3.6 /usr/bin/python3 && ln -s /root/python36/bin/pip3 /usr/bin/pip3#切换到/data/目录WORKDIR /data/#最后执行删除DockerfileCMD rm -rf Dockerfile
复制代码

2、构建镜像

docker build -t dockerfile:v1 .
复制代码


等待构建完成。

3、查看镜像

[root@cs ~]# docker imagesREPOSITORY                 TAG                 IMAGE ID            CREATED             SIZEdockerfile                 v1                 15c89s63e742      2 months ago           8.5GB
复制代码


发布于: 2023-04-16阅读数: 31
用户头像

A-刘晨阳

关注

还未添加个人签名 2022-06-16 加入

本人公众号《小刘Linux》,优质博主,欢迎大家的关注

评论

发布
暂无评论
【云原生】Docker—Dockerfile写法与用法以及dockerfile简介与构建镜像详解【附加实战】_Linux_A-刘晨阳_InfoQ写作社区