Docker是啥意思?

Docker,即“码头工人”,的名字灵感来自于海运集装箱(shipping container)的概念。在现代物流中,集装箱标准化了货物运输,使得货物可以在不同的运输方式(如船舶、火车、卡车)之间无缝转移。同样,Docker 通过容器化技术标准化了软件的交付和部署,使得应用程序可以在不同的计算环境中,无需麻烦的配置就可以无缝运行。

Docker 简介

  • 创立背景:Docker 最初由 Solomon Hykes 于 2013 年在一家名为 dotCloud 的公司内部项目中开发。后来,这个项目发展成为一个独立的基于go语言的Apache2.0协议开源项目,并迅速获得了广泛的关注和应用,现在github地址是:https://github.com/moby/moby。

moby 是 Docker 公司在 2017 年宣布的一个开源项目,旨在为容器化技术提供一个模块化的系统Docker 使用 Moby 项目中的组件来构建其平台。换句话说,Moby 是 Docker 的一个构建块集合,是 Docker 背后的技术基础。Moby 项目为 Docker 提供了一个实验和创新的空间,Docker 则是一个更成熟、更用户友好的产品,面向生产环境。

  • 功能:Docker 允许开发者封装应用程序及其依赖项到一个可移植的容器中,然后可以在任何支持 Docker 的机器上运行这些容器。这种方式确保了开发、测试和生产环境的一致性,减少了“在我这里可以运行”的问题。
  • 生态系统:Docker 发展出一个庞大的生态系统,包括 Docker Hub(一个容器镜像的集中存储库),以及各种工具和插件来支持容器的管理和编排。

Docker和虚拟机的关系

Docker 和虚拟机(VM)都是用于隔离应用程序和提高资源利用率的技术,但它们在实现方式和特性上有一些差异。

区别:更少的虚拟化抽象层、更快的速度

  1. 架构
    • Docker:Docker 使用容器技术,容器共享宿主机的操作系统内核。每个容器包含应用程序及其运行时环境,但不包含完整的操作系统。
    • 虚拟机:每个虚拟机运行在一个完整的操作系统上,并通过虚拟化层(Hypervisor)与宿主机硬件交互。每个 VM 包含自己的内核和操作系统实例
  2. 资源占用
    • Docker:因为共享内核,Docker 容器启动更快,占用的资源更少,非常适合需要快速启动和停止的轻量级应用。
    • 虚拟机:由于每个 VM 都运行一个完整的操作系统,启动较慢,占用更多的内存和存储空间。
  3. 性能
    • Docker:由于没有虚拟化层的开销,Docker 容器的性能接近于原生。
    • 虚拟机:性能可能会受到虚拟化层的影响,尤其是在 I/O 密集型应用中。
  4. 隔离性
    • Docker:提供进程级别的隔离,适用于需要高效资源利用的场景。
    • 虚拟机:提供操作系统级别的隔离,适合需要强隔离的场景。

当然,如果我们用windows系统下载docker desktop,会发现它会帮助我们安装WSL,WSL 允许用户在 Windows 上运行 Linux 二进制可执行文件,WSL 2使用真正的 Linux 内核,通过 Hyper-V 虚拟机技术提供更好的性能和兼容性。在 Windows 上运行 Docker 时,Docker Desktop 可以利用 WSL 2 来提供更高效的容器运行环境,提高文件系统性能。

Docker核心技术:

Docker 是一个开源的容器化平台,用于开发、部署和运行应用程序。其核心技术包含多个层面,包括容器化、镜像构建、容器编排等。

1.容器化技术

Docker 的核心是容器,它将应用程序及其依赖的环境打包在一个独立的、隔离的环境中运行。容器可以在任何支持 Docker 的机器上以相同的方式运行,无论是在开发环境、测试环境还是生产环境中。

  • 轻量级:容器共享宿主操作系统的内核,而不是像虚拟机那样运行一个完整的操作系统,因此它们比虚拟机轻量,启动速度更快。
  • 隔离性:每个容器都是相互隔离的,容器内的应用程序和宿主操作系统及其他容器不会相互干扰。

2.镜像(Images)

Docker 镜像是创建容器的模板。镜像包含了容器需要的所有内容(操作系统、应用程序、库文件等)。Docker 镜像是不可变的,一旦创建,它就不能更改。镜像可以通过 Dockerfile 来构建。

  • 镜像层次:Docker 镜像采用分层架构,多个镜像层可以共享,相同的基础层不会被重复存储,从而节省空间。
  • 版本管理:每次创建新镜像时,Docker 会为镜像打标签(如v1.0),用户可以根据标签来指定使用哪个版本的镜像。

3.Dockerfile

Dockerfile 是一个文本文件,其中包含构建 Docker 镜像的所有命令。它通过一组指令描述了如何从基础镜像开始,安装应用程序和依赖项,配置环境等。Dockerfile 是构建和自动化镜像的关键。

常见的 Dockerfile 指令包括:

  • FROM: 指定基础镜像。
  • RUN: 执行命令,如安装软件包。
  • COPY/ADD: 将文件从宿主系统复制到镜像中。
  • CMD: 容器启动时默认执行的命令。

4.引擎(Docker Engine)

Docker Engine 是 Docker 的核心组件,它是一个客户端-服务器架构,负责容器的创建、管理、调度等操作。Docker Engine 包括以下几个部分:

  • *Docker Daemon (dockerd*)**:Docker 守护进程,运行在后台,负责管理容器、镜像和网络等。
  • Docker CLI:命令行界面,用户通过它与 Docker Daemon 交互。常见的 Docker 命令如docker rundocker builddocker ps等。
  • Docker API:提供 HTTP 接口,允许程序通过 REST API 与 Docker Daemon 进行交互。

5.网络(Networking)

Docker 提供了多种网络模式来连接容器,确保它们之间可以通信。常见的网络模式包括:

  • Bridge Network:这是默认的网络模式,适用于单个主机上的容器互联。
  • Host Network:容器直接使用宿主操作系统的网络堆栈。
  • Overlay Network:用于跨多台机器(主机)上的容器之间的通信,适用于 Docker Swarm 等集群模式。
  • None Network:容器没有网络连接。

6.卷(Volumes)

Docker 卷用于持久化和共享容器的数据。容器的文件系统是临时的,一旦容器被删除,数据也会丢失。通过 Docker 卷,可以将数据持久化到宿主机的文件系统中,并且可以在多个容器之间共享。

  • 创建卷docker volume create用于创建一个新的卷。
  • 挂载卷:通过-v选项将卷挂载到容器中,例如docker run -v myvolume:/data

7.Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。它通过一个docker-compose.yml文件来定义多个容器之间的服务、网络、卷等,简化了容器化应用的管理。使用 Compose 可以轻松地启动和停止多个相互依赖的容器。

常见操作:

  • docker-compose up: 启动所有定义的服务容器。
  • docker-compose down: 停止并删除服务容器。

8.Docker Hub 和注册表(Registry)

Docker Hub 是 Docker 官方的公共镜像仓库,用户可以从中拉取公共镜像,或者上传自己构建的镜像。除了 Docker Hub,用户还可以使用私有镜像仓库(如企业内部的 Docker Registry)。

  • 推送镜像:将本地镜像推送到镜像仓库(如 Docker Hub)。
    1
    docker push <username>/<image_name>:<tag>
  • 拉取镜像:从镜像仓库拉取镜像。
    1
    docker pull <image_name>:<tag>

9.容器编排(Orchestration)

Docker 支持容器编排,主要通过Docker SwarmKubernetes来实现:

  • Docker Swarm:Docker 自带的集群管理工具,用于管理和调度多个 Docker 主机上的容器。它提供了自动化的服务部署、扩展、负载均衡等功能。
  • Kubernetes:更强大且更广泛使用的容器编排平台,通常用于大规模生产环境中。虽然 Kubernetes 是独立的项目,但 Docker 容器通常是其运行的基础。

10.安全性

Docker 提供了多种方式确保容器的安全性,主要包括:

  • 用户命名空间:将容器内的用户映射到宿主机上的非特权用户,从而提高安全性。
  • Seccomp:一个内核安全模块,用于限制容器访问宿主操作系统的系统调用。
  • AppArmor / SELinux:强化的安全机制,用于保护 Docker 容器免受潜在的恶意攻击。

此外,Docker 还支持镜像签名和内容信任功能,确保镜像的来源和内容不被篡改。