Docker基础介绍及问题排查

一、Docker简介
1.1 什么是Docker
1.2 Docker运行原理
1.3 Docker 在新系统中的运用
二、使用Docker部署服务
2.1 部署方式的发展
2.2 Docker 环境要求
2.3 Docker基本参数和常用命令
2.4 使用Docker部署流程
三、维护&问题排查
3.1 Docker服务维护
3.2 使用Docker 部署的业务问题排查
3.3 网络问题排查
3.4 系统问题排查
1.1 什么是Docker
Docker Containerization Unlocks the Potential for Dev and Ops
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化
基本概念:
镜像(image):创建容器的只读模板
容器(container):程序运行的环境、资源集合
镜像仓库:公网存储Docker镜像的服务
私有仓库:内网存储Docker镜像的服务
Docker基础介绍及问题排查
1.2 Docker 的运行原理
docker由 namespaces、 control groups(cgroups)分层文件系统等核心技术支持
namespaces 负责环境隔离, 如 根目录、pid、用户名、进程通信(IPC)、网络通信
cgroups 负责资源隔离,如 CPU、内存、磁盘、网络带宽
分层文件系统 负责镜像、容器的文件管理

1.3 Docker 在新系统中的运用
新系统中发版平台自身、微服务、Nginx、日志收集器、日志收集服务、日志分析服务等都运行在docker中。
发版平台的进行发版、重启、下线等都是对docker进行操作
2.1 部署方式的发展:
Docker基础介绍及问题排查
2.2 Docker 环境要求:
内核、系统要求:
Docker 1.7 版本: 内核 2.6.32 以上,对应操作系统 CentOS6.8 及以上
Docker 1.13版本: 内核 3.10.x 以上,对应操作系统 CentOS7以上、Redhat7以上(不包括7.0)

权限要求:
Root权限、selinux 关闭
2.3 Docker基本参数和常用命令
2.3.1 Docker服务参数
1.7 版本: /etc/sysconfig/docker
--insecure-registry docker.bwcloud.io 指定私有仓库
--graph=/mnt/docker 指定数据盘
Docker基础介绍及问题排查
1.13 版本: /etc/docker/daemon.json
"insecure-registries": ["docker.baiwang-inner.com"],
"graph":"/data/docker"
Docker基础介绍及问题排查
2.3 Docker基本参数和常用命令
2.3.1 Docker常用命令
docker ps / docker ps -a
docker ps和docker ps -a 命令的用途为列出服务器上的docker 容器。区别在于docker ps 只列出正在运行的docker 容器,而docker ps -a 则会列出所有容器。
Docker基础介绍及问题排查
docker ps 每一列的含义:
Docker基础介绍及问题排查
其中容器id 和 容器名称可以标识一个唯一的容器,常用于其他docker命令

docker inspect 查看容器的详细信息
Docker基础介绍及问题排查
Docker基础介绍及问题排查

docker start/stop/restart
docker start 容器名或容器id 用于启动docker容器。
docker stop 容器名或容器id 用于停止docker容器。
docker restart 容器名或容器id 用于重启docker容器。
Docker基础介绍及问题排查
如图例子中,docker restart 7c22f3829412 或 docker restart registry-nginx0001 均可实现重启改容器。
注:重启之后务必执行 docker ps 或 docker ps -a 查看重启是否成功,如果重启成功容器状态应为Up,且日志和业务正常

docker images
docker images 用于列出本机所有镜像。注意区别镜像和容器。
Docker基础介绍及问题排查
docker images 每一列含义
Docker基础介绍及问题排查
Docker基础介绍及问题排查
其中 REPOSITORY:TAG 和 IMAGE ID 都可标识一个唯一的镜像,区别在于一个镜像只能有一个 IMAGE ID,可以有多个 REPOSITORY:TAG。
build.baiwang-inner.com/ops-logging-archive:0.2.0 和 docker.baiwang-inner.com/ops-logging-archive:0.2.0 为同一个镜像。

docker run
docker run 选项 镜像 启动命令 启动参数
常用选项:
-v: 卷组列表,挂载宿主机目录或文件
-d: 后台启动
-e: 设置容器环境变量
--net: 指定网络类型
--name: 指定容器名
--restart: 设置重启策略
-it: 分配一个终端并打开STDIN
--rm: 当容器退出时删除容器
docker run \
-d \
--net=host \
--name ops-archive \
--restart=always \
-v /mnt/archive:/logs \
-v /config.json:/logging/config.json \
-e TZ=Asia/Shanghai \
-e APP_HOME=ops-archive \
docker.bwcloud.io/ops-logging-archive:0.1.6 \
python /logging/logger.py
启动命令、启动参数用于覆盖镜像的启动命令和参数

docker rm –vf 容器名/容器id
用于删除一个容器。删除后只能重新用docker run 命令或重新发版产生,新的容器,所以该命令比较危险,请谨慎执行
docker rmi –f 镜像id
用于删除一个镜像
docker exec –it 容器名/容器id [命令] [命令参数]
通过容器执行命令,命令根据镜像不同可以为 bash sh mysql redis-cli 等容器中存在的命令

docker build
通过dockerfile 构建docker 镜像
docker build –f dockerfile -t docker.baiwang.com/test:1.0.0 /opt/build
Docker基础介绍及问题排查
docker commit
通过已有容器构建镜像
docker commit 容器名/容器id 镜像名

docker pull/push
docker pull REPOSITORY:TAG 从仓库中拉取一个镜像
docker push REPOSITORY:TAG 将一个镜像推至仓库中
如:docker push docker.baiwang-inner.com/ops-logging-archive:0.2.0 就是将 ops-logging-archive:0.2.0 推送至 docker.baiwang-inner.com 仓库中。

docker --help/man docker
获取更多docker命令
Docker基础介绍及问题排查
2.4 使用Docker部署流程
Docker基础介绍及问题排查
2.4 使用Docker部署流程
命令行部署:
1、git 拉取代码
2、mvn 编译代码
3、docker build/commit 构建docker 镜像
4、docker push 将镜像推送至私有仓库
5、 ssh 到对应服务器 docker pull 拉取镜像
6、 ssh 到对应服务器 docker run 创建容器
脚本部署:
1、执行编译脚本
2、执行build 脚本
3、ssh 到对应服务器上执行 deploy 脚本
运维管理平台部署:
1、创建app、选择镜像
2、点击打包
2、选择需要发版的服务
3、点击发版
运维管理平台 通过自行维护版本和构建通用镜像的方式去掉了日常部署中的构建镜像操作
Docker基础介绍及问题排查
Docker基础介绍及问题排查

3.1 Docker服务维护
systemctl start docker/service docker start 用于启动docker服务
systemctl stop docker/service docker stop 用于停止docker服务
systemctl restart docker/service docker restart 用于重启docker服务
systemctl status docker/service docker status 用于显示docker服务运行状态或报错信息

注意:此处操作的是docker服务而不是docker容器。如果将docker容器比喻为虚拟机话,docker服务相当于VMware或是kvm。
docker 服务启动失败排查思路:
1、systemctl status docker/service docker status 查看具体报错
2、 getenforce 查看selinux 是否开启,正常情况应该为 Disabled,不能为enforcing或permissive
如果有问题,修改 /etc/selinux/config, SELINUX=disabled, 重启服务器
3、 uname –a 查看内核版本是否满足要求,如内核无法满足则续升级内核或更换操作系统

3.2 使用Docker 部署的业务问题排查
使用docker 部署业务与直接部署的区别在于,docker部署的业务进程和业务依赖的环境都在docker容器中,因此部分问题排查需进入docker容器进行排查。由于docker镜像构建轻量的特点,很多镜像只包含进程运行必要的依赖,所以很多命令无法在docker容器内运行。
解决思路:
1、由于docker是特性,容器内进程本质上还是宿主机上的进程,所以部分问题可以在宿主机上直接排查
2、构建镜像时添加问题排查、调试工具 如 jstat jmap jstack等
3、通过 –v 选项将数据和日志挂载到宿主机
4、需要时在容器内安装命令
5、通过脚本或已有命令调用系统接口达到所需命令效果
如:没有 ifconfig ,可以用 cat /proc/net/dev 查看当前网卡数量
没有 top ,可以使用 ps -e -o ‘rss,command’ 查看当前进程占用的内存
3.2 使用Docker 部署的业务问题排查
举例说明:
1、故障模块定位 通过监控、报警发现异常服务器。登录服务器后 使用top -c 查看系统资源,如果发现内存不足,输入M,按内存排序,如果发现CPU 或load过高 输入P,按CPU排序,找出可疑进程 根据命令行参数 APP_NAME 或jar包名定位模块( 命令行参数显示不全时 使用 ps -ef |grep PID 查看完整命令行参数)
Docker基础介绍及问题排查
3.2 使用Docker 部署的业务问题排查
执行 docker ps  找到container 后,
执行 docker exec -it  CONTAINER_ID/NAME bash 进入容器,
执行 ps -ef |grep java |grep -v grep  找到容器内java进程号
Docker基础介绍及问题排查
故障现场保留
查看并保留jstat gc 日志 JAVA_PID=PID jstat -gcutil $JAVA_PID 1000 10 >  /mnt/logs/jstatgcdate +%Y%m%d%H%M.log
保留 jstack 日志 jstack  $JAVAPID    >  /mnt/logs/jstackdate +%Y%m%d%H%M.log 保留线程占用CPU状态 ps -mp $JAVA_PID -o THREAD,tid,time > /mnt/logs/pstiddate +%Y%m%d%H%M.log
导出二进制内存文件 jmap -dump:format=b,file=/mnt/logs/jmap_date +%Y%m%d%H%M.bin $JAVA_PID 
3.3 、网络问题排查
1 ping
测试网络是否可达、测试域名解析地址是否正确,用法:
ping ip/域名
如 ping openapi.baiwang.com
ping –c 4 192.168.1.1
Docker基础介绍及问题排查
Docker基础介绍及问题排查
退出方法: ctrl + c
2 telnet
测试端口是否可用,用法:
telnet ip/域名 端口
如 telnet openapi.baiwang.com 443
telnet openapi.baiwang.com 80
Docker基础介绍及问题排查
Docker基础介绍及问题排查
退出方法:ctrl + ]
备用命令: nc –vz ip/域名 端口
3 curl
使用curl 模拟真实业务请求或系统间调用,可以更加直观的发现问题
常用选项:
-i 打印协议头
-X 指定请求方法 GET 或 POST
-u 指定用户名密码
-k 关闭https ssl 校验
-s 安静模式
-H 设置请求头
-d 设置请求数据
例子:
删除es索引: curl -s -u "$es_username:$es_password" -XDELETE "$es_host:$es_port/$index"
发送钉钉机器人消息:
curl -i -XPOST $dingtalk_webhook -H 'content-type: application/json' -d '{ "msgtype": "text", "text": { "content": "skserver 已重启!" }, "at": { "isAtAll": true } }'
4、系统问题排查
4.1 查看硬盘是否占满
命令: df –h
Docker基础介绍及问题排查
4.2 查看内存剩余
命令: free –m/g
CentOS 6:
Docker基础介绍及问题排查
CentOS 7:
Docker基础介绍及问题排查
4、系统问题排查
4.3 查看CPU使用情况
命令: top
Docker基础介绍及问题排查
查看完整启动参数: ps –ef |grep PID
如:ps –ef |grep 7400

猜你喜欢

转载自blog.51cto.com/chinak/2635205