尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Docker容器

Docker容器
📅 发布时间:2026/6/17 20:35:14

Docker 容器是 Docker 镜像的一个运行实例。它包含了运行某个软件所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器与虚拟机不同,它不需要包含完整的操作系统,而是共享主机系统的内核,这使得容器更加轻量和高效

容器本质上是一个被隔离的进程,它拥有自己的文件系统、网络空间和进程树,但与宿主机共享操作系统内核。这种轻量级的隔离方式使得容器比传统虚拟机更加高效。

1、容器的生命周期与状态管理

  • 创建(created):容器已创建但未启动
  • 运行(running):容器正在运行
  • 暂停(paused):容器进程被暂停
  • 停止(exited):容器进程已终止
  • 删除(removed):容器被彻底删除
flowchart LRA[已创建<br>Created] -->|docker start| B[运行中<br>Running]B -->|docker pause| C[暂停<br>Paused]C -->|docker unpause| BB -->|docker stop| D[已停止/退出<br>Stopped/Exited]D -->|docker start| BD -->|docker rm| E[已删除<br>Deleted]C -->|docker unpause| BB -->|发生错误| F[Dead<br>异常中止]

2、核心操作

2.1 创建与启动容器

# 创建容器但不启动
docker create --name mycontainer nginx# 创建并启动容器(最常用)
docker run --name mycontainer -d nginx# 交互式运行容器(适用于命令行工具)
docker run -it --name myshell ubuntu:22.04 /bin/bash# 自动删除容器(退出后)
docker run --rm -it alpine /bin/sh# 启动已创建/停止的容器
docker start mycontainer

docker run 命令的常用参数:

  • -d:后台运行容器
  • -it:交互式运行(通常一起使用)
  • --name:指定容器名称
  • -p:端口映射(宿主机端口:容器端口)
  • -v:挂载数据卷或绑定目录
  • --network:指定网络
  • --env 或 -e:设置环境变量
  • --restart:设置重启策略

2.2 查看容器信息

# 查看运行中的容器
docker ps# 查看所有容器(包括停止的)
docker ps -a# 查看容器详细信息(JSON格式)
docker inspect mycontainer# 查看容器日志
docker logs mycontainer# 实时查看容器日志
docker logs -f mycontainer# 查看容器内进程
docker top mycontainer# 查看容器资源使用情况
docker stats mycontainer

2.3 容器交互与操作

# 在名为 web-server 的容器中启动一个交互式的 shell (/bin/sh)
docker exec -it web-server /bin/sh
# -i (--interactive): 保持标准输入流开放
# -t (--tty): 分配一个伪终端# 在容器中执行一次性命令,例如查看环境变量
docker exec web-server env# 暂停容器
docker pause mycontainer# 恢复容器
docker unpause mycontainer# 停止容器
docker stop mycontainer# 强制停止容器
docker kill mycontainer# 删除停止的容器
docker rm mycontainer# 强制删除运行中的容器
docker rm -f mycontainer

2.4 文件操作

docker cp: 在宿主机和容器之间复制文件或目录。

# 将宿主机当前目录下的 app.conf 复制到容器的 /etc/nginx/conf.d/ 目录
docker cp app.conf web-server:/etc/nginx/conf.d/# 将容器内的 /var/log/nginx/error.log 复制到宿主机的当前目录
docker cp web-server:/var/log/nginx/error.log ./

2.5 容器资源限制

可以限制容器对 CPU、内存、磁盘 I/O 等资源的使用:

# 限制内存使用(最多512MB)
docker run -d --name memory-limited --memory=512m nginx# 限制CPU使用(最多使用1个核心的50%)
docker run -d --name cpu-limited --cpus=0.5 nginx# 限制CPU优先级(相对权重,默认1024)
docker run -d --name cpu-shares --cpu-shares=512 nginx# 限制容器内最大进程数
docker run -d --name pid-limited --pids-limit=100 nginx

3、底层技术

cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额, namespace 实现资源隔离。

3.1 cgroup

全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。

我们可以在 /sys/fs/cgroup 中找到它。

示例

  1. 还是用例子来说明,启动一个容器,设置 --cpu-shares=512

  2. 在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名

  3. 目录中包含所有与 cpu 相关的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值为 512。

  4. 同样的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是内存以及 Block IO 的 cgroup 配置。

3.2 namespace

namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。

Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User

  1. PID Namespace: 隔离进程 ID。容器内的进程看不到主机上的其他进程,认为自己才是 PID 1 的初始化进程。
  2. Network Namespace: 隔离网络设备、IP 地址、端口、路由表等。每个容器有自己的网络栈。
  3. Mount Namespace: 隔离文件系统挂载点。容器只能看到自己的文件系统视图。
  4. UTS Namespace: 隔离主机名和域名。
  5. IPC Namespace: 隔离进程间通信(IPC)资源。
  6. User Namespace: 隔离用户和用户组 ID,可以以 root 身份在容器内运行,而在宿主机上映射为普通用户,提升安全性。

4、容器配置示例

4.1 运行一个 Web 应用容器

# 运行Nginx容器,映射80端口,挂载配置和数据
docker run -d \--name mynginx \-p 8080:80 \-v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \-v nginx-data:/usr/share/nginx/html \-e TZ=Asia/Shanghai \--restart unless-stopped \nginx:alpine

此配置:

  • 将容器的 80 端口映射到宿主机的 8080 端口
  • 挂载本地配置文件(只读)
  • 使用数据卷存储网页内容
  • 设置时区环境变量
  • 配置重启策略(容器退出时除非手动停止,否则自动重启)

4.2 运行一个数据库容器

# 运行MySQL容器
docker run -d \--name mysql \-p 3306:3306 \-v mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=securepassword \-e MYSQL_DATABASE=mydb \-e MYSQL_USER=myuser \-e MYSQL_PASSWORD=mypassword \--restart always \--memory=1g \mysql:8.0 \--character-set-server=utf8mb4 \--collation-server=utf8mb4_unicode_ci

此配置:

  • 映射 3306 端口
  • 使用数据卷持久化数据库数据
  • 设置必要的环境变量(数据库密码、用户等)
  • 配置为总是重启
  • 限制最大使用 1GB 内存
  • 传递额外参数配置 MySQL 字符集

5、容器故障排查

5.1 常用排查命令

# 查看容器详细信息
docker inspect mycontainer# 查看容器日志(最后100行)
docker logs --tail=100 mycontainer# 实时查看日志
docker logs -f mycontainer# 检查容器健康状态
docker inspect --format '{{json .State.Health}}' mycontainer | jq# 进入容器调试
docker exec -it mycontainer /bin/sh# 查看容器资源使用情况
docker stats mycontainer# 检查容器网络连接
docker network inspect app-network# 查看容器端口映射
docker port mycontainer

5.2 常见问题及解决方法

1. 容器启动后立即退出

  • 检查容器是否有持续运行的进程
  • 查看日志:docker logs <container>
  • 确保不是交互式应用在非交互模式下运行

2. 无法访问容器内的服务

  • 检查端口映射是否正确:docker port <container>
  • 检查容器内服务是否正常启动
  • 检查防火墙设置
  • 检查容器网络配置
    3. 容器占用过多资源
  • 为容器设置资源限制
  • 检查容器内是否有异常进程
  • 考虑优化应用或扩展为多个容器
    4. 容器之间无法通信
  • 确认容器在同一网络
  • 检查容器是否正常运行
  • 检查容器内防火墙规则

相关新闻

  • models中integer、char、Boolean、text、datetime字段类型的常用参数设置
  • PVE跨集群迁移虚机
  • 告别资料混乱!PJMan 让项目文件管理,简单到不用找

最新新闻

  • args4j子命令实现指南:如何构建类似git的复杂命令行接口
  • c12测试策略终极指南:配置加载的单元测试与集成测试完全解析
  • Self-Replace案例研究:知名开源项目如何使用这个库实现无缝更新
  • 普陀装修指南:八家上海装修公司综合观察 - 资讯焦点
  • Arduino ESP32完整安装教程:从零开始构建物联网开发环境
  • 阿甘|张家界纯玩领队,8年只做一件事:带你好好玩张家界 - 资讯焦点

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号