04.容器的使用
《容器的使用:从基础操作到高级实践》
文章目录
一、引言
容器技术在现代软件开发和部署中扮演着至关重要的角色。它提供了一种轻量级、可移植且高效的方式来打包和运行应用程序。本文将围绕容器的使用展开,详细介绍容器操作的各个方面,帮助读者深入理解并熟练运用容器技术。
二、如何运行容器?
(一)运行容器
运行容器是使用容器技术的第一步。在 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则更适合于在容器运行时执行特定的操作,如查看日志、修改配置文件等。
四、运行容器的最佳实践
(一)容器运行小结
- 选择合适的基础镜像:根据应用程序的需求选择合适的基础镜像,如对于小型的 Python 应用,可以选择
python:alpine这种轻量级的镜像。 - 合理配置资源:根据应用程序的资源需求,合理配置容器的 CPU、内存等资源。
- 容器监控:在容器运行过程中,对容器进行监控,及时发现和解决问题。
五、容器常用操作
(一)stop/start/restart 容器
- 停止容器
使用docker stop命令可以停止正在运行的容器。例如,要停止一个 ID 为def456的容器,可以使用:
docker stop def456
- 启动容器
使用docker start命令可以启动已经停止的容器。例如:
docker start def456
- 重启容器
docker restart则可以实现容器的重启操作,例如:
docker restart def456
(二)pause/unpause 容器
- 暂停容器
docker pause可以暂停容器内的所有进程。例如:
docker pause def456
- 恢复容器
使用docker unpause可以恢复暂停的容器,例如:
docker unpause def456
(三)删除容器
当不再需要某个容器时,可以使用docker rm命令删除它。不过,要删除正在运行的容器,需要先停止容器。例如:
docker stop def456
docker rm def456
(四)一张图搞懂容器所有操作
可以绘制一个容器操作的流程图,从容器的创建、运行、进入、操作到最后的删除,将各个操作及其相互关系直观地展示出来,帮助更好地理解和记忆。如下(我直接AI):

这张图展示了一个与 Docker 操作相关的流程图,描述了不同 Docker 操作之间的关系和可能的执行路径。图中的每个节点代表一个 Docker 操作,节点之间的箭头表示操作之间的转换。以下是对图中内容的详细解释:
-
节点和操作
-
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操作。
-
-
操作编号
- 每个操作节点旁边都有一个编号,这些编号可能是操作的顺序或标识符。例如,
docker run(#03-092)和docker run(#13-221)表示不同的docker run操作。
- 每个操作节点旁边都有一个编号,这些编号可能是操作的顺序或标识符。例如,
-
流程图路径
- 图中的箭头表示操作之间的转换路径。例如,从
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 的使用
- 在 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
- Mount namespace
Mount namespace 允许每个容器拥有独立的文件系统挂载点。例如,在一个容器内挂载了一个新的磁盘分区,不会影响到其他容器或主机的文件系统。 - UTS namespace
UTS namespace 用于隔离主机名和域名。每个容器可以有自己的主机名,例如在一个容器内设置主机名为my - container,不会影响其他容器或主机的主机名。 - IPC namespace
IPC namespace 用于隔离进程间通信。不同容器内的进程不能直接进行通信,确保了容器间的隔离性。 - PID namespace
PID namespace 用于隔离进程 ID。每个容器都有自己独立的进程 ID 空间,例如容器内的第一个进程的 PID 通常为 1。 - Network namespace
Network namespace 用于隔离网络资源。每个容器可以有自己独立的网络接口、IP 地址等,例如可以为一个容器分配一个独立的 IP 地址,使其在网络上看起来像一台独立的机器。 - User namespace
User namespace 用于隔离用户和用户组。容器内可以有自己的用户和用户组设置,例如在容器内创建一个新的用户,不会影响到主机或其他容器的用户设置。
十、小结
本文全面介绍了容器的使用,从基础的运行和进入容器的方法,到容器的常用操作,再到容器资源的限制和底层技术。通过这些内容,希望读者能够对容器技术有更深入的理解,并能够在实际工作中熟练运用容器技术,提高软件开发和部署的效率和可靠性。
更多推荐



所有评论(0)