《容器的使用:从基础操作到高级实践》

一、引言

容器技术在现代软件开发和部署中扮演着至关重要的角色。它提供了一种轻量级、可移植且高效的方式来打包和运行应用程序。本文将围绕容器的使用展开,详细介绍容器操作的各个方面,帮助读者深入理解并熟练运用容器技术。

二、如何运行容器?

(一)运行容器

运行容器是使用容器技术的第一步。在 Docker 中,使用docker run命令来运行容器。例如,要运行一个简单的 Ubuntu 容器,可以在命令行中输入:

docker run -it ubuntu:latest /bin/bash

这里,-it参数表示以交互模式运行容器,并分配一个伪终端,ubuntu:latest是指定要运行的镜像,/bin/bash是容器启动后要执行的命令。

(二)让容器长期运行

有时候,我们希望容器在后台长期运行。可以使用-d参数来实现这一点。例如,运行一个后台的 Nginx 容器:

docker run -d -p 80:80 nginx:latest

其中,-p 80:80表示将容器的 80 端口映射到主机的 80 端口,这样我们就可以通过访问主机的 80 端口来访问容器内的 Nginx 服务。

三、两种进入容器的方法

(一)方法一:docker attach

docker attach可以让我们进入正在运行的容器。例如,如果有一个正在运行的容器,其 ID 为abc123,可以使用以下命令进入:

docker attach abc123

不过,使用docker attach有一个限制,就是当有多个终端同时attach到一个容器时,所有终端都会显示相同的内容,并且如果在一个终端中退出容器,会导致容器停止。

(二)方法二:docker exec

docker exec提供了一种更灵活的进入容器的方式。例如:

docker exec -it abc123 /bin/bash

这里,-it参数同样是为了以交互模式进入容器并分配伪终端。docker exec允许我们在容器运行时进入容器执行命令,而且不会影响容器的运行状态。

(三)attach VS exec

docker attach更适合于简单地查看容器的输出,而docker exec则更适合于在容器运行时执行特定的操作,如查看日志、修改配置文件等。

四、运行容器的最佳实践

(一)容器运行小结

  1. 选择合适的基础镜像:根据应用程序的需求选择合适的基础镜像,如对于小型的 Python 应用,可以选择python:alpine这种轻量级的镜像。
  2. 合理配置资源:根据应用程序的资源需求,合理配置容器的 CPU、内存等资源。
  3. 容器监控:在容器运行过程中,对容器进行监控,及时发现和解决问题。

五、容器常用操作

(一)stop/start/restart 容器

  1. 停止容器
    使用docker stop命令可以停止正在运行的容器。例如,要停止一个 ID 为def456的容器,可以使用:
docker stop def456
  1. 启动容器
    使用docker start命令可以启动已经停止的容器。例如:
docker start def456
  1. 重启容器
    docker restart则可以实现容器的重启操作,例如:
docker restart def456

(二)pause/unpause 容器

  1. 暂停容器
    docker pause可以暂停容器内的所有进程。例如:
docker pause def456
  1. 恢复容器
    使用docker unpause可以恢复暂停的容器,例如:
docker unpause def456

(三)删除容器

当不再需要某个容器时,可以使用docker rm命令删除它。不过,要删除正在运行的容器,需要先停止容器。例如:

docker stop def456
docker rm def456

(四)一张图搞懂容器所有操作

可以绘制一个容器操作的流程图,从容器的创建、运行、进入、操作到最后的删除,将各个操作及其相互关系直观地展示出来,帮助更好地理解和记忆。如下(我直接AI):

image-20250917192811866
这张图展示了一个与 Docker 操作相关的流程图,描述了不同 Docker 操作之间的关系和可能的执行路径。图中的每个节点代表一个 Docker 操作,节点之间的箭头表示操作之间的转换。以下是对图中内容的详细解释:

  1. 节点和操作

    • docker run

      :这是 Docker 的运行命令,在图中出现了多次。

      • 第一次出现的docker run(#03-092)指向Oomy操作。
      • 第二次出现的docker run(#13-221)指向docker exec操作。
    • Oomy:这是一个自定义操作,可能与内存管理相关。从docker run(#03-092)进入Oomy,然后指向Enceing操作。

    • Enceing:这也是一个自定义操作,可能与资源分配相关。从Oomy进入Enceing,然后指向3602操作。

    • 3602:这可能是一个特定的操作或状态,从Enceing进入3602,然后指向stop操作。

    • stop:这是 Docker 的停止命令,从3602进入stop,然后指向另一个stop操作。

    • docker exec:这是 Docker 的执行命令,从docker run(#13-221)进入docker exec,然后指向docker exec(#499-5003)操作。

    • docker obc:这是一个自定义操作,从docker exec(#499-5003)进入docker obc,然后指向Delete操作。

    • Delete:这是一个删除操作,从docker obc进入Delete。

    • Recurnt:这是一个递归操作,从stop进入Recurnt,然后指向Repurm操作。

    • Repurm:这是一个自定义操作,从Recurnt进入Repurm。

    • Deffe:这是一个自定义操作,从Repurm进入Deffe。

    • Creatoon:这是一个自定义操作,从docker run(#468/5601)进入Creatoon,然后指向Run操作。

    • Run:这是一个运行操作,从Creatoon进入Run,然后指向docker exec(#43945121)操作。

    • docker exec(#43945121):从Run进入docker exec(#43945121),然后指向stop操作。

  2. 操作编号

    • 每个操作节点旁边都有一个编号,这些编号可能是操作的顺序或标识符。例如,docker run(#03-092)和docker run(#13-221)表示不同的docker run操作。
  3. 流程图路径

    • 图中的箭头表示操作之间的转换路径。例如,从docker run(#03-092)开始,可以依次经过Oomy、Enceing、3602、stop等操作。

总体而言,这张图详细描述了多个 Docker 操作及其可能的执行路径,可能用于 Docker 操作的调试、优化或资源管理。

六、限制容器对内存的使用

(一)cgroup 简介

cgroup(Control Group)是 Linux 内核提供的一种机制,用于限制、记录和隔离一组进程的资源使用(如 CPU、内存、磁盘 I/O 等)。在容器中,cgroup 被广泛用于限制容器对主机资源的占用。

(二)stress 是什么?

stress 是一个 Linux 压力测试工具。在测试容器的内存限制时,可以在容器内安装并运行 stress,通过观察容器在压力下的表现来验证内存限制是否生效。

(三)内存限额

在 Docker 中,可以使用-m参数来设置容器的内存限制。例如,要将一个容器的内存限制为 512MB,可以这样运行容器:

docker run -it -m 512m ubuntu:latest /bin/bash

当在容器内运行占用大量内存的程序时,如果超过了 512MB 的限制,系统会采取相应的措施,如 OOM(Out - Of - Memory) Killer 开始工作。

七、限制容器对 CPU 的使用

  1. 在 Docker 中,可以使用--cpu - shares参数来设置容器的 CPU 权重。例如:
docker run -it --cpu - shares = 512 ubuntu:latest /bin/bash

这里,--cpu - shares的值是相对的,它决定了容器在 CPU 资源竞争时的优先级。

八、export 和 import 容器

(一)export - 导出容器

使用docker export命令可以将容器导出为一个 tar 文件。例如,要导出一个 ID 为ghi789的容器,可以使用:

docker export ghi789 > container.tar

这个 tar 文件包含了容器的文件系统内容。

(二)import - 导入容器

使用docker import命令可以将导出的 tar 文件导入为一个新的镜像。例如:

docker import container.tar my - new - image:latest

然后,可以使用这个新的镜像来运行容器。

九、实现容器的底层技术

(一)cgroup

如前所述,cgroup 是实现容器资源限制的关键技术。它通过对进程组的资源分配和限制,确保容器在主机上的合理运行。

(二)namespace

  1. Mount namespace
    Mount namespace 允许每个容器拥有独立的文件系统挂载点。例如,在一个容器内挂载了一个新的磁盘分区,不会影响到其他容器或主机的文件系统。
  2. UTS namespace
    UTS namespace 用于隔离主机名和域名。每个容器可以有自己的主机名,例如在一个容器内设置主机名为my - container,不会影响其他容器或主机的主机名。
  3. IPC namespace
    IPC namespace 用于隔离进程间通信。不同容器内的进程不能直接进行通信,确保了容器间的隔离性。
  4. PID namespace
    PID namespace 用于隔离进程 ID。每个容器都有自己独立的进程 ID 空间,例如容器内的第一个进程的 PID 通常为 1。
  5. Network namespace
    Network namespace 用于隔离网络资源。每个容器可以有自己独立的网络接口、IP 地址等,例如可以为一个容器分配一个独立的 IP 地址,使其在网络上看起来像一台独立的机器。
  6. User namespace
    User namespace 用于隔离用户和用户组。容器内可以有自己的用户和用户组设置,例如在容器内创建一个新的用户,不会影响到主机或其他容器的用户设置。

十、小结

本文全面介绍了容器的使用,从基础的运行和进入容器的方法,到容器的常用操作,再到容器资源的限制和底层技术。通过这些内容,希望读者能够对容器技术有更深入的理解,并能够在实际工作中熟练运用容器技术,提高软件开发和部署的效率和可靠性。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐