Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的应用场景
微服务架构:每个服务独立容器化,便于管理和扩展。
CI/CD流水线:与 Jenkins/GitLab CI 集成,实现自动化构建和测试。
开发环境标准化:新成员一键启动全套依赖服务(如数据库、消息队列)。
云原生基础:Kubernetes 等编排工具基于 Docker 管理容器集群。
核心优势
跨平台一致性:解决"在我机器上能跑"的问题,确保开发、测试、生产环境一致。
资源高效:容器直接共享主机内核,无需虚拟化整个操作系统,节省内存和 CPU。
快速部署:秒级启动容器,支持自动化扩缩容。
隔离性:每个容器拥有独立的文件系统、网络和进程空间。
核心概念
容器(Container):轻量化的运行实例,包含应用代码、运行时环境和依赖库。基于镜像创建,与其他容器隔离,共享主机操作系统内核(比虚拟机更高效)。
镜像(Image):只读模板,定义了容器的运行环境(如操作系统、软件配置等)。通过分层存储(Layer)优化空间和构建速度。
Dockerfile:文本文件,描述如何自动构建镜像(例如指定基础镜像、安装软件、复制文件等)。
仓库(Registry):存储和分发镜像的平台,如 Docker Hub(官方公共仓库)或私有仓库(如 Harbor)。
Docker网络结构
Docker 网络结构是 Docker 容器之间通信的基础,它提供了多种网络模式来满足不同的需求。以下是 Docker 网络结构的详细介绍:
默认网络模式
Bridge 模式
概述:这是 Docker 默认的网络模式。在这种模式下,Docker 会创建一个虚拟的以太网桥(默认名为
docker0
),并为每个容器分配一个虚拟的网络接口,这些接口通过桥接到docker0
上。特点:
容器之间可以通过 IP 地址进行通信。
容器与宿主机之间可以通过
docker0
桥接进行通信。容器对外部网络的访问通常需要通过 NAT(网络地址转换)来实现。
容器的 IP 地址是隔离的,不会直接暴露在外部网络上。
适用场景:适用于需要隔离容器网络,但又需要容器之间能够相互通信的场景。
Host 模式
概述:在这种模式下,容器不会获得一个独立的 IP 地址,而是直接使用宿主机的 IP 地址。容器的网络栈与宿主机共享。
特点:
容器的网络性能更高,因为它不经过 Docker 的网络虚拟化层。
容器的端口直接映射到宿主机的端口上,没有额外的端口映射机制。
容器与宿主机之间的通信非常高效。
适用场景:适用于对网络性能要求较高的场景,例如高性能的 Web 服务器或数据库服务。
Container 模式
Docker 的
container
网络模式允许新创建的容器与已存在的容器共享网络命名空间。这意味着新容器不会拥有独立的 IP 地址,而是与目标容器共享 IP 地址、端口范围和网络资源。容器间的进程通信通过lo
(loopback)网卡设备实现,但在其他资源(如文件系统和进程列表)上仍然保持隔离。
在
container
网络模式下,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过回环网络接口进行通信。这种模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。使用
container
网络模式的一个典型场景是,当需要多个容器之间共享网络配置时,可以使用该模式。例如,可以使用该模式创建一个 nginx 容器,并指定其网络模型为container
模式,和另一个已经存在的容器共享网络命名空间。这样,nginx 容器就可以直接使用另一个容器的 IP 地址和端口,无需进行额外的网络配置。