Docker镜像制作

目录

Dockfile是什么

构建镜像的三个步骤

dockerfile内容基础知识

docker执行一个Dockerfile脚本的大致流程

Dockerfile指令

FROM

MAINTAINER

RUN

EXPOSE

WORKDIR

ENV

ADD

COPY

VOLUME

USER

ONBUILD

CMD

ENTRYPOINT

CMD和ENTRYPOINT区别

构建dockerfile

Dockfile是什么

**含义:**其是用来构建docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本

构建镜像的三个步骤

  1. 编写Dockerfile文件
  2. docker build命令构建镜像
  3. docker run依照镜像运行容器实例

dockerfile内容基础知识

  • 每条保留字指令都必须为大写字母且后面要跟至少一个参数
  • 指令按照从上到下顺序执行
  • #表示注释
  • 每条指令都会创建一个新的镜像层并对镜像进行提交

docker执行一个Dockerfile脚本的大致流程

  • docker从基础镜像运行一个容器
  • 执行一条指令对容器做出修改
  • 执行类似与docker commit的操作提交一个新的镜像层
  • docker再基于刚刚提交的镜像运行一个新容器
  • 执行Dockerfile中的下一条指令直到所有的指令都执行完

Dockerfile指令

FROM

前言:

  • Dockerfile中的第一条指令必须是FROM命令,指定使用的基础镜像(基础环境)
  • Docker Hub中99%的镜像都是从scratch这个基础镜像过来的,也就是FROM后面的参数不知道写什么就写scratch

**语法:**FROM 基础镜像

若在同一个Dockerfile中构建多个镜像,可以使用很多FROM命令

bash 复制代码
FROM <image>
FROM <image>:<tag>

MAINTAINER

**前言:**用于指定生成镜像的作者名称

**语法:**MAINTAINER <name>

RUN

**作用:**基于该镜像环境下执行命令,并提交到该镜像

**语法:**RUN <command>

bash 复制代码
FROM nginx:latest
RUN apt-get update
RUN apt-get install -y iproute2
RUN apt-get install -y net-tools
RUN apt-get install -y iputils-ping
EXPOSE 80

如上就是为nginx镜像添加功能使用的

注意:

  • 多行命令不要写多个RUN(不要在意上面)原因是Dockerfile中的每一个指令都会建立一层。多个RUN就会构建多层镜像,会造成镜像臃肿,多层,不仅增加了部署时间,还易出错
  • linux内一行执行多个命令:command1;conmand2;......
  • RUN书写时换行符为\

EXPOSE

**作用:**对外暴露该容器开放的端口

**语法:**EXPOSE 端口号

WORKDIR

作用:

  • 指定创建容器后,默认进入容器的路径,也就是进入容器的落脚点在哪(不写则在根目录)
  • 为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY、ADD设定工作目录(就是下载东西存在哪)

**语法:**WORKDIR 容器内路径

ENV

**作用:**用于设定docker容器内的环境变量供以后使用。

**语法:**ENV 环境变量名 环境变量值

**注意:**设置好环境变脸后就可以在后面复用了,复用方式$环境变量名

ADD

**作用:**将宿主机目录下的文件拷贝至镜像,且ADD命令会自动处理URL和解压tar压缩包

**语法:**ADD 宿主机的文件/目录 镜像目录

COPY

**作用:**将主机的目录或文件拷贝至镜像中,但是相对于ADD来说不会解压缩

语法:COPY 宿主机的文件/目录 镜像目录

VOLUME

**作用:**挂载数据卷,将宿主机的目录和容器中的目录实现挂载,可实现持久化作用

**语法:**VOLUME ["容器中挂载路径1","容器中挂载路径2"......]

注意:

  • 有了这个参数和docker run的-v参数都可以实现启动容器就挂载目录的目的
  • 该种挂载方式为匿名挂载,既然为挂载,那么在容器中有,那么在容器外也有,对应的容器外目录查看用命令:docker inspect 容器id来查看
  • 其作用相当于启动容器的-v参数,在-v参数中也可以修改上面的挂载路径(前提是-v参数的容器路径与volume参数的容器路径相同,若不同则再次追加一个挂载路径)

USER

**作用:**指定运行容器时的用户和用户组

**语法:**USER 用户名

注意:

  • 默认情况下容器运行的身份为root用户
  • 指定运行的用户必须该用户在linux宿主机内存在,不然打不开容器

ONBUILD

**作用:**当构建一个被继承的Dockerfile时运行的命令,父镜像在被子继承后父镜像的onbuild被触发

**语法:**ONBUILD 具体指令

理解:

  • Dockerfile里用ONBUILD指定的命令,在本次镜像构建过程中并不会被执行(假设构建后的镜像为test-build)。当有新的Dockerfile使用了之前构建的test-build(FROM test-build),这时执行镜像的Dockerfile构建时,会执行test-build的Dockerfile里的ONBUILD命令
  • ONBUILD是一个特殊指令,他后面根其他指令,如RUN、COPY等,并不仅仅是一个命令
  • Dockerfile中的其他指令都是为了构建当前镜像准备的,只有ONBUILD指令是为了帮助别人定制而准备的
  • 举例: ONBUILD RUN mkdir test

CMD

**作用:**指定一个容器启动时要运行的命令

**语法1:**CMD command param1 param2

**语法2:**CMD ["要运行的程序","参数1","参数2"]

**注意:**Dockerfile文件中只能执行一条CMD命令,若写多条,那么只有最后一个CMD命令被执行

ENTRYPOINT

**作用:**指定一个容器启动时要运行的命令

**语法1:**ENTRYPOINT command param1 param2

**语法2:**ENTRYPOINT ["要运行的程序","参数1","参数2"]

**注意:**Dockerfile文件中只能执行一条ENTRYPOINT命令,若写多条,那么只有最后一个ENTRYPOINT命令被执行。

CMD和ENTRYPOINT区别

dockerfile1文件

FROM centos

CMD ["ls","-a"]或ENTRYPOINT ["ls","-a"]
**构建镜像:**docker build -f dockerfile1 -t cmdtest .
**执行:**docker run cmdtest

**结果:**用CMD的启动之后就执行ls -a命令,但是在后面加-l(docker run cmdtest -l)就会报错,

用ENTRYPOINT的启动之后就执行ls -a命令,但是在后面加-l就会追加-l(在命令台输入的命令就为cmd命令)

构建dockerfile

**需求:**为centos加vim与net-tools插件与jdk8

**编辑Dockerfile文件:**vim Dockerfile1

这里我写的dockerfile名为Dockerfile1

复制代码
#centos作为基础镜像
FROM centos:7
#书写具体的个人信息
MAINTAINER cjc<1111111111@qq.com>
#配置环境(键值对形式)
ENV MYPATH /usr/local
#配置工作目录,进入容器后就会自动进入该目录
WORKDIR $MYPATH
#基于以上镜像执行命令并提交到新镜像中
RUN yum -y install vim
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#将源文件复制到目标文件
ADD jdk-8u51-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_51
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH JAVA_HOME/bin:$PATH
#暴露端口80
EXPOSE 80
#执行启动容器时要运行的脚本
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash

**构建镜像:**docker build -f Dockerfile1 -t centosadd:1.0 .

注意:

  • **-f 具体路径的Dockerfile文件名:**表示构建镜像的dockerfile的名字(该参数也可以省略,但是Dockerfile名字必须为Dockerfile)
  • **-t 镜像名:**表示新构建镜像的名字(这个名字用小写)
  • 最后的**"."**必须存在,他表示在当前文件夹下构建
相关推荐
像名字一样难取的昵称19 分钟前
Linux学习笔记:十八、Linux文件的压缩,解压缩一站式学习
linux·运维·笔记·学习·ubuntu·ssh
weixin_4454766824 分钟前
Docker 在 Ubuntu(国内网络)安装及问题解决总结
网络·ubuntu·docker
Trouvaille ~2 小时前
【Linux】库制作与原理(二):ELF格式与静态链接原理
linux·运维·c语言·操作系统·动静态库·静态链接·elf文件
一点晖光2 小时前
docker配置npm环境变量出现问题
docker·容器·npm
写代码的橘子n2 小时前
IPV6复习(基础入手版)
运维·服务器·网络
ICT技术最前线2 小时前
H3C双WAN口策略路由配置技术教程
运维·网络·h3c·策略路由
一分半心动2 小时前
windows docker desktop 安装VibeVoice
运维·docker·容器
向日葵.2 小时前
中间件交接文档
linux·运维·服务器
LucidX2 小时前
Docker核心操作实战
运维·docker·容器
隔壁阿布都2 小时前
Docker Compose中的网络管理
运维·docker·容器