容器是可运行的镜像实例。你可以使用 Docker API
或 CLI
创建、启动、停止、移动或删除容器。你可以将容器连接到一个或多个网络、将存储附加到容器,甚至可以根据其当前状态创建新镜像。
默认情况下,容器与其他容器及其主机相对隔离。你可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。
容器由其镜像以及你在创建或启动容器时提供给它的任何配置选项定义。删除容器后,任何未存储在持久存储中的状态更改都会消失。
• 容器包含运行应用程序所需的所有软件包。换句话说,我们可以说镜像是一个模板,而容器是该模板的副本。
• 容器就像一个虚拟机。
• 当镜像在 docker
引擎上运行时,它们就变成了容器。
Docker
运行命令示例
1 | docker run -i -t ubuntu /bin/bash |
运行此命令时,会发生以下情况:
如果你本地没有 ubuntu
映像,Docker
会从你配置的注册表中拉取它,就像你手动运行了 docker pull ubuntu
一样。
Docker
会创建一个新容器,就像你手动运行了 docker container create
命令一样。
Docker
为容器分配一个读写文件系统作为其最后一层。这允许正在运行的容器在其本地文件系统中创建或修改文件和目录。
由于你没有指定任何网络选项,Docker
会创建一个网络接口以将容器连接到默认网络。这包括为容器分配 IP
地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
Docker
启动容器并执行 /bin/bash
。由于容器以交互方式运行并连接到你的终端(由于 -i
和 -t
标志),你可以使用键盘提供输入,而 Docker
会将输出记录到你的终端。
当你运行 exit
以终止 /bin/bash
命令时,容器会停止但不会被删除。你可以重新启动或删除它。
容器的关键组件:
- 文件系统:容器依赖于分层文件系统,允许添加或修改组件而不影响底层。通过允许在多个容器之间重用公共层,这有利于高效使用磁盘和快速部署。
- 镜像:容器镜像用作创建容器化应用程序的模板。镜像由文件系统快照组成,其中包含运行应用程序所需的应用程序代码、运行时、系统工具、系统库和配置文件。镜像是不可变的,这意味着一旦创建就无法更改。相反,可以通过在现有镜像之上创建新层来进行更改。
- 容器运行时:容器运行时负责在主机系统上执行和管理容器。它提供了一个用于构建、运行和管理容器的接口,从而消除了与底层操作系统内核交互的复杂性。流行的容器运行时包括
Docker
、containerd
、rkt
和CRI-O
。 - 编排:容器编排平台可自动跨主机集群部署、扩展和管理容器化应用程序。它们提供服务发现、负载平衡、健康监测、自动扩展和滚动更新等功能,以确保高可用性和容错能力。
Kubernetes
、Docker Swarm
和Nomad
是生产环境中流行的容器编排解决方案。
容器的优势:
- 可移植性:容器封装了应用程序及其依赖项,使其可以在从开发到生产的不同环境中移植。
- 隔离性:容器将应用程序与底层基础架构隔离,防止冲突并确保部署的一致性。
- 效率:容器共享主机操作系统的内核,与虚拟机相比,可实现高效的资源利用率和更快的启动时间。
- 可扩展性:容器旨在水平扩展,可快速部署和扩展应用程序以满足不断变化的需求。
DevOps
支持:容器通过简化开发、测试和部署流程来促进DevOps
实践,从而加快交付速度并改善开发和运营团队之间的协作。
容器用例:
- 微服务架构:容器是构建和部署基于微服务的应用程序的理想选择,其中每个组件都在其容器中运行,从而实现灵活性和可扩展性。
- 持续集成/持续部署 (
CI/CD
):容器通过提供一致的应用程序测试和部署环境来促进CI/CD
管道,从而缩短发布周期并提高软件质量。 - 混合云部署:容器通过抽象底层基础架构来简化混合云部署,允许应用程序在本地数据中心和公共云环境中无缝运行。
- 旧版应用程序现代化:容器通过容器化旧版应用程序来实现其现代化,使其更具可移植性、可扩展性和更易于管理