Skip to content

Docker - 容器与主机

Docker 的一个显著优势是它在不同主机操作系统之间提供的一致性。尽管底层实现有所不同(Linux 上的 Docker Engine 与 Windows/Mac 上使用虚拟化/WSL2 的 Docker Desktop),但使用 CLI 与 Docker 交互的方式基本保持一致。

无论你在 Linux 服务器、安装了 Docker Desktop 的 Windows 机器,还是安装了 Docker Desktop 的 macOS 机器上运行,核心 Docker 命令的行为都是相同的。

例如:

  • docker run hello-world 会在任何平台上下载并运行测试容器。
  • docker pull ubuntu 会拉取 Ubuntu 镜像。
  • docker ps 会列出正在运行的容器。
  • docker build -t myapp . 会从 Dockerfile 构建镜像。
  • docker compose up 会启动在 docker-compose.yml 文件中定义的服务。

这种一致性简化了开发工作流程,允许开发者在其本地机器(Windows/Mac)上构建和测试容器化应用程序,并高度自信它们在生产环境(通常是 Linux)中会以相同方式运行。

虽然 Docker 命令是一致的,但仍存在一些底层差异和需要考虑的事项:

  • **容器操作系统兼容性(Container OS Compatibility):**通常,你只能在 Linux 主机上运行 Linux 容器,在 Windows 主机上运行 Windows 容器。Windows 上的 Docker Desktop 使用 WSL 2 无缝运行 Linux 容器,并且也可以切换以运行 Windows 容器(如果主机 Windows 版本支持)。Mac 上的 Docker Desktop 通过轻量级 Linux VM(虚拟机)运行 Linux 容器。
  • **文件系统路径(卷 / 绑定挂载):**当使用绑定挂载(-v /host/path:/container/path)时,主机路径语法在 Linux(/home/user/project)、Windows(C:/Users/user/project 或使用 WSL2 集成时的 /c/Users/user/project)和 macOS(/Users/user/project)之间是不同的。Docker Desktop 处理了大部分的转换,但了解这些差异是必要的。
  • **网络(Networking):**虽然 Docker 的网络概念(如 bridge、host)是相同的,但底层的实现细节不同。host 网络在 Docker Desktop 上的行为与在 Linux 上不同。
  • **性能(Performance):**由于 Docker Desktop 中的虚拟化层(VM 或 WSL2),挂载卷的文件系统 I/O 性能有时可能比原生 Linux 慢。
  • **守护进程配置(Daemon Configuration):**配置 Docker Engine 的方式不同(Linux 上是 daemon.json,Windows/Mac 上是 Docker Desktop 设置 UI)。

尽管存在这些底层差异,Docker 的抽象层确保了主要的开发者体验——通过 CLI 构建镜像、运行和管理容器——在不同平台之间保持了显著的一致性。