[关闭]
@songying 2019-01-02T22:05:55.000000Z 字数 2407 阅读 1178

Docker基本概念

Docker


基本概念

镜像(image) , 容器(container), 仓库(Repository)

Docker镜像

Docker 镜像(Image),就相当于是一个 root 文件系统.

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。

在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

容器

镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,容器进程运行于属于自己的独立的 命名空间

一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层

仓库

一个 Docker Registry 中可以包含多个仓库Repository);每个仓库可以包含多个标签Tag);每个标签对应一个镜像。

一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

启动Docker CE

  1. sudo systemctl enable docker
  2. sudo systemctl start docker

用户组

  1. sudo groupadd docker # 建立用户组
  2. sudo usermod -aG docker $USER # 将当前用户加入用户组

定制镜像:Dockerfile

镜像的定制实际上就是定制每一层所添加的配置、文件。

Dockerfile中包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

1. 构建基础镜像

FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。

Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像表示一个空白的镜像。

  1. FROM scratch

2. RUN执行命令

有两种格式。

  • shell格式: RUN <命令>
  • exec 格式: RUN ["可执行文件", "参数1", "参数2"]

注意:每一个命令会建立一层镜像,因此需要将一层的命令用&&连接起来。

  1. RUN apt-get update \
  2. && apt-get install

Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。

镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。

很多人初学 Docker 制作出了很臃肿的镜像的原因之一,就是忘记了每一层构建的最后一定要清理掉无关文件。

3. 进行构建

  1. docker build [选项] <上下文路径/URL/->
  2. docker build -t nginx:v3 . # 此处的. 指定的是上下文路径
  • docker build的工作原理:

    Docker在运行时分为 Docker引擎和客户端工具。docker build 命令构建镜像,其

    实并非在本地构建,而是在服务端,也就是Docker 引擎中构建的

  • 上下文: 用于让服务端来获取本地文件。

    当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给Docker引擎。这样Docker引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。

注意: 在Dockerfile中写入:

  1. COPY ./FILE /da

此处的.指代的是上下文目录。

如果真的需要那些文件,应该将它们复制到上下文目录中去。


默认情况下,如果不额外指定Dockerfile的话,会将上下文目录下的名为Dockerfile的文件作为Dockerfile。

4. 其他docker build构建方式

Docker命令

COPY复制文件

将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的 <目标路径>位置。

  1. COPY <源路径>...<目标路径>
  2. COPY ["<源路径1>",... "<目标路径>"]

源路径可以是多个,可以时通配符。

<目标路径>可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)

ADD 复制文件

ADD指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。

尽量使用COPY而不是ADD.

CMD容器启动命令

有两种格式

  • shell方式: CMD <命令>
  • exec方式: CMD ["可执行文件", "参数1", "参数2"]

CMD指令就是用于指定默认的容器主进程的启动命令的。

在指令格式上,一般推荐使用exec格式,这类格式在解析时会被解析为JSON数组,因此一定要使用双引号" ,而不要使用单引号。

Docker 不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机、物理机里面那样,
用 upstart/systemd 去启动后台服务,容器内没有后台服务的概念。

ENTRYPOINT 入口点

ENTRYPOINT的格式和RUN指令格式一样,分为exec格式和shell格式。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注