news 2026/4/27 22:15:15

docker容器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
docker容器

docker-容器

文章目录

  • docker-容器
    • 运行容器
    • 进入容器
    • 容器用途分类
    • 运行容器
    • 常用操作
    • 限制容器对内存的使用
    • 限制容器对CPU的使用
    • 容器导出导入
      • docker save 和 docker export 对比
    • 实现容器的底层技术
      • cgroup
      • namespace

运行容器

docker run=docker create + docker start

可用三种方式指定容器启动时 执行的命令

  1. CMD 指令。
  2. ENTRYPOINT 指令。
  3. 在 docker run 命令行中指定。
#使用ubuntu镜像创建容器[root@docker ~]# docker create ubuntueb1aa0ca86b2d49250ebe64913af50e88482ad68b9c3e61ef8f8da9c24b00f7a#create的容器状态时Created[root@docker ~]# docker ps -a[root@docker ~]# docker start eb1aa0ca86b2#查看容器状态,启动了又退出了[root@docker ~]# docker ps -a#使用ubuntu镜像创建容器并执行pwd命令[root@docker ~]# docker run ubuntu pwd /#查看所有正在运行中的容器[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# -a 看全部#让容器保存运行[root@docker ~]# docker run ubuntu /bin/bash -c "while true ; do sleep 1 ; echo hahaha; done"# -d 后台运行[root@docker ~]# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ; echo hahaha; done"

进入容器

#attach[root@docker ~]# docker run -d ubuntu /bin/bash -c "while true ; do sleep 1 ; echo I_am_in_container ; done"[root@docker ~]# docker attach dc508b94447f83b46080267580607569a187fcc7f780433f646e9d66949731a6I_am_in_container I_am_in_container I_am_in_container I_am_in_container#exec#格式:docker exec -it <container> bash|sh[root@docker ~]# docker exec -it dc508 bash#查看启动命令的输出[root@docker ~]# docker logs -f dc508b94447f

容器用途分类

  1. 服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后 台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
  2. 工具类容器:通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行。

运行容器

[root@docker ~]# docker run -it busybox/#/# wget www.baidu.comConnecting to www.baidu.com(223.109.82.6:80)saving to'index.html'index.html100%|********************|23810:00:00 ETA'index.html'saved /#/# exit[root@docker ~]#

常用操作

stop/start/restart

  1. stop:容器在 docker host 中实际上是一个进程, docker stop 命令本质上是向该进程发送一个 SIGTERM 信 号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号。
  2. 对于处于停止状态的容器,可以通过 docker start 重新启动。会保留容器的第一次启动时的所有参数。
  3. docker restart 可以重启容器,其作用就是依次执行 docker stop 和 docker start 。容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。 启动容器时设置 --restart 就可以达到这个效果。 如果docker run -d httpd不加–restart=always参数,attach进去ctrl+c不会重启。
  4. 只有当容器的启动进程 退出 时, --restart 才生效。
  5. 有时我们只是希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行 docker pause 。
  6. 处于暂停状态的容器不会占用 CPU 资源,直到通过 docker unpause 恢复运行。
#举例#基于httpd镜像创建容器httpd11,重启策略配置为always[root@docker ~]# docker run -d --restart=always --name httpd11 httpd7671267fabf6aafe49fe74256af8d0af07cd65e4af4222933385f3203bc0228e#查看发现多了个httpd11容器[root@docker ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"3seconds ago Up2seconds80/tcp`httpd11`27359e7cf87e httpd"httpd-foreground"About a minute ago Up About a minute80/tcp eager_northcutt#登陆到容器httpd11,然后执行ctrl_c退出容器(会触发--restart=always参数)[root@docker ~]# docker attach httpd11^C[Mon Nov1707:48:31.5827312025][mpm_event:notice][pid1:tid1]AH00491: caught SIGTERM, shutting down#发现httpd11重启了[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"32seconds ago Up2seconds80/tcp httpd11 27359e7cf87e httpd"httpd-foreground"2minutes ago Up About a minute80/tcp eager_northcutt#管理员停止httpd11(不会触发重启)[root@docker ~]# docker stop httpd11httpd11#发现httpd11没有重启[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7671267fabf6 httpd"httpd-foreground"51seconds ago Exited(0)1second ago httpd11 27359e7cf87e httpd"httpd-foreground"2minutes ago Up2minutes80/tcp eager_northcutt

限制容器对内存的使用

cgroup( Control Groups):docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的 资源配额和使用量控制。

#stress模拟压力测试的工具[root@docker dockerfile]# vim DockerfileFROM ubuntu MAINTAINER xxx"123@qq.com"RUNapt-get-y update&&apt-get-yinstallstress ENTRYPOINT["/usr/bin/stress"]# 以服务或进程的形式运行[root@docker ~]# docker build -t ubuntu-with-stress .[root@docker ~]# docker run -it -m 200M --memory-swap=300M ubuntu-with-stress --vm 1 --vm-bytes 280M -v#如果在启动容器时只指定 -m 而不指定 --memory-swap ,那么 --memory-swap 默认为 -m 的两倍。

限制容器对CPU的使用

Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。

[root@docker ~]# docker run --name "container_A" -it -c 1024 ubuntu-withstress --cpu 4 -v#使用如下命令,创建容器,则最终生成的 cgroup 的 CPU 份额配置可以下面的文件中找到。[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/<容器长ID>/cpu.shares1024#再开一个窗口,启动 container_B,cpu share 为 512[root@docker ~]# docker run --name "container_B" -it -c 512 ubuntu-withstress --cpu 4 -v[root@docker ~]# cat /sys/fs/cgroup/cpu/docker/<容器长ID>/cpu.shares512#top命令查看总比例是2:1#或者再开一个窗口看cpu使用率[root@docker docker]# docker stats#现在暂停 container_A观察cpu[root@docker ~]# docker pause container_A#top 显示 container_B 在 container_A 空闲的情况下能够用满整颗 CPU

容器导出导入

#将容器导出为一个tar包#不管此时这个容器是否处于运行状态,都可以导出为文件# 创建容器httpd1用于测试[root@docker ~]# docker run -d --name httpd1 httpde4f0a329c4df50ef0afb0bf21e22edc20e5a24c03ae64c6340aa2992d6e32525[root@docker ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4f0a329c4df httpd"httpd-foreground"3minutes ago Up3minutes80/tcp httpd1[root@docker ~]# docker export httpd1 -o myhttpd.tar[root@docker ~]# lsmyhttpd.tar[root@docker ~]# docker import myhttpd.tarsha256:9ae4699fa217a7240c73a50e93a8c1d359d22cf60869d350c8aab8b3c02aabcf[root@docker ~]# docker import myhttpd.tar myweb:v1sha256:9fcb90561d2014130ef19f9dd8af5efd7a0a4a2154907bc818ac6b887f13755c[root@docker ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE myweb v1 9fcb90561d203seconds ago 146MB<none><none>9ae4699fa21732seconds ago 146MB httpd latest 90f191b9781e11days ago 148MB hello-world latest 74cc54e27dc46months ago10.1kB

docker save 和 docker export 对比

  • docker save :将镜像保存为文件,save会保存该镜像的所有元数据和历史记录。
  • docker export :将容器导出为文件,文件会丢失所有元数据和历史记录,仅保存容器当时的状 态,再次导入会当作全新的镜像。
  • docker save导出的文件可以使用docker import导入。

实现容器的底层技术

  • cgroup 实现资源限额。
  • namespace 实现资源隔离。

cgroup

#在 /sys/fs/cgroup 中找到cgroup[root@docker docker]# docker run -it --cpu-shares 512 ubuntu-with-stress -c 1 -v#在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名。

namespace

#UTS namespace 让容器有自己的 hostname, -h简写#User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。[root@docker ~]# docker exec -it a80f1f8b692c bashroot@a80f1f8b692c:/#root@a80f1f8b692c:/# useradd gaoqd #容器中创建用户gaoqdroot@a80f1f8b692c:/#root@a80f1f8b692c:/# exitexit[root@docker ~]# su - gaoqd #宿主机中并没有用户gaoqdsu: user gaoqd does not exist#在容器中创建了用户 gaoqd,但 host 中并不会创建相应的用户。

92c bash
root@a80f1f8b692c:/#
root@a80f1f8b692c:/# useradd gaoqd #容器中创建用户gaoqd
root@a80f1f8b692c:/#
root@a80f1f8b692c:/# exit
exit
[root@docker ~]# su - gaoqd #宿主机中并没有用户gaoqd
su: user gaoqd does not exist
#在容器中创建了用户 gaoqd,但 host 中并不会创建相应的用户。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 23:00:22

PlantUML Server 终极指南:快速搭建企业级图表生成平台

PlantUML Server 终极指南&#xff1a;快速搭建企业级图表生成平台 【免费下载链接】plantuml-server PlantUML Online Server 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-server 在当今的技术开发环境中&#xff0c;可视化工具已成为不可或缺的组成部分。P…

作者头像 李华
网站建设 2026/4/20 15:42:08

Open Interpreter显存不足?低成本GPU优化部署实战案例

Open Interpreter显存不足&#xff1f;低成本GPU优化部署实战案例 1. 背景与挑战&#xff1a;本地AI编程的兴起与资源瓶颈 随着大模型在代码生成领域的深入应用&#xff0c;开发者对“自然语言驱动编程”的需求日益增长。Open Interpreter 作为一款开源、本地化运行的代码解释…

作者头像 李华
网站建设 2026/4/21 5:27:08

StructBERT情感分析镜像深度解析|CPU优化+WebUI交互实测

StructBERT情感分析镜像深度解析&#xff5c;CPU优化WebUI交互实测 1. 背景与技术选型动机 在中文自然语言处理领域&#xff0c;情感分析是一项基础且关键的任务。无论是用户评论、客服对话还是社交媒体内容&#xff0c;快速准确地识别文本情绪倾向&#xff08;正面/负面&…

作者头像 李华
网站建设 2026/4/18 23:33:21

JLink接口定义基础结构:图文并茂解析

深入理解 JLink 调试接口&#xff1a;从原理到实战的完整指南在嵌入式开发的世界里&#xff0c;调试从来不是一件“锦上添花”的事——它往往是决定项目成败的关键环节。当你面对一块刚打样的 PCB 板&#xff0c;MCU 上电却毫无反应时&#xff1b;当程序下载失败、断点无法命中…

作者头像 李华
网站建设 2026/4/20 17:27:19

Qwen3Guard-Gen-WEB部署教程:开源安全审核模型一键部署实战

Qwen3Guard-Gen-WEB部署教程&#xff1a;开源安全审核模型一键部署实战 1. 引言 1.1 业务场景描述 随着大语言模型在内容生成、智能客服、社交平台等领域的广泛应用&#xff0c;用户生成内容&#xff08;UGC&#xff09;的安全性问题日益突出。不当言论、敏感信息、恶意诱导…

作者头像 李华