尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Linux Docker 服务管理与排查实战指南(新手速查版)

Linux Docker 服务管理与排查实战指南(新手速查版) 适用人群Linux 运维新手、后端开发、DevOps 初学者1. 核心概念区分Docker 服务与容器在开始之前需要明确两个概念避免混淆Docker 服务 (Daemon)指 Docker 引擎本身dockerd。如果它挂了所有容器都会停止。容器 (Container)指运行在 Docker 里的具体应用如 Nginx、MySQL、Nacos、你的业务代码。新手提示通常我们说查看 Docker 运行既可能指查看引擎是否活着也可能指查看里面的业务容器是否正常。下文将分开讲解。2. 基础篇查看 Docker 引擎状态2.1 检查 Docker 引擎是否存活这是最基础的命令用于确认服务器上的 Docker 软件本身是否在运行。# 查看详细的服务状态推荐sudosystemctl statusdocker# 快速判断脚本常用systemctl is-activedocker输出解读active (running)正常Docker 引擎正在运行。inactive (dead)未启动需要执行sudo systemctl start docker。failed启动失败需要查看日志排查sudo journalctl -u docker.service -n 50。2.2 验证 Docker 客户端连接如果systemctl显示正常但执行docker命令报错可以用此命令验证。dockerinfo输出解读如果输出一大堆关于 Containers、Images、Storage Driver 的信息说明连接正常。如果报错Cannot connect to the Docker daemon说明服务虽然启动了但 socket 文件有问题或权限不足。此时可尝试将当前用户加入 docker 用户组sudo usermod -aG docker $USER然后重新登录。2.3 Docker 服务管理命令速查操作命令说明启动 Dockersudo systemctl start docker启动 Docker 引擎停止 Dockersudo systemctl stop docker停止引擎会停止所有容器重启 Dockersudo systemctl restart docker修改配置后常用设置开机自启sudo systemctl enable docker防止服务器重启后服务丢失查看 Docker 日志sudo journalctl -u docker.service排查引擎启动失败等问题3. 进阶篇查看与管理容器业务服务这是日常工作中最高频的操作区域。3.1 查看容器运行状态黄金命令不要只用docker ps建议养成使用格式化输出的习惯信息更直观。# 查看所有容器包括已退出的并格式化输出dockerps-a--formattable {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}参数拆解-a/--all显示所有容器不仅仅是正在运行的。--format自定义输出列。这里我们按顺序展示容器ID、名字、状态、镜像、端口映射。输出示例与解读CONTAINER IDNAMESSTATUSIMAGEPORTSa1b2c3d4e5f6nginx-webUp 2 hoursnginx:latest0.0.0.0:80-80/tcp1854247741c4mysql-dbExited (1) 5 mins agomysql:8.03306/tcpf9e8d7c6b5a4app-backendRestarting (1) 10s agomyapp:v1…状态关键字速查表状态关键字含义健康度Up x hours正在运行中正常Up x hours (healthy)正在运行且通过健康检查非常健康Up x seconds刚启动不久需观察是否稳定Exited (0)正常退出任务完成或手动停止视情况而定Exited (1)/(137)异常退出报错或被系统杀掉异常Restarting正在反复重启严重异常Created已创建但未启动未运行Paused已暂停需确认Dead无法恢复异常3.2 快速筛选特定状态的容器当服务器上有几十个容器时直接筛选更高效。# 1. 只看活着的容器默认等价于 docker psdockerps# 2. 只看死掉的容器Exiteddockerps-a--filterstatusexited# 3. 只看反复重启的容器最危险dockerps-a--filterstatusrestarting# 4. 只看已创建未启动的容器dockerps-a--filterstatuscreated3.3 查看容器日志排查神器当发现容器状态异常时日志是唯一的真相(“黑匣子”)。# 查看最后 50 行日志实时滚动dockerlogs-f--tail50容器名或ID# 查看特定时间段的日志dockerlogs--since2023-10-27T10:00:00容器名3.3.1 容器名和 ID 从哪里来在使用docker logs之前你需要知道目标容器的身份证号。容器名 (NAMES)来源通常在启动容器时通过--name参数手动指定。例如docker run --name my-nginx -d nginx。特点人类可读方便记忆。如果你没指定Docker 会自动生成一个随机的名字如happy_turing。容器 ID (CONTAINER ID)来源Docker 自动生成的唯一标识符一串十六进制字符如a1b2c3d4e5f6...。特点在命令行中通常只需要输入前 3-4 位短 ID即可唯一识别无需输入全称。3.3.2 怎么找到我要查的容器名或 ID如果你忘记了名字可以通过以下命令查找# 方法一列出所有容器人工查找dockerps-a# 方法二模糊搜索比如记得名字里带 mysqldockerps-a|grepmysql# 方法三只获取 ID适合配合其他命令使用dockerps-aq--filternamemysql# 方法四查看某个容器的详细信息包含完整的 ID、启动命令、挂载等dockerinspect容器名或ID实战技巧如果你想找跟 “mysql” 有关的容器docker ps -a | grep mysql如果你只想获取容器 ID用于脚本docker ps -q如果你想看某个容器的完整信息包括启动命令、环境变量、挂载目录等docker inspect 容器名3.3.3 常用日志查看命令假设你要排查的容器名为my-app或者用 IDa1b2代替# 1. 基础查看查看最后 100 行日志最常用dockerlogs--tail100my-app# 2. 实时跟踪像看直播一样看日志输出排查启动卡住时很有用dockerlogs-fmy-app# 按 Ctrl C 退出实时模式# 3. 带时间戳查看日志发生的具体时间dockerlogs-t--tail50my-app# 4. 搜索错误结合 grep 只看报错信息dockerlogs my-app21|grep-ierror# 5. 查看特定时间之后的日志dockerlogs--since2023-10-27T10:00:00my-app# 6. 查看特定时间之前的日志dockerlogs--until2023-10-27T12:00:00my-app# 7. 同时查看多个容器的日志dockerlogs--tail20my-app1dockerlogs--tail20my-app2技巧21的意思是将标准错误输出合并到标准输出中防止有些程序的报错信息打印在另一条流里而被 grep 漏掉。实战排查流程四步法抓日志docker logs --tail 100 容器名搜关键词docker logs 容器名 21 | grep -iE error|exception|panic|fatal缩小时间范围如果故障发生在某个时间点用--since参数缩小范围进入容器如果日志看不出问题进入容器内部检查3.4 进入容器内部调试有时候光看日志不够需要进入容器内部检查配置文件、网络、文件等。# 进入容器的 bash 终端容器需支持 bashdockerexec-it容器名/bin/bash# 进入容器的 sh 终端轻量级多数基础镜像支持dockerexec-it容器名/bin/sh# 在宿主机上执行容器内的命令不需要进入容器dockerexec容器名psauxdockerexec容器名cat/etc/hostnamedockerexec容器名env# 查看容器内的环境变量参数拆解-i/--interactive保持标准输入打开。-t/--tty分配一个伪终端。exec在运行中的容器内执行命令。3.5 资源占用监控当服务器变慢时查看是哪个容器在抢资源。# 实时查看 CPU、内存、网络、IO 占用类似 top 命令dockerstats# 查看某个容器的资源占用一次性输出不实时刷新dockerstats容器名--no-stream# 查看容器的详细资源限制dockerinspect容器名|grep-A5Memory4. 常见问题处理Troubleshooting4.1 容器处于 Restarting 状态现象docker ps显示Restarting (1) 3 seconds ago。原因容器启动命令执行失败或者主进程崩溃Docker 策略设为always导致无限重试。解决步骤立即查看日志docker logs --tail 100 容器ID常见错误配置文件路径错误、数据库连不上、端口被占用如果确定要停止重启循环dockerupdate--restartno容器名dockerstop容器名4.2 容器处于 Exited (137)现象容器意外退出退出码 137。原因OOM (Out Of Memory)。容器使用的内存超过了设定的 limit被 Linux 内核杀掉了。解决步骤验证docker inspect 容器ID | grep -i oom如果返回 true 则是内存溢出查看系统内核日志确认dmesg | grep -i out of memory | grep 容器名调整增加 Docker 内存限制或优化应用代码4.3 容器处于 Created 状态现象docker ps -a显示Created。原因容器被创建了但没有执行docker start或者启动命令Entrypoint/Cmd为空/错误。解决步骤尝试启动docker start 容器名检查配置docker inspect 容器名 | grep -A 5 Cmd如果启动后立刻变成Exited查看日志定位原因4.4 容器内时间不对现象业务日志时间与北京时间差 8 小时。原因容器默认使用 UTC 时间而宿主机是东八区。解决启动时挂载宿主机时间文件。dockerrun-v/etc/localtime:/etc/localtime:ro-v/etc/timezone:/etc/timezone:ro...4.5 磁盘空间满了No space left on device现象无法启动新容器或者日志写不进去。排查步骤# 1. 查看磁盘整体使用率df-h# 2. 查看 Docker 占用了多少空间dockersystemdf# 3. 一键清理慎用会删除所有停止的容器、未使用的网络和悬空镜像dockersystem prune# 4. 安全清理只删除未使用的镜像保留容器dockerimage prune# 5. 彻底清理删除所有未使用的镜像、停止的容器、构建缓存dockersystem prune-a# 6. 查找大日志文件Docker 容器日志可能占用几十 Gfind/var/lib/docker/containers/-name*-json.log-size1G# 7. 清空指定日志文件不删除文件只清空内容cat/dev/null/var/lib/docker/containers/长ID/长ID-json.log4.6 端口冲突现象启动容器时报错driver failed programming external connectivity。原因宿主机的端口已经被其他进程占用了。解决步骤# 1. 查看哪个进程占用了目标端口netstat-tlnp|grep端口号# 或lsof-i:端口号# 2. 杀掉占用端口的进程谨慎操作kill-9PID# 3. 或者修改容器启动时的端口映射dockerrun-p新端口:容器端口...4.7 容器无法联网现象容器内ping或curl外网超时。排查步骤# 1. 检查 Docker 网络模式dockerinspect容器名|grep-A5NetworkMode# 2. 进入容器检查 DNS 配置dockerexec容器名cat/etc/resolv.conf# 3. 检查宿主机 DNS 是否正常cat/etc/resolv.conf# 4. 重启 Docker 网络临时恢复sudosystemctl restartdocker5. Nacos 专项运维与排查实战Nacos (Naming and Configuration Service) 是微服务架构的核心组件承载了服务注册发现和配置管理两大功能。由于它一旦出问题往往是爆炸性的所有微服务失联因此需要特别关注其运行状态。5.1 快速检查 Nacos 健康状态不要只看docker ps显示UpNacos 经常会出现假死状态进程在但无法响应 HTTP 请求。# 1. 检查端口监听情况默认端口 8848# 确保状态是 LISTEN且不是 127.0.0.1除非你只允许本机访问netstat-tlnp|grep8848# 2. 使用 curl 探测控制台接口最准确# 如果返回 HTTP 200 或 HTML 内容说明服务正常curl-Ihttp://服务器IP:8848/nacos/# 3. 检查集群节点状态如果是集群模式curlhttp://服务器IP:8848/nacos/v1/ns/operator/cluster/state# 4. 查看服务注册列表确认微服务是否注册成功curlhttp://服务器IP:8848/nacos/v1/cs/services?serviceName服务名5.2 Nacos 常见故障排查场景一Nacos 启动后自动退出 (Exited)原因Nacos 对内存非常敏感默认 JVM 堆内存设置过大超过了 Docker 容器的内存限制导致被 OOM Killer 杀掉。排查命令# 查看退出码如果是 137大概率是内存溢出dockerinspect容器ID--format{{.State.ExitCode}}# 查看系统内核日志确认 OOMdmesg|grep-iout of memory|grepnacos解决方案启动时通过环境变量调小 JVM 内存。# 示例将堆内存限制为 512mdockerrun-eJVM_XMS256m-eJVM_XMX512m... nacos/nacos-server场景二微服务连不上 Nacos注册失败原因网络模式问题或 IP 漂移。Nacos 默认会注册服务器的内网 IP如果 Docker 使用了桥接模式微服务可能拿到的是错误的 IP。排查命令# 进入容器查看 Nacos 认为自己是谁dockerexec-itnacos容器IDcat/home/nacos/conf/application.properties# 查看 Nacos 启动日志中的 IP 绑定信息dockerlogsnacos容器ID|grepNacos started successfully# 查看 Nacos 启动完整日志dockerlogsnacos容器ID关键配置确保nacos.inetutils.ip-address配置的是微服务能访问到的真实 IP。场景三配置中心数据丢失或不更新原因数据库连接断开或 Derby 模式数据未持久化。注意生产环境严禁使用默认的 Derby 嵌入式数据库必须切换为 MySQL。检查命令# 检查是否连接到了外部 MySQLdockerlogsnacos容器ID|grepDataSource# 应该看到类似 HikariPool 初始化成功的日志而不是 Derby场景四Nacos 控制台无法访问排查步骤# 1. 检查容器是否在运行dockerps|grepnacos# 2. 检查端口是否正确映射dockerinspectnacos容器ID|grep-A10Ports# 3. 检查容器内部 Nacos 进程是否正常dockerexec-itnacos容器IDpsaux|grepnacos# 4. 检查防火墙是否放行了 8848 端口# CentOS/RHEL:sudofirewall-cmd --list-ports|grep8848# Ubuntu/Debian:sudoufw status|grep8848# 5. 重启 Nacos 容器dockerrestart nacos5.3 Nacos 常用运维命令速查操作命令示例说明查看实时日志docker logs -f --tail 200 nacos关注 ERROR 和 WARN进入容器调试docker exec -it nacos bashNacos 脚本通常在 /home/nacos/bin/修改启动参数docker exec -it nacos vi /home/nacos/conf/application.properties修改后需重启容器生效重启 Nacosdocker restart nacos配置修改后常用查看 Nacos 版本docker exec nacos cat /home/nacos/version.txt确认当前版本清理临时缓存rm -rf /home/nacos/data/protocol/raft高危操作仅当集群元数据损坏导致无法选主时使用5.4 Nacos 生产环境最佳实践 Checklist持久化必须挂载/home/nacos/data目录到宿主机防止容器删除后配置丢失。数据库必须使用 MySQL 8.0/5.7 作为外部存储严禁使用默认的 Derby。单机模式 vs 集群开发测试用单机模式MODEstandalone。生产环境务必使用集群模式MODEcluster至少 3 个节点。鉴权生产环境务必开启鉴权nacos.core.auth.enabledtrue并修改默认密钥防止被黑客利用上传恶意配置。内存限制通过JVM_XMS和JVM_XMX环境变量合理设置堆内存避免 OOM。日志轮转配置 Nacos 日志轮转策略防止日志文件无限增长占满磁盘。6. 附录常用命令速查表6.1 容器管理操作命令说明启动容器docker start name启动已停止的容器停止容器docker stop name优雅停止发送 SIGTERM强制停止docker kill name立即杀掉进程发送 SIGKILL重启容器docker restart name先停止再启动删除容器docker rm name需先停止或加-f强制删除创建容器不启动docker create 镜像仅创建不运行进入容器终端docker exec -it name /bin/bash交互式进入容器复制文件到容器docker cp ./file.txt name:/path/宿主机 - 容器复制文件出容器docker cp name:/path/file.txt ./容器 - 宿主机6.2 镜像管理操作命令说明列出镜像docker images查看本地所有镜像拉取镜像docker pull 镜像名从仓库下载镜像删除镜像docker rmi 镜像名删除指定镜像构建镜像docker build -t 名 .从 Dockerfile 构建查看镜像详情docker inspect 镜像名查看镜像配置信息镜像打标签docker tag 旧名 新名给镜像重命名推送镜像到仓库docker push 镜像名上传到私有/公共仓库6.3 网络与存储操作命令说明列出网络docker network ls查看 Docker 网络创建网络docker network create 名创建自定义网络列出挂载卷docker volume ls查看持久化卷创建卷docker volume create 名创建命名卷6.4 清理与监控操作命令说明实时资源监控docker stats类似 top看 CPU/内存查看系统信息docker infoDocker 引擎详细信息查看系统磁盘使用docker system dfDocker 各组件占用空间清理未使用的资源docker system prune删除停止容器、悬空镜像等彻底清理docker system prune -a删除所有未使用的镜像7. 附录容器名与 ID 速查很多新手在执行docker logs、docker exec等命令时不知道容器名或ID该填什么。以下是快速查找的方法汇总# 1. 列出所有容器显示名字和 IDdockerps-a# 2. 只列出容器 ID适合脚本中使用dockerps-q# 3. 只列出容器 ID包括已停止的dockerps-aq# 4. 按名称模糊搜索容器dockerps-a--filtername关键字# 5. 获取某个容器的完整 IDdockerinspect-f{{.Id}}容器名# 6. 获取某个容器的短 ID前 12 位dockerinspect-f{{.Id}}容器名|cut-c1-12命名规范建议容器名使用有意义的英文命名如myapp-backend、mysql-primary、nacos-cluster-1。避免使用特殊字符和下划线以外的符号。集群场景下用序号区分nacos-1、nacos-2、nacos-3。8. 附录Docker 常用启动参数速查参数说明示例-d后台运行守护进程模式docker run -d nginx-p端口映射docker run -p 8080:80 nginx-v目录挂载持久化数据docker run -v /data:/data nginx-e设置环境变量docker run -e MODEstandalone nacos--name指定容器名称docker run --name my-nginx nginx--restart重启策略--restartalways总是重启-it交互式终端docker run -it ubuntu /bin/bash--network指定网络docker run --network mynet nginx--memory内存限制docker run --memory 512m nginx--cpusCPU 限制docker run --cpus 1.5 nginx-h设置容器主机名docker run -h myhost nginx重启策略说明no不自动重启默认。on-failure容器非正常退出时才重启可指定最大重启次数on-failure:5。always无论退出状态如何总是重启。unless-stopped同 always但手动停止后不再重启。核心原则先看状态docker ps再看日志docker logs最后进容器调试docker exec。掌握这个顺序你已经可以应对绝大多数 Docker 运维问题了。
返回列表