docker概念以及dockerfile
容器
镜像运行起来后就叫容器,是镜像运行的载体。
如果借用编程的思维,镜像就像是一个“类(Class)”,而容器就是实例化出来的“对象(Object)”。容器不仅运行着程序,还自带一套独立的运行环境(包括独立的文件系统、网络和进程空间),它和宿主机以及其他容器是相互隔离的。
镜像
是一段可执行的静态程序,没运行起来。或者可以简单理解为安装包。
更准确地说,它是一个只读的模板。它不仅包含你的程序代码,还打包了程序运行所依赖的完整环境(比如 JDK、系统库、配置文件等)。它的“只读”特性保证了无论在哪里运行,环境都是绝对一致的。
镜像仓库
存放镜像的地方,分为本地仓库和远端仓库。远端仓库和git的远端分支一样,可以用于协作。
创建自己的镜像
通常通过dockerfile 文件来构建相应的镜像,例如把spring boot 后端程序打成镜像。
宿主机
宿主机就是安装并运行 Docker 引擎的那台物理机或虚拟机。
你可以把它理解为“房东”。Docker 容器就像是租住在房东家里的“租客”。容器共享宿主机的操作系统内核,但拥有自己独立的运行环境、网络和文件系统,彼此之间相互隔离。
挂载
如果容器被删除,容器中的数据会丢失。因此需要把要保存的文件挂载到宿主机,就是把容器中的数据存储在宿主机中。还有一个作用就是可以和别的容器共享挂载的数据。
比如:使用docker 部署了mysql,如果没有挂载卷,容器被删除后,里面的数据也就丢失了。
定制的镜像都是基于 FROM 的镜像。基础镜像。例如java 项目 jdk 就是基础镜像,vue项目nginx 就是基础镜像。
dockerfile
dcokerfile 可以用于自定义镜像。通过定义一系列命令和参数,Dockerfile 指导 Docker 构建一个自定义的镜像。
是构建镜像的“自动化蓝图”或“说明书”,里面写满了构建指令(比如基于什么环境、拷贝什么文件、怎么启动)。写好之后,通过 docker build 命令就能自动打包出镜像。
常见命令
FROM
定制的镜像都是基于 FROM 的镜像。基础镜像。例如java 项目 jdk 就是基础镜像,vue项目nginx 就是基础镜像。
RUN
用于执行后面跟着的命令,一个run 就是有一层新的镜像,所有要避免无意义的run,否则镜像就会膨大。
有两种格式:
- shell 格式:RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。
- exec 格式:RUN ["可执行文件", "参数1", "参数2"]
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。
注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
格式:
CMD <shell 命令>
CMD ["<可执行文件或命令>","<param1>","<param2>",...]
CMD ["<param1>","<param2>",...] # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数
ENTRYPOINT
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。
示例:
假设已通过 Dockerfile 构建了 nginx:test 镜像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
ENV
ENV
设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
ARG
构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
格式:
ARG <参数名>[=<默认值>]
WORKDIR
指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。
格式:
WORKDIR <工作目录路径>
EXPOSE
仅仅只是声明端口。
作用:
- 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
- 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
格式:
EXPOSE <端口1> [<端口2>...]
LABEL
LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...更多推荐

所有评论(0)