容器

容器技术是一种虚拟化技术,用于在操作系统级别隔离应用程序及其依赖,以实现更高效、可移植和可扩展的软件部署。传统上,虚拟化技术通过在物理服务器上模拟多个虚拟机来实现隔离,每个虚拟机都运行完整的操作系统和应用程序。然而,这种方式通常会导致资源消耗较高,启动时间较长。

容器技术的目标是克服传统虚拟化的一些限制,提供更轻量级、更快速的应用程序隔离和部署方案。容器不需要模拟完整的操作系统,而是共享宿主操作系统的内核,并将应用程序及其运行时环境、依赖等打包到一个封闭的运行环境中—这个封闭的环境被称为容器。容器之间相互隔离,但与宿主操作系统共享资源,因此可以更高效地运行多个容器实例。

一些常见的容器技术包括 Docker\text {Docker}Podman\text {Podman}。容器技术的主要优势包括:

  1. 轻量级:容器相对于虚拟机来说更加轻量,因为它们共享操作系统内核,无需模拟整个操作系统。
  2. 快速启动:由于容器不需要启动完整的操作系统,它们的启动时间比虚拟机更短,可以更快地部署和扩展应用。
  3. 可移植性:容器将应用程序及其所有依赖打包到一个封闭环境中,使得应用程序在不同环境中的部署更加一致,减少了因环境差异而导致的问题。
  4. 资源利用率:由于容器共享宿主操作系统的内核,它们的资源利用率较高,可以在相同的硬件上运行更多的应用实例。
  5. 可扩展性:容器可以根据需求快速地进行扩展,适应不同的负载情况。

容器技术已经在现代软件开发和部署中变得非常流行,特别是在微服务架构和持续集成/持续交付(CI/CD)流程中,容器技术带来了更高效、可靠和灵活的解决方案。

容器标准化

容器的标准化是指制定通用规范和标准,以确保不同容器技术在各种环境中能够互操作,使容器具有更高的可移植性、互换性和一致性。容器标准化有助于减少供应商锁定,简化应用程序的部署和管理,并促进整个容器生态系统的发展。

以下是几个与容器标准化相关的主要标准和倡议:

  1. OCI(Open Container Initiative):OCI是一个Linux基金会托管的项目,旨在定义容器运行时和镜像格式的开放标准。OCI制定了运行时规范(runtime specification)和镜像规范(image specification),其中运行时规范定义了容器运行时的行为和API,而镜像规范定义了容器镜像的格式和结构。Docker和Containerd等容器工具都遵循OCI标准。
  2. CNCF(Cloud Native Computing Foundation):CNCF是一个致力于推动云原生计算发展的组织,它管理多个与容器相关的开源项目,包括Kubernetes、Prometheus、Envoy等。这些项目在容器编排、监控、服务发现等领域提供了标准化的解决方案,有助于构建云原生应用。
  3. CNI(Container Networking Interface):CNI是一个用于定义容器网络接口的规范,它允许容器运行时使用不同的网络插件来实现网络功能,如网络配置、IP分配、路由等。CNI有助于确保不同容器运行时在网络方面的兼容性。
  4. Kubernetes: Kubernetes是一个用于容器编排和管理的开源平台,它提供了一套标准化的API和机制,用于自动化部署、扩展、管理容器化应用程序。Kubernetes有助于推动容器应用的标准化和规范化。
  5. SPIFFE(Secure Production Identity Framework For Everyone):SPIFFE是一个安全身份验证和授权框架,旨在为容器和微服务提供标准化的身份认证和授权方案,以解决多个服务之间的身份验证和信任问题。

这些标准和倡议共同推动了容器技术的标准化和互操作性,使得不同容器技术可以更加无缝地集成和协同工作,从而提高了容器生态系统的稳定性和可靠性。

在 Linux 系统上安装 Docker

查看安装脚本

 

下载脚本

1
curl -fsSL get.docker.com -o get-docker.sh

执行脚本

1
sh get-docker.sh

验证安装(版本)

1
docker version

Image vs Container

Docker Image(镜像)Docker\text {Docker} 镜像是一个只读的、轻量级的、可执行的软件包,其中包含了运行特定应用程序所需的所有内容,包括代码、运行时、系统工具、库文件和依赖项。镜像是应用程序在特定时间点的静态快照,可以看作是一个模板,从中可以创建多个容器实例。

Docker Container(容器)Docker\text {Docker} 容器是从 Docker 镜像创建的可运行实例。容器是一个独立的、隔离的运行环境,其中包含了镜像中的应用程序和其所需的所有资源。容器提供了一种轻量级、一致性强、可移植的方式来打包、分发和运行应用程序。容器化应用程序之间是相互隔离的,因此它们可以在同一台主机上同时运行,而不会互相干扰。

Image VS Container\text {Image VS Container}

  • 镜像是容器的基础。在创建容器之前,需要首先构建一个镜像,该镜像包含了应用程序的所有依赖项和配置。
  • 容器是镜像的运行实例。通过使用特定的镜像,可以创建一个或多个容器,每个容器都是独立的、隔离的运行环境,可以在其中运行应用程序。

执行相关 docker 命令出现问题

容器基本操作

容器的创建

Usage\text {Usage}

1
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

Create and run a new container from an image.\text {Create and run a new container from an image.}

Aliases\text {Aliases}docker container run,docker run

容器的列出

  • 正在运行

Usage\text {Usage}

1
docker container ls [OPTIONS]

List containers\text {List containers}

Aliases\text {Aliases} docker container ls, docker container list, docker container ps, docker ps

  • 正在运行 && 已经停止

二者区别(列出的容器运行状态划分):

### 容器的停止

Usage\text {Usage}

1
docker container stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers\text {Stop one or more running containers}

Aliases\text {Aliases} docker container stop, docker stop

容器的删除

未停止不能删除(可以添加参数-f

1
docker container rm [OPTIONS] CONTAINER [CONTAINER...]

Remove one or more containers\text {Remove one or more containers}

Aliases\text {Aliases} docker container rm, docker container remove, docker rm

容器的批量操作

  • 容器的批量停止:
    • 法一:docker container stop <name or ID>...
    • 法二:docker container stop $(docker container ps -aq)
  • 容器的批量删除:
    • 法一:docker container rm <name or ID>...
    • 法二:docker container rm $(docker container ps -aq)

容器的各种模式

attach\text {attach} 模式和 detach\text {detach} 模式是 Docker\text {Docker} 容器的两种不同运行模式,分别控制容器是否与终端交互以及容器运行后的状态。

Attach 模式:在 attach\text {attach} 模式下,容器会连接到当前终端,允许用户与容器交互。这意味着容器的标准输入(stdin\text {stdin})、标准输出(stdout\text {stdout})和标准错误(stderr\text {stderr})将直接连接到终端。可以在容器内执行命令,并在终端上查看输出。但是,如果关闭了终端,容器也会停止运行。

Detach 模式:在 detach\text {detach} 模式下,容器以后台守护进程方式运行,不会连接到当前终端。容器会继续在后台运行,即使关闭了终端窗口,也不会影响容器的运行。

attach 模式

1
docker container run -p 80:80 nginx

CTRL + C\text {CTRL + C} 可以退出

detach 模式

1
docker container run -d -p 80:80 nginx

刷新命令行无结果显示,需要切换到 attach\text {attach} 模式退出:


连接到 Docker 容器的 shell

创建一个容器并进入交互式模式:docker container run -it

在一个已经运行的容器进入交互式模式:docker container exec -it