首页
常用命令
About Me
推荐
weibo
github
Search
1
linuxea:gitlab-ci之docker镜像质量品质报告
48,996 阅读
2
linuxea:如何复现查看docker run参数命令
20,462 阅读
3
Graylog收集文件日志实例
18,023 阅读
4
git+jenkins发布和回滚示例
17,602 阅读
5
linuxea:jenkins+pipeline+gitlab+ansible快速安装配置(1)
17,574 阅读
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
音乐
影视
music
Internet Consulting
最后的净土
软件交付
持续集成
gitops
devops
登录
Search
标签搜索
kubernetes
docker
zabbix
Golang
mariadb
持续集成工具
白话容器
linux基础
nginx
elk
dockerfile
Gitlab-ci/cd
最后的净土
基础命令
jenkins
docker-compose
gitops
haproxy
saltstack
Istio
marksugar
累计撰写
676
篇文章
累计收到
140
条评论
首页
栏目
ops
Openvpn
Sys Basics
rsync
Mail
NFS
Other
Network
HeartBeat
server 08
Code
Awk
Shell
Python
Golang
virtualization
KVM
Docker
openstack
Xen
kubernetes
kubernetes-cni
Service Mesh
Data
Mariadb
PostgreSQL
MongoDB
Redis
MQ
Ceph
TimescaleDB
kafka
surveillance system
zabbix
ELK Stack
Open-Falcon
Prometheus
Web
apache
Tomcat
Nginx
自动化
Puppet
Ansible
saltstack
Proxy
HAproxy
Lvs
varnish
更多
音乐
影视
music
Internet Consulting
最后的净土
软件交付
持续集成
gitops
devops
页面
常用命令
About Me
推荐
weibo
github
搜索到
26
篇与
白话容器
的结果
2019-01-21
linuxea:白话容器之Registry与Harbor的构建和使用 (26)
Registry用于保存docker镜像,包括镜像的层次结构和元数据,用户可以自己创建Registry,也可以使用官方的dockerhub,这些Registry支持第三方注册。但是这些Registry在互联网上,使用时候下载的速度不会再快,并且在实际使用中,有多数进行下载,宽带也会成为一个问题。为了达到最快的拉取目的,我们就需要自己构建Registry。Private RegistryRegistry主要用于托管镜像,Registry默认是https的,如果要使用http就需要特别的指定。为了能够使我们快速构建Registry,dockre提供了一个项目distribution,安装即可。而在docker官方已经将Registry作为镜像,由此,我们直接使用Registry镜像就可以运行Registry。Registry主要用于托管镜像,而Registry本身也是托管在容器中,容器的文件系统会随着容器的终止而删除的,Registry运行在容器后这些镜像是不能存放在容器中的,我们将它存储到存储卷内,如:网络存储。当然也可以在本地存放。这种方式很简单就可以运行起来一个Registry。如果不想使用这种方式,也可以使用docker-distribution安装docker-distribution[root@www-linuxea ~]$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo[root@www-linuxea ~]$ yum install docker-distribution -y[root@www-linuxea ~]$ rpm -ql docker-distribution /etc/docker-distribution/registry/config.yml 配置文件 /usr/bin/registry /usr/lib/systemd/system/docker-distribution.service /usr/share/doc/docker-distribution-2.6.2 /usr/share/doc/docker-distribution-2.6.2/AUTHORS /usr/share/doc/docker-distribution-2.6.2/CONTRIBUTING.md /usr/share/doc/docker-distribution-2.6.2/LICENSE /usr/share/doc/docker-distribution-2.6.2/MAINTAINERS /usr/share/doc/docker-distribution-2.6.2/README.md /var/lib/registry 仓库默认目录而后我修改了仓库目录[root@www-linuxea ~]$ mkdir /data/Registry[root@www-linuxea ~]$ cat /etc/docker-distribution/registry/config.yml version: 0.1 log: fields: service: registry storage: cache: layerinfo: inmemory filesystem: rootdirectory: /data/Registry http: addr: :5000[root@www-linuxea ~]$ systemctl start docker-distribution.service [root@www-linuxea ~]$ ss -tlnp|grep 5000 LISTEN 0 32768 *:5000 *:* users:(("registry",pid=9228,fd=3))如果5000端口正常就说明启动成功管理标签我修改了hosts,通过域名来进行打标[root@www-linuxea ~]$ echo "10.10.240.145 registry.linuxea.com" >> /etc/hosts[root@www-linuxea ~]$ cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.10.10.250 mirrors.ds.com 10.10.240.145 registry.linuxea.com而后重新打标签,将marksugar/httpd:v7 修改为registry.linuxea.com:5000/marksugar/httpd:v7[root@www-linuxea ~]$ docker tag marksugar/httpd:v7 registry.linuxea.com:5000/marksugar/httpd:v7推送默认是要使用https协议,而服务器断是http,所以这里会报错如下[root@www-linuxea ~]$ docker push registry.linuxea.com:5000/marksugar/httpd:v7 The push refers to repository [registry.linuxea.com:5000/marksugar/httpd] Get https://registry.linuxea.com:5000/v2/: http: server gave HTTP response to HTTPS client通过标记http来解决[root@www-linuxea ~]$ cat /etc/docker/daemon.json { "insecure-registries": ["registry.linuxea.com:5000"] }而后重启[root@www-linuxea ~]$ systemctl restart docker 而后再次推送[root@www-linuxea ~]$ docker push registry.linuxea.com:5000/marksugar/httpd:v7 The push refers to repository [registry.linuxea.com:5000/marksugar/httpd] e37e4dcca4e6: Pushed 7e0e76680fcf: Pushed 7e36f706b93d: Pushed 2d1436269532: Pushed 7030e9e24693: Pushed df64d3292fd6: Pushed v7: digest: sha256:9fd332615f424252c54583f31946816039a5f69d648a35034426be904c75a5e6 size: 1568推送的文件存放在存储目录下,我这里的路径位置是/data/Registry/docker/registry/v2/repositories/marksugar/httpd,在此之下是层目录和上传目录,这些文件又会链接到blobs下[root@DS-linuxea ~]$ ls /data/Registry/docker/registry/v2/repositories/marksugar/httpd _layers _manifests _uploads这些推送过的镜像如果要被pull使用,那么使用的客户端就也需要配置insecure-registriesHarborHarbor是vmware开源的镜像仓库,harbor的安装是非常麻烦的,不过可以使用compose来组合安装。而docker-compose也是一个简单的编排工具,这个编排工具中可以将docker run的命令组合在一个文件中调用,并且可以控制容器的启动顺序。docker-compose的前身是Fig,也是最早最火的编排工具,比k8s早,而后docker公司收购Fig。而在docker-compose中也有多个版本,有2,3版本我们下载离线包安装https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.2.tgz[root@www-Node61_linuxea ~]$ tar xf harbor-offline-installer-v1.6.2.tgz -C /data [root@www-Node61_linuxea ~]$ cd /data/harbor/在harbor.cfg中需要按需修改一些配置,比如hostname,而后./install.sh 在这个docker-compose中定义的文件的映射关系,启动的服务顺序,网络模式,暴露端口等都被事先预设好了,也就是精心设计过的。暂停服务:docker-compose stop重启服务:docker-compose restart启动服务:docker-compose -f ./docker-compose.yaml up -d关闭删除服务:docker-compose down[root@www-Node61_linuxea /data/harbor]# ./install.sh ... [Step 4]: starting Harbor ... Creating network "harbor_harbor" with the default driver Creating harbor-log ... done Creating harbor-adminserver ... done Creating registry ... done Creating redis ... done Creating harbor-db ... done Creating harbor-ui ... done Creating harbor-jobservice ... done Creating nginx ... done ✔ ----Harbor has been installed and started successfully.---- Now you should be able to visit the admin portal at http://registry.linuxea.com. For more details, please visit https://github.com/goharbor/harbor . ...Harbor是监听在宿主机的80端口,我们通过浏览器直接访问。用户名:admin,密码:Harbor12345vmware Harbor的开发有一大部分是中国人,大概也就是如此才会这么快就有中文支持而后可以创建普通用户普通用户也是可以创建项目,推送镜像的客户端推送镜像到仓库新建一个dev项目,而后推送,格式如下推送前需要重新修改标签推送镜像 在项目中标记镜像: docker tag SOURCE_IMAGE[:TAG] registry.linuxea.com/dev/IMAGE[:TAG] 推送镜像到当前项目: docker push registry.linuxea.com/dev/IMAGE[:TAG]NODT那么,在推送之前,我们还需要将此前的配置修改,此前使用distribution,是5000端口,此刻使用Harbor的80端口[root@www-LinuxEA ~]$ cat /etc/docker/daemon.json { "insecure-registries": ["registry.linuxea.com"] }重启[root@www-LinuxEA /data/harbor]$ systemctl restart docker打标签[root@www-LinuxEA ~]$ docker tag marksugar/httpd:v7 registry.linuxea.com/dev/httpd:v7而后登陆到Harbor[root@www-LinuxEA ~]$ docker login registry.linuxea.com Username: linuxea Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded推送即可[root@www-LinuxEA ~]$ docker push registry.linuxea.com/dev/httpd:v7 The push refers to repository [registry.linuxea.com/dev/httpd] e37e4dcca4e6: Pushed 7e0e76680fcf: Pushed 7e36f706b93d: Pushed 2d1436269532: Pushed 7030e9e24693: Pushed df64d3292fd6: Pushed v7: digest: sha256:9fd332615f424252c54583f31946816039a5f69d648a35034426be904c75a5e6 size: 1568回到Harbor,已经能够看到这些详细的信息。
2019年01月21日
3,214 阅读
0 评论
0 点赞
2019-01-18
linuxea:白话容器之CPU与内存资源限制测试(25)
配置在前面了解了容器之CPU与内存资源限制概述,我们进行简单的资源限制测试我们下载lorel/docker-stress-ng测试我们在dockerhub上选择latest版本拉取到本地[root@linuxEA-145 /data/harbor]$ docker pull lorel/docker-stress-ng Using default tag: latest latest: Pulling from lorel/docker-stress-ng c52e3ed763ff: Pull complete a3ed95caeb02: Pull complete 7f831269c70e: Pull complete Digest: sha256:c8776b750869e274b340f8e8eb9a7d8fb2472edd5b25ff5b7d55728bca681322 Status: Downloaded newer image for lorel/docker-stress-ng:latestmemory可以使用 docker run --name stress --rm lorel/docker-stress-ng --help查看帮助 -m N, --vm N start N workers spinning on anonymous mmap (-m N,- vm N启动N个工作人员在匿名mmap上旋转) --vm-bytes N allocate N bytes per vm worker (default 256MB) (--vm-bytes N为每个vm worker分配N个字节(默认为256MB) )我们先对内存进行压测使用-m 指定配置大小为256m,而后使用 --vm 2 ,一个vm的默认是256M,压测观测下[root@linuxEA-145 /data/harbor]$ docker run --name stress --rm -m 256m lorel/docker-stress-ng --vm 2 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 2 vm观测内存的使用情况[root@linuxEA-145 ~]$ docker top stress UID PID PPID C STIME TTY TIME CMD root 12685 12670 0 11:52 ? 00:00:00 /usr/bin/stress-ng --vm 2 root 12716 12685 0 11:52 ? 00:00:00 /usr/bin/stress-ng --vm 2 root 12717 12685 0 11:52 ? 00:00:00 /usr/bin/stress-ng --vm 2 root 12799 12717 70 11:52 ? 00:00:00 /usr/bin/stress-ng --vm 2 root 12810 12716 5 11:52 ? 00:00:00 /usr/bin/stress-ng --vm 2可以使用docker stats stress,内存最多使用在限制内的大小[root@linuxEA-145 ~]$ docker stats stress CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3b96828e471a stress 0.00% 255.9MiB / 256MiB 99.95% 712B / 42B 2.36GB / 20.5GB 5 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3b96828e471a stress 137.67% 255.8MiB / 256MiB 99.92% 712B / 42B 2.53GB / 21.8GB 5 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3b96828e471a stress 137.67% 255.8MiB / 256MiB 99.92% 712B / 42B 2.53GB / 21.8GB 5 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 3b96828e471a stress 139.01% 255.8MiB / 256MiB 99.91% 712B / 42B 2.69GB / 23GB 5可以看到这个内存一直在使用达99%cpu我们在验证下CPU限制使用2核心,也就是最多使用200%,运行8个进程使用(无论起多少进程,只有2核心分配)请注意,这样的限制只能使用2个cpu,那就意味着0-3的cpu任何两个都会被使用,并不固定在那一颗CPU[root@linuxEA-145 /data/harbor]$ docker run --name stress --rm --cpus 2 lorel/docker-stress-ng --cpu 8 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 8 cpu使用docker top stress观测,8个进程已经运行[root@linuxEA-145 ~]$ docker top stress UID PID PPID C STIME TTY TIME CMD root 32201 32185 0 14:19 ? 00:00:00 /usr/bin/stress-ng --cpu 8 root 32232 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32233 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32234 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32235 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32236 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32237 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32238 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8 root 32239 32201 25 14:19 ? 00:00:01 /usr/bin/stress-ng --cpu 8而CPU最多使用200[root@linuxEA-145 ~]$ docker stats stress CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 200.05% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 200.05% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 199.37% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 199.37% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 200.50% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 200.50% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS d4b2a1641d67 stress 200.10% 18.77MiB / 3.848GiB 0.48% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS假如我们没有限制,将会跑近400%,也就是全部资源被使用当然,也可以指定运行在那一颗之上。比如,限制运行在0,2上这样--cpuset-cpus 0,2 只会运行在0,2不会运行在其他的CPU核心上。[root@linuxEA-145 /data/harbor]$ docker run --name stress --rm --cpuset-cpus 0,2 lorel/docker-stress-ng --cpu 8 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 8 cpu仍然在限制内[root@linuxEA-145 ~]$ docker stats stress CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 21537336658b stress 200.76% 21.71MiB / 3.848GiB 0.55% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 21537336658b stress 200.76% 21.71MiB / 3.848GiB 0.55% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 21537336658b stress 200.29% 21.71MiB / 3.848GiB 0.55% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 21537336658b stress 200.29% 21.71MiB / 3.848GiB 0.55% 0B / 42B 0B / 0B 9 而后我们在宿主机查看top,0,2cpu已经跑满,说明限制是ok的[root@linuxEA-145 /data/harbor]$ top top - 14:25:02 up 85 days, 23:51, 4 users, load average: 2.37, 3.31, 3.04 Tasks: 167 total, 9 running, 91 sleeping, 0 stopped, 0 zombie %Cpu0 : 99.3/0.3 100[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ] %Cpu1 : 0.7/0.7 1[|| ] %Cpu2 : 100.0/0.0 100[||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||] %Cpu3 : 1.0/1.0 2[|| ] KiB Mem : 29.4/4034596 [||||||||||||||||||||||||||||| ] KiB Swap: 1.9/4190204 [|| ] PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 582 root 20 0 6924 2444 620 R 25.2 0.1 0:04.17 stress-ng-cpu 590 root 20 0 6924 2444 620 R 25.2 0.1 0:04.16 stress-ng-cpu 583 root 20 0 6924 3960 620 R 24.9 0.1 0:04.16 stress-ng-cpu 584 root 20 0 6924 3960 620 R 24.9 0.1 0:04.16 stress-ng-cpu 585 root 20 0 6924 2444 620 R 24.9 0.1 0:04.16 stress-ng-cpu 587 root 20 0 6924 2444 620 R 24.9 0.1 0:04.16 stress-ng-cpu --cpu-shares共享那如果是共享的方式就不同了共享的方式--cpu-shares,在没有使用的时候都会被吃掉,如果有其他的容器运行则分配给别人[root@linuxEA-145 /data/harbor]$ docker run --name stress --rm --cpu-shares 1024 lorel/docker-stress-ng stress --cpu 8 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 8 cpu只运行一个容器的时候,CPU 400%[root@linuxEA-145 ~]$ docker stats stress CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 399.67% 17.14MiB / 3.848GiB 0.44% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 399.67% 17.14MiB / 3.848GiB 0.44% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 400.42% 17.14MiB / 3.848GiB 0.44% 0B / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 400.42% 17.14MiB / 3.848GiB 0.44% 0B / 42B 0B / 0B 9我们在运行一个容器,也做限制为512[root@linuxEA-145 /data/harbor]$ docker run --name stress1 --rm --cpu-shares 512 lorel/docker-stress-ng stress --cpu 8 stress-ng: info: [1] defaulting to a 86400 second run per stressor stress-ng: info: [1] dispatching hogs: 8 cpu在来观测此前运行一个容器时候的stress,现在已经掉到266%左右[root@linuxEA-145 ~]$ docker stats stress CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 265.84% 17.14MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 267.23% 17.14MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 267.23% 17.14MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS dc3c61506fb9 stress 265.52% 17.14MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 而stress1的使用是133%[root@linuxEA-145 ~]$ docker stats stress1 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 2db9d935886c stress1 133.23% 17.16MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 2db9d935886c stress1 132.16% 17.16MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 2db9d935886c stress1 132.16% 17.16MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B 9 CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS 2db9d935886c stress1 133.08% 17.16MiB / 3.848GiB 0.44% 1.07kB / 42B 0B / 0B CPU资源被两个容器动态瓜分在资源紧张的情况下,可以调整--oom-kill-disadble禁用被kill,和--oom-score-adj调整优先级来尽量避免优先被kill
2019年01月18日
3,279 阅读
0 评论
0 点赞
1
2
...
13