文章目录
- 一、dockerfile简介
- 二、DockerFile需要注意的编写规范
- 三、Docekrfile指令解析
- 四、常用的Dockerfile指令详解、格式与用法
- 五、docker build构建镜像
- 六、【实战】docker自定义镜像
- 七、总结
一、dockerfile简介
什么是dockerfile?
dockerfile是什么?
dockerfile构建镜像的的格式:
docker build -t 要打的镜像名:版本号 Dockerfile路径
dockerfile构建镜像的的实例:
docker build -t work:v1 .
为什么要用dockerfile?
如上图所示,Dockerfile是独立于本地docker实例的一个文本文件,用于自动化地构建具有特定功能的docker镜像。
Dockerfile、Docker镜像和Docker容器的关系
从应用软件开发角度来看,它们分别表示软件开发的三个阶段:
- (1)Dockerfile是软件开发的原材料;
- (2)Docker镜像是软件的交付品;
- (3)Docker容器是Docker交付镜像的实例化,代表软件的实际运行过程。
- 1、Dockerfile定义了进程需要的一切内容,包括:代码执行、文件/环境变量、依赖包、运行环境、操作系统发行版本、服务进程、内核进程等等,很多与操作系统底层相关的内容。
- 2、通过docker build指令会生成一个Docker镜像,它是为用户提供各种服务的基础;
- 3、Docker容器则是一个实例化的服务进程。
二、DockerFile需要注意的编写规范
三、Docekrfile指令解析
指令 | 功能简介 |
---|---|
FROM | 指定构建新image是使用的基础image,通常必须是Dockerfile的第一个有效指令;定义一个基础镜像。 |
LABEL | 附加到image之上的元数据,键值格式;定义一些元数据。 |
ENV | 以键值格式设定环境变量,可被其后的指令所调用,且基于新生成的image运行的Container中也会存在这些变量。 |
RUN | 以FROM中定义的image为基础环境运行指令命令,生成结果将作为新image的一个镜像层,并可由后续指令所使用。RUN后跟要执行的命令。 |
CMD | 基于dockerfile生成的image运行的container时,CMD能够指定容器中默认运行的程序,因而其只应该定义一次。 |
ENTRYPOINT | 类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时,CMD的内容将作为该指令中定义的程序的参数。 |
WORKDIR | 相当于cd切换目录的命令,如果切换的那个地方没有哪个目录,则会自动创建一个目录。 |
COPY | 相当于cp命令,复制主机上或者前一阶段构建结果中(需要使用–from选项)文件或目录生成新的镜像。 |
ADD | 与COPY指令的功能相似,但ADD传输压缩包的时候,是可以解压的。 |
VOLUME | 指定基于新生成的Image运行Container时期望作为volume使用的目录。 |
EXPOSE | 指定基于新生成的lmage运行Container时期望 暴露的端口,但实际暴露与否取决于"docker run”命令的选项,支持TCP和UDP协议。 |
USER | 为Dockerfile中该指令后面的RUN、CMD和ENTRYPOING指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID。 |
ARG | 定义专用于build过程中的变量,但仅对该指标之后的调用生效,其值可由命令行选项"–build-arg"进行传递。 |
ONBUILD | 触发器,生效于由该Dockerfile 构建出的新l/mage被用于另一个Dockerfile中的FROM指令作为基础镜像时。 |
STOPSIGNAL | 用于通知Container终止的系统调用信号。 |
HEALTHCHECK | 定义检测容器应用的健康状态的具体方法。 |
SHELL | 为容器定义运行时使用的默认shel程序,Linux系统默认使用 [/bin/sh”,“-c”], Windows默认使用 [’cmd’, “/S’,”/C’]。 |
四、常用的Dockerfile指令详解、格式与用法
(必须)是写dockerfile必须有的,没有加的是(可选)的。
4.1 FROM(必须)
格式
FROM 基础镜像
举例
FROM nvidia/cuda:10.1-cudnn7-devel-centos7
4.2 MAINTAINER
格式
MAINTAINER 邮箱/名字
举例
MAINTAINER liucy
MAINTAINER 121212@qq.com
MAINTAINER 121212@163.com
4.3 USER
格式
USER 用户名
&&
USER user:group
&&
USER uid
&&
USER uid:gid
&&
USER user:gid
&&
USER uid:group
举例
USER root
4.4 ENV(必须)
格式
ENV 环境变量路径
举例
ENV JAVA_HOME=/usr/local/jdk1.8.0_333/
ENV export JRE_HOME=$JAVA_HOME/jre
ENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV PATH=$JAVA_HOME/bin:$PATH
4.5 VOLUME
格式
VOLUME 挂载路径
举例
VOLUME ["/data"]
4.6 EXPOSE
格式
EXPOSE 端口号
举例
EXPOSE 8080
4.7 COPY
格式
COPY 源文件及路径 目标路径
举例
COPY /root/mysql /usr/local/
4.8 ADD
格式
ADD 源文件及路径 目标路径
举例
ADD /usr/local/mysql-2-2.tar /root/
4.9 WORKDIR
格式
WORKDIR 目录名
举例
WORKDIR /data/
4.10 RUN(必须)
格式
RUN 要执行的命令
举例
RUN yum -y install net-tools
4.11 CMD
格式
CMD 要执行的命令
举例
CMD rm -rf /data/dockerfile
五、docker build构建镜像
dockerfile构建镜像的的格式:
docker build -t 要打的镜像名:版本号 Dockerfile路径
dockerfile构建镜像的的实例:
docker build -t work:v1 .
六、【实战】docker自定义镜像
说明:
前言:
有一点特别重要,构建镜像的时候要看好你的文件是不是这个目录,要不然打到一半会报错,说找不到文件,切记要记得放文件,在放文件的目录执行。
1、编写Dockerfile
#创建Dockerfile文本
vim Dockerfile
#设置基础镜像
FROM nvidia/cuda:10.1-cudnn7-devel-centos7
#维护者信息
MAINTAINER liucy
MAINTAINER 121212@qq.com
MAINTAINER 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/jre
ENV export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
ENV 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/
#最后执行删除Dockerfile
CMD rm -rf Dockerfile
2、构建镜像
docker build -t dockerfile:v1 .
等待构建完成。
3、查看镜像
[root@cs ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockerfile v1 15c89s63e742 2 months ago 8.5GB