Docker

Docker

Posted by Lbb on July 8, 2022

Docker 与 Kubernetes 常用命令速查,含日常运维与故障排查。

Docker 基础命令

镜像(Image)

  • 检索镜像
    1
    
    docker search image_name
    
  • 下载镜像
    1
    
    docker pull image_name
    
  • 列出镜像;-a 显示所有,-q 仅显示 ID,--no-trunc 不截断输出
    1
    
    docker images
    
  • 删除镜像;-f 强制,按 ID 或名称指定
    1
    
    docker rmi image_name
    
  • 查看镜像的历史
    1
    
    docker history image_name
    
  • 查看镜像详细信息
    1
    
    docker inspect image_name
    

容器(Container)

容器可以理解为在沙盒中运行的进程。沙盒包含进程运行所必需的资源(文件系统、系统类库、shell 环境等),默认不运行任何程序。你需要运行一个进程来启动容器,该进程是容器的唯一进程,进程结束容器也随之停止。

  • 运行容器执行命令
    1
    
    docker run image_name echo "hello world"
    
  • 交互式进入容器
    1
    
    docker run -i -t image_name /bin/bash
    
  • 列出运行中的容器
    1
    
    docker ps
    
  • 列出所有容器(含已停止)
    1
    
    docker ps -a
    
  • 列出最近一次启动的容器
    1
    
    docker ps -l
    
  • 启动 / 停止 / 重启 / 杀死容器
    1
    2
    3
    4
    
    docker start container_name
    docker stop container_name
    docker restart container_name
    docker kill container_name
    
  • 删除容器;-f 强制,-v 同时删除关联卷
    1
    
    docker rm container_name
    
  • 查看容器日志;-f 实时跟踪,-t 显示时间戳,--tail N 只看末尾 N 行
    1
    
    docker logs -f container_name
    
  • 显示运行中容器的进程信息
    1
    
    docker top container_name
    
  • 查看容器内被改动的文件/目录(A 增加,D 删除,C 修改)
    1
    
    docker diff container_name
    
  • 在容器与宿主机之间拷贝文件
    1
    2
    
    docker cp container_name:/container_path to_path
    docker cp ID:/container_path to_path
    
  • 附加到运行中的容器(Ctrl-C 退出,容器内进程会收到信号)
    1
    
    docker attach container_name
    
  • 进入运行中的容器(推荐,比 attach 更灵活)
    1
    
    docker exec -it container_name /bin/bash
    
  • 查看容器端口映射
    1
    
    docker port container_name
    

提交与发布

  • 将容器固化为镜像(image 相当于类,container 相当于实例)
    1
    
    docker commit container_id new_image_name
    
  • 登录 registry
    1
    
    docker login
    
  • 推送镜像
    1
    
    docker push new_image_name
    

镜像迁移

把一台机器上的镜像迁移到另一台机器:

  • 保存镜像为 tar 包
    1
    
    docker save image_name -o image.tar
    
  • 从 tar 包加载镜像
    1
    
    docker load -i image.tar
    
  • 或配合 scp 使用
    1
    2
    
    docker save image_name > image.tar
    docker load < image.tar
    

构建镜像

  • 根据 Dockerfile 构建镜像;-t 指定名称和标签,--no-cache 不使用缓存,-q 抑制输出
    1
    
    docker build -t image_name Dockerfile_path
    

清理

  • 停止所有容器
    1
    
    docker stop $(docker ps -a -q)
    
  • 删除所有容器
    1
    
    docker rm $(docker ps -a -q)
    
  • 删除所有镜像
    1
    
    docker rmi $(docker images -q)
    
  • 删除悬空镜像(<none> 的 untagged 镜像)
    1
    
    docker rmi $(docker images -f "dangling=true" -q)
    
  • 清理不用的镜像、容器、网络、构建缓存(-f 跳过确认,慎用)
    1
    2
    
    docker system prune -af
    docker volume prune
    

Docker 运维与排查命令

常用运维命令

  • 查看磁盘占用(镜像、容器、卷、构建缓存)
    1
    
    docker system df
    
  • 查看容器/镜像资源占用(CPU、内存),--no-stream 只输出一次
    1
    2
    
    docker stats
    docker stats --no-stream
    
  • 查看容器详情(JSON:环境变量、挂载、网络、健康状态)
    1
    
    docker inspect container_name
    
  • 查看网络
    1
    2
    
    docker network ls
    docker network inspect network_name
    

排查命令

  • 容器启动失败/异常退出:看退出码与错误
    1
    2
    3
    
    docker inspect -f ' ' container_name
    docker logs container_name
    docker events --since 30m
    
  • 容器不断重启:查看重启次数与健康检查状态
    1
    2
    
    docker inspect -f '' container_name
    docker inspect -f '' container_name
    
  • 端口映射与占用排查
    1
    2
    
    docker ps -a --format 'table \t\t'
    ss -lntp | grep 8080
    
  • 镜像拉取失败/认证失败:观察报错,确认仓库权限后重新登录
    1
    2
    
    docker pull image_name
    docker login registry_host
    
  • 容器内 DNS/网络不通
    1
    2
    3
    
    docker exec container_name cat /etc/resolv.conf
    docker exec container_name nslookup host
    docker network inspect network_name
    

Kubernetes(K8s)常用命令

资源查看

  • 查看节点、Pod、Service 等资源;-A 全部命名空间,-o wide 显示更多信息
    1
    2
    3
    4
    5
    
    kubectl get nodes
    kubectl get nodes -o wide
    kubectl get pods -A
    kubectl get pods -n <ns> -o wide
    kubectl get svc,deploy,rs,cm,secret -n <ns>
    
  • 查看资源详情(含 Events 调度信息)
    1
    2
    
    kubectl describe pod <pod> -n <ns>
    kubectl describe node <node>
    

日志与进入容器

1
2
3
4
5
kubectl logs <pod> -n <ns>
kubectl logs -f --tail 100 <pod> -n <ns>
kubectl logs <pod> -c <container> -n <ns>          # 多容器场景指定容器
kubectl exec -it <pod> -n <ns> -- /bin/sh
kubectl exec -it <pod> -c <container> -n <ns> -- /bin/sh

排查命令

  • Pod 状态异常:常见 CrashLoopBackOff / ImagePullBackOff / Pending / Error
    1
    2
    3
    
    kubectl get pods -n <ns>            # 先看状态
    kubectl describe pod <pod> -n <ns>  # 再看 Events
    kubectl get events --sort-by=.lastTimestamp -n <ns>
    
  • CrashLoopBackOff:查看上一次崩溃的日志与退出码
    1
    2
    
    kubectl logs --previous <pod> -n <ns>
    kubectl describe pod <pod> -n <ns> | grep -A5 ExitCode
    
  • ImagePullBackOff:Events 会写明具体报错(镜像名拼写、仓库权限、认证)
  • Pending:多为节点资源不足或调度失败
    1
    2
    
    kubectl top nodes
    kubectl top pods -n <ns>
    
  • 端口转发(调试用)
    1
    2
    
    kubectl port-forward <pod> 8080:80 -n <ns>
    kubectl port-forward svc/<svc> 8080:80 -n <ns>
    
  • 重启应用:Deployment 场景下滚动重建
    1
    2
    
    kubectl rollout restart deploy/<name> -n <ns>
    kubectl delete pod <pod> -n <ns>
    
  • 查看容器环境变量与配置
    1
    2
    
    kubectl exec <pod> -n <ns> -- env
    kubectl get cm <name> -n <ns> -o yaml