Docker是什么

基于Linux内核的 Cgroups、Namespace 技术,以及 UnionFS(Union File System)组成 rootfs(Root File System)等技术,对进程进行封装隔离,实现操作系统层面的虚拟化技术。

从上面的介绍直观感受来说,Docker更像一个技术概念,它利用已有的技术特性和理念,使用Go语言开发了一个项目,叫做Docker。

它实现的进程隔离独立于宿主和其他隔离的进程外,因此被称为容器。

Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使其相比于虚拟机技术更为轻便、快捷。

Docker技术相比较于虚拟机技术:虚拟机技术是虚拟出一套完整的操作系统(自己的内核、硬件资源),再在该系统上运行所需的应用进程;而Docker容器没有自己的内核,也没有进行硬件虚拟,只是通过技术手段重新挂载一套新的文件系统,并在此文件系统上运行应用进程。

Docker技术相比较于虚拟机技术的优势:

  1. 更高效的利用系统资源
  2. 更快速的启动时间
  3. 一致的运行环境
  4. 持续交付(CI)和部署(CD)
  5. 更轻松的迁移
  6. 更轻松的维护和扩展

Docker基本概念

Docker的三大基本概念:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker镜像

前言:操作系统的组成分为 内核 和 用户空间,对于 Linux 而言,内核启动后,会挂载 root 文件系统(rootfs)为其提供用户空间支持。

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

因为Docker镜像包含有操作系统的完整的 rootfs,其体积往往是庞大的(百兆或者GB大小),这与介绍Docker时说它是轻量级的概念不符。所以Docker在设计时,利用了 Union FS技术,将镜像设计为多层储存的架构。严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。

镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

例如:从Docker Hub下载一个 MySQL镜像时,MySQL需要有一个操作系统作为运行环境,但它不会拿宿主机的操作系统,而是根据构建MySQL镜像的代码判断,从上一层获取镜像。

image-20230920114306998

从图中可以看出,mysql:5.7.41镜像的上一层是oraclelinux:7-slim镜像。

Docker容器

镜像(Image)和容器(Container)的关系,就类似于面向对象编程中的 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

每个容器都是相互隔离的运行环境,具有自己的文件系统、进程空间和网络接口。容器可以与主机和其他容器进行通信。

Docker Registry

Docker Registry翻译为Docker注册表,又叫做Docker中央仓库。中央仓库可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个Docker镜像。

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

Docker常用命令

镜像管理命令

  1. docker pull <image>:从注册表中拉取一个镜像。
  2. docker build [options] <path/to/dockerfile>:根据Dockerfile构建一个镜像。
  3. docker push <image>:将一个镜像推送到注册表中。
  4. docker images:列出本地已有的镜像。等同于 docker image ls
  5. docker rmi <image>:删除一个镜像。

容器管理命令

  1. docker run [options] <image> [COMMAND] [ARG...]:创建并运行一个新的容器。

    • [OPTIONS]是可选的参数,用于配置容器的各种选项,例如端口映射、卷挂载、环境变量等。
    • IMAGE是容器所基于的镜像名称或镜像ID。
    • [COMMAND] [ARG...]是容器启动时要执行的命令和参数。

    下面是一些常用的docker run命令选项(options):

    • -d:以后台模式(detached)运行容器。
    • -p <host-port>:<container-port>:将主机的端口映射到容器的端口。
    • -v <host-path>:<container-path>:将主机的目录或文件挂载到容器的目录。
    • -e <key>=<value>:设置环境变量。
    • --name <container-name>:为容器指定一个名称。
    • --restart <restart-policy>:设置容器的重启策略。
    • -it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。一般会在command写bash。
    • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm
  2. docker start <container>:启动已经创建的容器。

  3. docker stop <container>:停止正在运行的容器。

  4. docker restart <container>:重启容器。

  5. docker rm <container>:删除容器。

  6. docker ps [options]:列出正在运行的容器。

    1. docker ps -a:列出所有容器,包括正在运行的和已停止的容器。
    2. docker ps -q:只显示容器的ID。
    3. docker ps -l:显示最近创建的容器。
    4. docker ps --filter <key>=<value>:根据指定的键值对筛选容器,例如docker ps --filter status=running只显示正在运行的容器。
  7. docker logs <container>:查看容器的日志。默认输出所有日志。

    1. docker logs --tail 100 <container> :只展示最后100行日志
    2. docker logs -f <container> :实时(follow)模式下查看容器日志。
  8. docker exec [options] <container> <command>:在正在运行的容器中执行命令。

    1. docker exec -it <container> <command> :在正在运行的容器中执行交互式命令。
      • -it选项用于指定交互式会话(Interactive)和终端(TTY)连接,以便你可以与容器进行交互。
      • <container>是容器的名称或容器ID。
      • <command>是要在容器内部执行的命令。例如:bash

网络和存储命令

  1. docker network create <network>:创建一个新的网络。
  2. docker network connect <network> <container>:将容器连接到网络。
  3. docker volume create <volume>:创建一个数据卷。
  4. docker volume ls:列出本地已有的数据卷。
  5. docker volume rm <volume>:删除一个数据卷。

其他常用命令

  1. docker info:显示Docker系统信息。
  2. docker version:显示Docker客户端和服务器版本信息。
  3. docker inspect <container/image>:获取容器或镜像的详细信息。
  4. docker attach <container>:附加到正在运行的容器的标准输入、输出和错误流。
  5. docker cp <container>:<path/to/file> <host/path>:从容器复制文件到主机。
  6. docker-compose up:使用Docker Compose启动多个容器应用。