docker知识讲解

1. Docker 和虚拟机(VM)

都是用于隔离和运行应用程序的技术,但它们在多个方面存在显著区别,以下是详细对比:

1.容器与虚拟机

1. 工作原理

  • 虚拟机(VM)

    • 工作原理:虚拟机是通过虚拟化软件(如 VMware、VirtualBox、Hyper-V 等)在物理服务器上创建一个或多个虚拟的计算机系统。每个虚拟机都包含一个完整的操作系统、应用程序以及必要的库和依赖项。它通过虚拟化层(Hypervisor)来模拟硬件环境,为每个虚拟机分配独立的 CPU、内存、存储等资源。

    • 示例:在一台物理服务器上运行多个虚拟机,每个虚拟机运行不同的操作系统,如一个虚拟机运行 Windows Server,另一个虚拟机运行 Linux。

  • Docker

    • 工作原理:Docker 是基于容器化技术的,它利用操作系统的内核隔离功能(如 Linux 的 cgroups 和 namespaces)来创建容器。容器共享宿主机的操作系统内核,但每个容器都有独立的文件系统、网络接口、进程空间等。容器内运行的应用程序可以直接访问宿主机的内核,而无需像虚拟机那样模拟完整的操作系统。

    • 示例:在一台 Linux 服务器上运行多个 Docker 容器,每个容器运行一个独立的应用程序,如一个容器运行 Web 服务器(如 Nginx),另一个容器运行数据库(如 MySQL)。

2. 性能

  • 虚拟机(VM)

    • 性能开销:由于虚拟机需要模拟完整的硬件环境并运行完整的操作系统,因此会有较大的性能开销。每个虚拟机都需要分配独立的 CPU、内存等资源,这会导致资源利用率相对较低。

    • 启动时间:虚拟机的启动时间较长,通常需要几分钟甚至更长时间,因为它需要加载完整的操作系统和相关服务。

  • Docker

    • 性能开销:Docker 容器共享宿主机的内核,没有虚拟机那样的硬件模拟开销,因此性能损耗非常小。容器的启动速度极快,通常只需要几秒钟,因为它只需要加载应用程序及其依赖项。

    • 资源利用率:Docker 容器可以更高效地利用宿主机的资源,因为它们共享内核,不需要为每个容器分配完整的操作系统资源。

3. 资源占用

  • 虚拟机(VM)

    • 资源占用:虚拟机需要为每个虚拟机分配独立的 CPU、内存、存储等资源,即使虚拟机中运行的应用程序并不需要这么多资源,这些资源也会被占用。这会导致资源浪费,尤其是在运行多个虚拟机时。

    • 存储需求:虚拟机通常需要较大的存储空间来存储完整的操作系统镜像和虚拟磁盘文件。

  • Docker

    • 资源占用:Docker 容器共享宿主机的内核,因此不需要为每个容器分配完整的操作系统资源,资源占用相对较少。容器的大小通常取决于应用程序及其依赖项的大小,而不是操作系统的大小。

    • 存储需求:Docker 镜像通常较小,因为它们只包含应用程序及其依赖项,而不包含完整的操作系统。这使得 Docker 容器的存储需求相对较低。

4. 隔离性

  • 虚拟机(VM)

    • 隔离性:虚拟机提供了非常强的隔离性,因为每个虚拟机都运行在独立的虚拟硬件环境中,彼此之间完全隔离。即使一个虚拟机受到攻击或崩溃,也不会影响其他虚拟机。

    • 安全性:由于隔离性较强,虚拟机在安全性方面表现较好,适合运行对安全性要求较高的应用程序。

  • Docker

    • 隔离性:Docker 容器的隔离性相对较弱,因为它们共享宿主机的内核。虽然 Docker 提供了多种隔离机制(如 cgroups 和 namespaces),但在某些情况下,容器之间可能会相互影响,例如通过共享的内核资源。

    • 安全性:Docker 的安全性可以通过配置和管理来提高,例如使用安全的镜像、限制容器的权限等。然而,在某些高安全性的场景下,虚拟机可能仍然是更好的选择。

5. 可移植性

  • 虚拟机(VM)

    • 可移植性:虚拟机的可移植性较差,因为虚拟机的镜像通常较大,包含完整的操作系统和应用程序。将虚拟机从一个环境迁移到另一个环境需要复制整个虚拟磁盘文件,这可能会导致较大的网络带宽消耗。

  • Docker

    • 可移植性:Docker 容器的可移植性非常好,因为 Docker 镜像只包含应用程序及其依赖项,不包含操作系统。Docker 镜像可以轻松地在不同的宿主机之间迁移,只需将镜像推送到 Docker 镜像仓库,然后在目标宿主机上拉取即可。

2. 容器的资源隔离机制

        容器(如 Docker 容器)本身并不拥有完全独立的物理 CPU 和内存资源,但可以通过操作系统的隔离机制(如 Linux 的 cgroups 和 namespaces)来实现资源的隔离和限制,从而让容器在运行时表现得像是拥有独立的资源。以下是详细解释: 

  • Cgroups(Control Groups)

    • 功能:Cgroups 是 Linux 内核的一个功能,用于对进程组的资源(如 CPU、内存、磁盘 I/O 等)进行分配、限制和隔离。通过 cgroups,可以为容器分配特定的资源配额,例如限制容器可以使用的 CPU 时间片、内存大小等。

    • 示例:可以为一个容器设置 CPU 使用率不超过 50%,或者限制内存使用量不超过 1GB。

  • Namespaces

    • 功能:Namespaces 是 Linux 内核的另一种机制,用于隔离进程的运行环境。它可以让不同的进程组(如容器)看到不同的资源视图,例如独立的文件系统、网络接口、进程 ID 等。通过 namespaces,容器可以运行在隔离的环境中,而不会相互干扰。

    • 示例:容器内的进程看到的文件系统和网络接口是独立的,即使它们共享宿主机的内核。

2.docker组成 

Docker 的基本组成包括以下几个核心组件:

组成图片

运行资源

1. Docker 客户端(Docker Client)

  • 功能:Docker 客户端是用户与 Docker 交互的工具。用户通过命令行界面(CLI)或图形界面(GUI)与 Docker 客户端进行交互,发送各种命令(如 docker rundocker builddocker pull 等)。

  • 工作方式:Docker 客户端将用户的命令发送到 Docker 守护进程(Docker Daemon),由守护进程来执行具体的操作。

  • 示例:用户在终端中运行 docker run 命令时,Docker 客户端会将该命令发送到 Docker 守护进程,由守护进程创建并启动容器。

2. Docker 守护进程(Docker Daemon)

  • 功能:Docker 守护进程是 Docker 的核心服务,负责管理 Docker 的所有操作。它运行在宿主机上,监听来自 Docker 客户端的请求,并执行相应的操作,例如创建、运行、停止容器,管理镜像等。

  • 工作方式:Docker 守护进程通过与容器运行时工具(于创建和运行容器的底层工具, 如 runc)和存储驱动(存储驱动是用于管理容器文件系统的组件, 如 OverlayFS)交互,来管理容器的生命周期和文件系统。它还负责与 Docker 注册中心(Docker Registry)通信,拉取或推送镜像。

  • 示例:当用户通过 Docker 客户端发送 docker run 命令时,Docker 守护进程会根据镜像创建容器,并启动容器中的应用程序。

3. Docker 镜像(Docker Image)

  • 功能:Docker 镜像是一个只读的模板,包含了运行容器所需的所有内容,包括代码、运行时、系统工具、系统库等。镜像是容器的构建基础,容器是从镜像启动的。

  • 特点

    • 分层架构:Docker 镜像是由多个只读层组成的。每一层代表了镜像的一个状态变化,例如安装某个软件包或修改某个配置文件。这些层是不可变的,一旦创建就不再改变。

    • 轻量级:镜像只包含必要的内容,不包含完整的操作系统,因此镜像通常比虚拟机的磁盘镜像小得多。

    • 不可变性:镜像是不可变的,一旦创建就无法修改。如果需要修改镜像,必须通过构建新的镜像来实现。

  • 示例:一个典型的 Docker 镜像可能包含一个操作系统(如 Ubuntu)、一个 Web 服务器(如 Nginx)和一个应用程序(如一个静态网站)。

4. Docker 容器(Docker Container)

  • 功能:Docker 容器是从 Docker 镜像启动的运行实例。容器是镜像的运行态,它包含了镜像中的所有内容,并在隔离的环境中运行应用程序。

  • 特点

    • 隔离性:容器通过命名空间(Namespaces)和控制组(Cgroups)等机制实现隔离,每个容器都有自己的文件系统、网络接口、进程空间等。

    • 轻量级:容器共享宿主机的内核,不需要模拟完整的操作系统,因此启动速度快,资源占用少。

    • 可移植性:容器可以轻松地在不同的宿主机之间迁移,只要宿主机上安装了 Docker,就可以运行相同的容器。

  • 生命周期:容器的生命周期从启动到停止,再到删除。用户可以通过 docker run 创建并启动容器,通过 docker stop 停止容器,通过 docker rm 删除容器。

5. Docker 注册中心(Docker Registry)

  • 功能:Docker 注册中心是一个存储和分发 Docker 镜像的服务。用户可以将自己构建的镜像推送到注册中心,也可以从注册中心拉取镜像。

  • 类型

    • 公共注册中心:Docker Hub 是最常用的公共注册中心,它提供了大量的公共镜像供用户使用。用户可以将自己的镜像推送到 Docker Hub,也可以从 Docker Hub 拉取镜像。

    • 私有注册中心:企业用户可以搭建自己的私有注册中心,用于存储和管理内部的镜像。私有注册中心可以提供更高的安全性和隐私保护。

  • 示例:用户可以通过 docker push 命令将镜像推送到 Docker Hub,通过 docker pull 命令从 Docker Hub 拉取镜像。

6. Dockerfile

  • 功能:Dockerfile 是一个文本文件,用于定义构建 Docker 镜像的步骤。它包含了一系列的指令,这些指令告诉 Docker 如何构建镜像。

  • 内容:Dockerfile 中的指令可以指定基础镜像、安装软件包、复制文件、设置环境变量、指定启动命令等。

  • 示例

    dockerfile复制

    # 基础镜像
    FROM ubuntu:20.04
    
    # 安装 Nginx
    RUN apt-get update && apt-get install -y nginx
    
    # 将本地文件复制到容器中
    COPY ./index.html /var/www/html/
    
    # 暴露端口
    EXPOSE 80
    
    # 启动命令
    CMD ["nginx", "-g", "daemon off;"]

    使用 docker build 命令可以基于 Dockerfile 构建镜像。

7. Docker 卷(Docker Volumes)

  • 功能:Docker 卷是用于持久化数据的存储机制。它允许用户将宿主机的文件系统或外部存储设备挂载到容器中,从而实现数据的持久化。

  • 类型

    • 绑定挂载(Bind Mounts):将宿主机的目录或文件挂载到容器中,容器可以访问宿主机的文件系统。

    • 命名卷(Named Volumes):由 Docker 管理的存储在宿主机上的卷,具有独立的生命周期,即使容器被删除,卷中的数据仍然保留。

    • 匿名卷(Anonymous Volumes):没有名称的卷,通常用于临时存储数据。

  • 示例

    docker run -v /data:/var/lib/mysql -d mysql

    上面的命令将宿主机的 /data 目录挂载到容器的 /var/lib/mysql 目录中,用于持久化 MySQL 数据库的数据。

 3 .docker常用命令

1. 管理 Docker 镜像

  • 拉取镜像

    docker pull [镜像名称]:[标签]

    示例:拉取最新版本的 Ubuntu 镜像

    docker pull ubuntu:latest
  • 列出本地镜像

    docker images
  • 删除镜像

    docker rmi [镜像ID或名称]

    示例:删除一个镜像

    docker rmi ubuntu:latest
  • 构建镜像

    docker build -t [镜像名称]:[标签] [Dockerfile路径]

    示例:使用当前目录下的 Dockerfile 构建镜像

    docker build -t myapp:1.0 .
  • 推送镜像到注册中心

    docker push [镜像名称]:[标签]

    示例:推送镜像到 Docker Hub

    docker push myapp:1.0

2. 管理 Docker 容器

  • 运行容器

    docker run -d -p [宿主机端口]:[容器端口] --name [容器名称] [镜像名称]:[标签]

    示例:以后台模式运行一个 Nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口

    docker run -d -p 8080:80 --name mynginx nginx:latest
  • 列出正在运行的容器

    docker ps
  • 列出所有容器(包括已停止的)

    docker ps -a
  • 停止容器

    bash复制

    docker stop [容器ID或名称]

    示例:停止一个容器

    bash复制

    docker stop mynginx
  • 启动容器

    docker start [容器ID或名称]

    示例:启动一个已停止的容器

    docker start mynginx
  • 删除容器

    docker rm [容器ID或名称]

    示例:删除一个容器

    docker rm mynginx
  • 进入容器

    docker exec -it [容器ID或名称] /bin/bash

    示例:进入一个正在运行的容器

    docker exec -it mynginx /bin/bash

3. 管理 Docker 网络

  • 列出所有网络

    docker network ls
  • 创建网络

    bash复制

    docker network create [网络名称]

    示例:创建一个自定义网络

    bash复制

    docker network create mynetwork
  • 删除网络

    bash复制

    docker network rm [网络名称]

    示例:删除一个网络

    bash复制

    docker network rm mynetwork
  • 将容器连接到网络

    bash复制

    docker network connect [网络名称] [容器名称]

    示例:将容器连接到自定义网络

    bash复制

    docker network connect mynetwork mynginx

4. 管理 Docker 卷

  • 列出所有卷

    bash复制

    docker volume ls
  • 创建卷

    bash复制

    docker volume create [卷名称]

    示例:创建一个卷

    bash复制

    docker volume create myvolume
  • 删除卷

    bash复制

    docker volume rm [卷名称]

    示例:删除一个卷

    bash复制

    docker volume rm myvolume
  • 将卷挂载到容器

    docker run -d -v [卷名称]:[容器路径] [镜像名称]

    示例:将卷挂载到容器的 /data 目录

    docker run -d -v myvolume:/data myapp:1.0

5. 其他常用命令

  • 查看容器日志

    docker logs [容器ID或名称]

    示例:查看容器的日志

    docker logs mynginx
  • 查看容器的详细信息

    docker inspect [容器ID或名称]

    示例:查看容器的详细信息

    docker inspect mynginx
  • 查看镜像的详细信息

    bash复制

    docker inspect [镜像ID或名称]

    示例:查看镜像的详细信息

    bash复制

    docker inspect ubuntu:latest
  • 清理未使用的资源

    bash复制

    docker system prune

    这个命令会清理所有未使用的镜像、容器、网络和卷。

4. Docker 镜像是什么

Docker 镜像是一个只读的模板,包含了运行容器所需的所有内容,包括代码、运行时、系统工具、系统库以及配置文件等。它类似于虚拟机中的 ISO 镜像,但更加轻量级。镜像是容器的构建基础,容器是从镜像启动的运行实例。

1. 特点

  • 分层架构:Docker 镜像是由多个只读层组成的。每一层代表了镜像的一个状态变化,例如安装某个软件包或修改某个配置文件。这些层是不可变的,一旦创建就不再改变。

  • 轻量级:镜像只包含必要的内容,不包含完整的操作系统,因此镜像通常比虚拟机的磁盘镜像小得多。

  • 不可变性:镜像是不可变的,一旦创建就无法修改。如果需要修改镜像,必须通过构建新的镜像来实现。

  • 可共享性:镜像可以通过 Docker 注册中心(如 Docker Hub)进行分发和共享。

2. Docker 镜像的加载原理

Docker 镜像的加载过程涉及到多个组件的协同工作,主要包括 Docker 守护进程、存储驱动(如 OverlayFS)以及容器运行时(如 runc)。以下是详细的加载原理:

1. 镜像的分层结构

Docker 镜像是由多个只读层组成的,每一层都代表了镜像的一个状态变化。这些层是通过 Dockerfile 中的指令逐步构建的。例如:

dockerfile复制

# 基础镜像
FROM ubuntu:20.04

# 安装 Nginx
RUN apt-get update && apt-get install -y nginx

# 将本地文件复制到容器中
COPY ./index.html /var/www/html/

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]
  • FROM 指令定义了基础镜像层。

  • RUN 指令会在基础镜像层之上创建一个新的层,并在该层中执行命令(如安装软件包)。

  • COPY 指令会将文件从宿主机复制到镜像的某个层中。

  • 每个指令都会生成一个新的层,最终这些层组合成一个完整的镜像。

2. 镜像的存储

Docker 使用存储驱动(如 OverlayFS)来管理镜像的分层结构。存储驱动负责将镜像的多个层合并为一个统一的文件系统视图。常见的存储驱动包括:

  • OverlayFS:一种联合文件系统,将多个文件系统层合并为一个统一的文件系统视图。

  • AUFS:另一种联合文件系统,与 OverlayFS 类似。

  • Btrfs:一种支持快照和联合挂载的文件系统。

3. 镜像的加载过程

当用户通过 docker run 命令启动容器时,Docker 守护进程会执行以下步骤来加载镜像:

  1. 检查本地镜像

    • Docker 守护进程首先检查本地是否已经存在指定的镜像。如果本地没有该镜像,则会从 Docker 注册中心(如 Docker Hub)拉取镜像。

  2. 加载镜像层

    • Docker 守护进程将镜像的各个层加载到内存中。由于镜像层是只读的,因此它们可以被多个容器共享,从而节省存储空间。

  3. 创建可写层

    • Docker 守护进程在镜像层之上创建一个可写层。这个可写层是容器的独立存储空间,容器中的应用程序可以在这个层中进行读写操作。容器的文件系统视图是镜像层和可写层的联合视图。

  4. 启动容器

    • Docker 守护进程调用容器运行时(如 runc)来创建容器的运行环境。容器运行时利用 Linux 内核的特性(如 namespaces 和 cgroups)来隔离容器的资源。

    • 容器运行时启动容器中的应用程序,应用程序运行在由镜像层和可写层组成的联合文件系统中。

5. 容器数据卷的主要用途

        容器数据卷(Docker Volumes)是 Docker 提供的一种数据持久化机制,用于将数据存储在容器之外,从而确保数据不会随着容器的删除而丢失。数据卷可以独立于容器的生命周期存在,即使容器被删除,数据卷中的数据仍然保留。 

  1. 数据持久化:确保容器中的数据在容器删除后仍然保留。

  2. 数据共享:在多个容器之间共享数据。

  3. 备份和恢复:方便对数据进行备份和恢复操作。

  4. 与宿主机交互:允许容器访问宿主机的文件系统。

1.容器数据卷的类型

Docker 提供了多种类型的容器数据卷,每种类型适用于不同的场景:

1. 绑定挂载(Bind Mounts)

绑定挂载是将宿主机的目录或文件直接挂载到容器中。容器可以访问宿主机的文件系统,而宿主机上的文件和目录也会实时反映在容器中。

  • 优点

    • 数据存储在宿主机上,方便直接访问和管理。

    • 数据不会随着容器的删除而丢失。

  • 缺点

    • 宿主机和容器之间的路径依赖性较强,可能会影响容器的可移植性。

  • 使用示例

    docker run -d -v /host/path:/container/path --name mycontainer myimage

    上面的命令将宿主机的 /host/path 目录挂载到容器的 /container/path 目录中。

2. 命名卷(Named Volumes)

命名卷是由 Docker 管理的存储在宿主机上的卷。它们具有独立的生命周期,即使容器被删除,卷中的数据仍然保留。命名卷通常存储在宿主机的 /var/lib/docker/volumes 目录中。

  • 优点

    • 数据存储在 Docker 管理的目录中,方便管理和维护。

    • 数据卷具有独立的生命周期,不会随着容器的删除而丢失。

  • 缺点

    • 数据存储位置由 Docker 管理,用户无法直接访问。

  • 使用示例

    docker run -d -v myvolume:/container/path --name mycontainer myimage

    上面的命令创建了一个名为 myvolume 的命名卷,并将其挂载到容器的 /container/path 目录中。

3. 匿名卷(Anonymous Volumes)

匿名卷是没有名称的卷,通常用于临时存储数据。它们在容器创建时自动创建,并在容器删除时自动删除。

  • 优点

    • 无需指定卷的名称,使用方便。

    • 适用于临时数据存储。

  • 缺点

    • 数据卷的生命周期与容器绑定,容器删除后数据也会丢失。

  • 使用示例

    docker run -d -v /container/path --name mycontainer myimage

    上面的命令创建了一个匿名卷,并将其挂载到容器的 /container/path 目录中。

2. 容器数据卷的生命周期

  • 创建

    • 绑定挂载:通过指定宿主机的路径创建。

    • 命名卷:通过 docker volume create 命令或在 docker run 时指定卷名称创建。

    • 匿名卷:在 docker run 时自动创建。

  • 使用

    • 数据卷可以通过 docker run 命令的 -v--mount 选项挂载到容器中。

  • 查看

    • 使用 docker volume ls 命令查看所有卷。

    • 使用 docker volume inspect 命令查看卷的详细信息。

  • 删除

    • 使用 docker volume rm 命令删除卷。

    • 使用 docker volume prune 命令清理未使用的卷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值