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)都是用于隔离应用程序和提高资源利用率的技术,但它们在实现方式和特性上有一些差异。
区别:更少的虚拟化抽象层、更快的速度
- 架构:
- Docker:Docker 使用容器技术,容器共享宿主机的操作系统内核。每个容器包含应用程序及其运行时环境,但不包含完整的操作系统。
- 虚拟机:每个虚拟机运行在一个完整的操作系统上,并通过虚拟化层(Hypervisor)与宿主机硬件交互。每个 VM 包含自己的内核和操作系统实例。
- 资源占用:
- Docker:因为共享内核,Docker 容器启动更快,占用的资源更少,非常适合需要快速启动和停止的轻量级应用。
- 虚拟机:由于每个 VM 都运行一个完整的操作系统,启动较慢,占用更多的内存和存储空间。
- 性能:
- Docker:由于没有虚拟化层的开销,Docker 容器的性能接近于原生。
- 虚拟机:性能可能会受到虚拟化层的影响,尤其是在 I/O 密集型应用中。
- 隔离性:
- 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 run
、docker build
、docker 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 Swarm和Kubernetes来实现:
- Docker Swarm:Docker 自带的集群管理工具,用于管理和调度多个 Docker 主机上的容器。它提供了自动化的服务部署、扩展、负载均衡等功能。
- Kubernetes:更强大且更广泛使用的容器编排平台,通常用于大规模生产环境中。虽然 Kubernetes 是独立的项目,但 Docker 容器通常是其运行的基础。
10.安全性
Docker 提供了多种方式确保容器的安全性,主要包括:
- 用户命名空间:将容器内的用户映射到宿主机上的非特权用户,从而提高安全性。
- Seccomp:一个内核安全模块,用于限制容器访问宿主操作系统的系统调用。
- AppArmor / SELinux:强化的安全机制,用于保护 Docker 容器免受潜在的恶意攻击。
此外,Docker 还支持镜像签名和内容信任功能,确保镜像的来源和内容不被篡改。