Docker_harbor-网络排查以及redi排查

发布时间 2023-12-12 19:55:38作者: 辰令

仓库registry

公共仓库
     Docker Hub 这样的公共仓库	 
本地仓库
     docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库。 
	 Harbor 是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装
        还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有CA中心,而Clair则是容器安全扫描工具

离线安装harbor

安装步骤

 1.安装docker并运行
     docker  --version
	   离线环境中安装Docker之前,我们需要先安装一些依赖项。
	    这些依赖项包括containerd.io、runc、docker-ce-cli和docker-ce
 2.安装docker-compose并给执行权限  
    docker-compose --version
	   https://github.com/docker/compose/releases
	   mv docker-compose /usr/local/bin && chmod u+x /usr/local/bin/docker-compose
 3.下载harbor
      https://github.com/goharbor/harbor/releases	
 4.解压并编辑配置文件	
  root用户
      tar xzvf harbor-offline-installer-v2.9.1.tgz
	  cd harbor/ && docker load -i harbor.v2.9.1.tar.gz
	  ##修改IP web密码 数据目录 注释https
	  mv harbor.yml.tmp harbor.yaml
	  ##环境准备
	  ./prepare
	  ./install 
	  
   harbor的日志存放路径为:
     /var/log/harbor
 5.配置私有仓库执行权限
    01 /etc/docker/daemon.json
    {"insecure-registries": ["your-registry-url"]}
    insecure-registries": ["registry1的IP地址:端口号","registry2的IP地址:端口号"]
 6.验证
 01.命令行验证是否搭建成功
  docker login 10.77.3.185:8087
  Username (admin): 输入账户:admin
  Password: 输入默认密码:Harbor12345
 02.登录验证
  {hostname}:{port} 地址打开harbor服务页面并登录

docker images |grep goharbor | awk {'print $3'}	  

排查过程

 01.日志: harbor日志存储目录:/var/log/harbor
    docker 自带的日志查看	
     	docker logs  redis      
	    docker logs harbor-core
02.### Redis is running
 docker exec redis redis-cli ping	 
 docker exec redis ps -ef | grep redis
 ps -ef | grep redis
 systemctl status  redis      
03.### docker insepct 
 "Path":"/harbor/entrypoint.sh"		
 docker exec harbor-core cat  /harbor/entrypoint.sh	
 docker exec harbor-core cat  /harbor/harbor_cert.sh
 docker exec harbor-core file  /harbor/harbor_core

Docker network

1.docker network

Driver: birdge  host  none containe
说明 
 docker中,网络的配置是以json格式存在的,下面我们就来看看每种类型网络配置信息
 使用docker run 创建Docker容器,可以用–net或–network选项指定的网络模式	
  birdge 桥接网络: docker服务默认会创建一个docker0网桥,该桥接网络的名称是docker0,它是内核层连通了其他物理或虚拟网卡,
      这就是将所有容器和本地主机都放到同一个物理的网络中。
      docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通讯
	默认选择bridge的情况下,容器启动后会通过DHCP获取一个地址
  host 主机网络 :直接使用宿主机的ip地址与外界进行通信,不再需要额外进行NAT转换	 
  Container
  none-null
  自定义网络(Custom Network)
  网络配置(None Network)
容器间通信和外部(宿主机外的网络)与容器的通信。  
容器通信
     Docker 提供了容器间通信的功能,可以通过容器名称或 IP 地址进行通信
	        容器间可以通过 IP 地址相互通信 
	 外部环境和容器之间通信
	     通过宿主机的 IP 地址直接访问容器 host Port Mapping
	 自定义网络
	 
验证是否连通:
   进到database容器内部,ping web容器:docker exec -it 容器ID /bin/bash
   进到web容器内部,ping database容器	
##ping 报错 ping: socket SOCK_DGRAM 1: Permission denied   不影响
  kernel bug workaroud: echo 0 999999 |sudo tee /proc/sys/net/ipv4/ping_greouyp_range

Docker网络

EXPOSE,-p,-P,-link	
 hostPort:containerPort格式可以将本地主机特定端口映射到容器的特定端口,以实现外部访问容器的目的
  -p 5000:5000    
  显示: 0.0.0.0:5000表示本地主机5000端口上的所有ip地址  
         :::5000->5000/tcp
  -p 127.0.0.1::5000
  显示 127.0.0.1:-> 5000
docker run -p时,实际上是通过 iptables 做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
  -p 192.168.1.250:803:80
 docker在执行此命令时,是向iptables注入了一条规则将主机803映射到容器80端口
   iptables   firewalld
 跨主机通信: Overlay网络 

 PORTS: 容器的端口信息和使用的连接类型(tcp\udp)
    0.0.0.0:port1->port2/tcp 表示将主机的端口号映射到容器内部的端口号,其中0.0.0.0表示监听所有的网络接口;
         :::port1->port2/tcp 表示将主机的端口号映射到容器内部的端口号,其中:::表示监听所有的IPv6网络接口。
     port/tcp 表示容器内部的端口号和协议类型;
 port/tcp 显示有两种方法,
    一种是在Dockerfile中使用EXPOSE指令指定,另一种是在运行容器时使用--expose参数指定
	如果把一个容器内暴露端口做成了端口映射形式,那么它将不会出现在坐标容器内暴露端口的列表中。
	
--link=[]	添加连接到另一个容器
--expose=[]	开放一个端口或一组端口	
	Dockerfile中的EXPOSE只是声明,真正要暴露这个端口需要在构建容器时,使用-P选项

网络排查

网络不可达,主要现象为 ping 不通,其可能原因为
端口不可达,主要现象为可以 ping 通,但 telnet 端口不通,其可能原因为
DNS 解析异常:主要现象为基础网络可以连通,访问域名报错无法解析,访问 IP 可以正常连通
大数据包丢包:主要现象为基础网络和端口均可以连通,小数据包收发无异常,大数据包丢包
    网络不可达(ping 不通):
    端口不可达(telnet 不通):
    DNS 解析异常(域名不通)
    大数据包丢失(大包不通)
	
###net.ipv4.ping_group_range 是 Linux 系统内核中的一个参数,它可以用来配置ping命令所使用的组 ID 范围。
  该参数的默认值为 {0, 65535},即组 ID 的最小值为 0,最大值为 65535	
    删除日志方式-删除大的 log 文件
    方式一:
      cat /dev/null>$log   
      Linux执行sudo echo xxx >> 命令提示权限不够的问题
        bash -c命令。该命令可以让bash运行整条字符串命令,前加sudo使得整条命令运行时具有root权限
          sudo bash -c 'echo aa >> a.txt'	  
    方法二:
     使用tee命令。该命令可以将管道中内容写入文件,只需要对该命令赋予root权限就可以操作a.txt文件
     echo aa |sudo tee -a a.txt >/dev/null
     注意:tee命令的-a选项是追加的意思,如果不加此选项,输出文本将覆盖文件 

redis命令行

Redis默认使用6379端口作为数据访问端口
    Redis服务器默认侦听TCP端口6379
	Sentinel和Redis之间使用专用的TCP连接通信,Sentinel默认侦听TCP端口26379。(Sentinel是Redis的高可用性方案)
Redis是Remote Dictionary Server的简称,是一个由意大利人Salvatore Sanfilippo开发的key-value存储系统,
 本地启动:redis-cli
 远程启动:redis-cli -h host -p port -a password
 
 了解信息:
    ping 	   返回 PONG
    help   
    info      获取Redis服务器的信息,包括服务器状态、内存使用情况、客户端连接数等
    keys *
 数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库
     SELECT命令更换数据库,如要选择1号数据库:
         redis> SELECT 1
操作:     
 key操作命令
  String类型命令    hash类型命令    list类型命令  set类型命令 zset类型命令
 持久化命令等
  客户端发送一个ping请求,服务端回应一个pong响应
  通过 CONFIG 命令查看或设置配置项   CONFIG GET *
构成:
数据
  String: 字符串   SET 和 GET 命
  Hash: 散列       HMSET, HGET 
  List: 列表       lpush lrange 
  Set: 集合        sadd 
  Sorted Set: 有序集合 zadd 	
执行脚本的常用命令为 EVAL

### 确认redis 是否在容器内启动--检查redis配置文件--检查端口是否被占用--检查docker网络配置
ls /etc/systemd/system/ 
 /etc/systemd/system/redis.service
failed to write PID file:permission denied
   docker exec redis cat  /etc/redis.conf |grep pidfile
   docker exec redis cat  /etc/redis.conf |grep pidfile

pidfile /var/run/redis_6379.pid  # 当 Redis 以守护进程运行时,自动将 PID 写入该文件,防止重复启动

/var/run/xxx.pid 文件,用于记录进程 ID,防止启动多个进程副本。进程启动后,自动给 xxx.pid 加文件锁,
  只有获得该锁的进程才有写权限,把自身 PID 写入文件,未能成功获取该锁的进程自动退出。注意,文件锁的状态不会被子进程继承

参考

 https://goharbor.io/docs/2.9.0/install-config/download-installer/
 https://goharbor.io/docs/2.9.0/install-config/configure-yml-file/
 https://github.com/goharbor/harbor/releases	
 https://blog.csdn.net/qq_29974229/article/details/125257797