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 镜像名:**表示新构建镜像的名字(这个名字用小写)
  • 最后的**"."**必须存在,他表示在当前文件夹下构建
相关推荐
向阳12185 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
荒Huang42 分钟前
Linux挖矿病毒(kswapd0进程使cpu爆满)
linux·运维·服务器
海阔天空_20131 小时前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
桥田智能1 小时前
气爪在自动化装配线中是如何应用的?
运维·自动化
MonkeyKing_sunyuhua1 小时前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
追风林1 小时前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
€☞扫地僧☜€3 小时前
docker 拉取MySQL8.0镜像以及安装
运维·数据库·docker·容器
茶馆大橘3 小时前
微服务系列六:分布式事务与seata
分布式·docker·微服务·nacos·seata·springcloud
其乐无涯3 小时前
服务器技术(一)--Linux基础入门
linux·运维·服务器
Diamond技术流3 小时前
从0开始学习Linux——网络配置
linux·运维·网络·学习·安全·centos