0、docker
0.0 docker 介绍
Docker官网:链接
Docker中文社区:链接
Docker Hub :链接
DevOps 开发运维
CI/CD 持续集成 持续部署
DockerHub 简书参考链接
什么是 DockerHub 以及为什么它很重要?
DockerHub 是一个由 Docker 公司运行和管理的基于云的存储库。它是一个在线存储库,Docker 镜像可以由其他用户发布和使用。有两种库:公共存储库和私有存储库。如果你是一家公司,你可以在你自己的组织内拥有一个私有存储库,而公共镜像可以被任何人使用。
你也可以使用公开发布的官方 Docker 镜像。DockerHub 上发布了数千镜像供你使用。DockerHub 作为默认存储库硬编码到 Docker 中,所以当你对任何镜像运行 docker pull 命令时,它将从 DockerHub 下载。
镜像和容器
通过镜像启动一个容器,一个镜像是一个可执行的包,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量和配置文件。
容器是镜像的运行实例,当被运行时有镜像状态和用户进程,可以使用docker ps 查看。
大白话讲解Docker是什么?
容器(动态),镜像运行实体(静态)
容器和虚拟机的区别?
虚拟机:就是模拟正泰机器包含硬件,每台虚拟机都需要自己的操作系统,虚拟机开启了,预分配资源全部被占用。
docker:和宿主机共享硬件资源及操作系统实现资源动态分配,与其他容器共享内核。
docker启动属于秒级,虚拟机启动需要几分钟
docker轻量,占用资源很少,一般一个容器才几十M
docker容器创建 删除 都是分钟的
- 查看内存:free -lh
- 查看版本:cat /etc/lsb-release
- 内核详细信息:cat /etc/os-release
- 内核基本信息:uname -r
- 显卡:nvidia-smi
- cuda版本:nvcc -V
nvidia-docker2的安装需要和docker版本一致,因此需要查询本地docker版本
sudo docker -v
然后查询可安装的nvidia-docker2及nvidia-container-runtime
apt-cache madison nvidia-docker2 nvidia-container-runtime
查看NVIDIA-Docker版本和docker版本:
nvidia-docker version
0.1 docker基本指令
基本指令:
搜索镜像:docker search
获取镜像: docker pull
查看镜像:docker images
删除镜像:docker rmi
重启docker:systemctl start docker
docker版本:docker -v
随机启动nginx 容器 随机端口 docker run -d -p 80:80 --name mynginx nginx -d表示后台运行 --name 别名
查看容器启动情况: docker ps
进入容器:docker exec -it id /bin/bash
查看日志情况:docker logs Name/ID
查看最近20行日志:docker logs -f --tail -20 id
显示一个运行的容器里面的进程信息:docker top id
停止容器:docker stop id
启动容器:docker start id
查看容器启动情况:docker ps
查询所有容器:docker ps -a
强制停止容器:docker kill id
删除容器:docker rm id
强制删除容器:docker rm -f id
查看容器日志:docker logs id
首先docker images 查看容器名称和别名
批量停止容器:docker rm -f $(docker ps -aq)
docker run -d -p 81:80 --name myngin1 nginx
查看docker的硬盘空间使用情况:docker system df
0.2 docker 实例
eg:
sudo docker pull ubuntu #下拉一个镜像,如果本地没有进行网上下载
sudo docker run -i -t ubuntu /bin/bash #i 交互式操作 t 代表一个终端 ubuntu:镜像名字 /bin/bash 交互式shell 指令运行后进入ubuntu终端
cd home #进入ubuntu home 目录
exit #退出这个容器
sudo docker ps #查询运行的容器
sudo docker ps -a #查询所有的容器 包括没有运行的容器
sudo start id # 启动停止的容器
sudo docker ps # 查看上条指令是否启动容器
sudo docker run -i -t -d --name ubuntu-test ubuntu /bin/bash #d 后台使用 name进行名字命名
sudo docker stop id #停止容器
sudo docker ps # 查看是否停止容器
sudo docker restart id # 重启停止的容器
sudo docker ps # 查看容器是否重启
sudo docker attach id #进入终端
exit # 退出
sudo docker ps # 查看容器状态 容器退出终止
sudo docker restart id # 启动容器
sudo docker ps # 查看是否启动 启动
sudo docker exec -it id /bin/bash #进入容器
exit # 退出容器
sudo docker ps # 容器没有终止
###########容器导出导入
mkdir ubuntu-t #创建文件夹
cd ubuntu-t # 进入文件夹
sudo docker export id > ubuntu.tar #导出
ls # 显示ubuntu.tar 导出成功
cat /ubuntu.tar | sudo docker import - test/ubuntu:v1
sudo docker images #查看镜像是否导入成功
sudo docker ps -a #查询所有镜像
sudo docker rm -f id # 删除镜像
sudo docker pull training/webapp #拉镜像
sudo docker run -d -P training/webapp python app.py #运行镜像 大写的P
sudo docker ps
sudo docker run -d -p 5000:5000 training/webapp python app.py# 更改端口号 内部5000转本地5000 小写的p
sudo docker port id #
sudo docker logs -f id #运行日志查询
sudo docker top id #查询当前进程
sudo docker inspect id #查询配置与状态信息
sudo docker stop id #停止
sudo docker images # 镜像
sudo docker search httpd#查找镜像
sudo docker pull httpd# 拉镜像
sudo docker images
sudo docker rmi httpd#删除镜像
sudo docker ps #找容器
sudo docker commit -m="update" -a="fu" bf25 ubuntu-fu:v2 #创建镜像
sudo docker images
mkdir Dockerfile # 创建镜像的另一种方法
cd Dockerfile
gedit Dockerfile
from ubuntu:18.04
run apt-get update
sudo docker build -t fu/ubuntu .#运行
1、nvidia最新驱动安装
若在容器中使用nvidia驱动,则需要安装nvidia-docker。(宿主机中已经安装好nvidia驱动)
宿主机手动安装与docker镜像文件中一致的nvidia驱动
参考链接:
https://blog.csdn.net/chxw098/article/details/79741586
https://blog.csdn.net/a12345676abc/article/details/84302513
安装前注意:安装nvidia-docker之前,需要先给宿主机安装nvidia驱动,docker内不需要安装驱动!
宿主机手动安装与docker镜像文件中一致的nvidia驱动
宿主机手动安装驱动:desktop版本和server版本驱动安装链接如下
https://blog.csdn.net/zml194849/article/details/121827610
2、docker 和nvidia-docker的安装
2.1 docker 的安装
1)可选操作,卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
2)安装软件包以允许apt通过HTTPS使用存储库:
sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common
3)添加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 通过搜索指纹的后8个字符,验证您现在是否拥有带有指纹的密钥 。
$ sudo apt-key fingerprint 0EBFCD88
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb) docker@docker.com
sub rsa4096 2017-02-22 [S]
4) 使用以下命令来设置稳定的存储库。请在以下命令中的单词后面添加nightly或test(或同时添加)stable。
注意:下面的lsb_release -cs子命令返回Ubuntu发行版的名称,例如xenial。有时,在Linux Mint等发行版中,您可能需要更改$(lsb_release -cs) 为父Ubuntu发行版。例如,如果您使用 Linux Mint Tessa,则可以使用bionic。Docker对未经测试和不受支持的Ubuntu发行版不提供任何保证。
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
jetson_nano命令(jetson_nano自带docker)
sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
5)更新apt包索引。
sudo apt-get update
6.安装最新版本的Docker Engine-Community和containerd
sudo apt-get install docker-ce docker-ce-cli containerd.io
可选linux的安装后步骤
以非root用户身份管理Docker
Docker守护程序绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字由用户拥有root,其他用户只能使用sudo来访问它。Docker守护程序始终以root用户身份运行。
如果你不想在前言docker与命令sudo,创建一个名为UNIX组docker和用户添加到它。Docker守护程序启动时,它会创建一个可由该docker组成员访问的Unix套接字。
1.创建用户组
sudo groupadd docker
2.将您的用户添加到该docker组。
sudo usermod -aG docker $USER
3.注销并重新登录,以便重新评估您的组成员身份。
如果在虚拟机上进行测试,则可能需要重新启动虚拟机以使更改生效。
在桌面Linux环境(例如X Windows)上,完全注销会话,然后重新登录。
在Linux上,您还可以运行以下命令来激活对组的更改:
newgrp docker
4.验证您是否可以运行docker不带命令的命令sudo
docker run hello-world

docker version

完成
2.2 ubuntu完全卸载docker
- 删除某软件,及其安装时自动安装的所有包
sudo apt-get autoremove docker docker-ce docker-engine docker.io containerd runc
- 删除docker其他没有没有卸载
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 删除无用的相关的配置文件
- 卸载没有删除的docker相关插件(结合自己电脑的实际情况)

sudo apt-get autoremove docker-ce-*
- 删除docker的相关配置&目录
sudo rm -rf /etc/systemd/system/docker.service.d
sudo rm -rf /var/lib/docker
- 确定docker卸载完毕
docker --version
2.3 安装nvidia-docker2
(1)移除之前的旧版本
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{
} -n1 docker ps -q -a -f volume={
} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
(2)添加环境配置
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
(3)安装nvidia-docker2版本,备注:nvidia-docker2和nvidia-docker1区别后续说明。
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
(4)安装 nvidia-container-runtime 软件包:
sudo apt-get install nvidia-container-runtime
(5)添加docker守护进程文件
docker的守护进程参数配置一般在文件 /etc/docker/daemon.json,在该文件中写入
{
"default-runtime" : "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置完成后,重启docker
systemctl restart docker
(6)测试
从Docker Hub查找镜像—https://www.runoob.com/docker/docker-search-command.html
2.4 docker 示例
语法
docker search [OPTIONS] TERM
OPTIONS说明:
--automated :只列出 automated build类型的镜像;
--no-trunc :显示完整的镜像描述;
-s :列出收藏数不小于指定值的镜像。
实例
从Docker Hub查找所有镜像名包含java,并且收藏数大于10的镜像
runoob@runoob:~$ docker search -s 10 java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
java Java is a concurrent, class-based... 1037 [OK]
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC ... 115 [OK]
develar/java 46 [OK]
isuper/java-oracle This repository contains all java... 38 [OK]
lwieske/java-8 Oracle Java 8 Container - Full + ... 27 [OK]
nimmis/java-centos This is docker images of CentOS 7... 13 [OK]
参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
测试
sudo docker run -ti --rm nvidia/cuda:9.0-base nvidia-smi
或
sudo docker run --runtime=nvidia --rm 5aafb863776b nvidia-smi
(第一次运行该指令会先下载对应版本的镜像文件,可能耗时较长)
下载成功后会输出证明安装成功

2.5 nvidia-docker1和nvidia-docker2区别
那么两个版本之间有何区别呢?
(1) 虽然nvidia-docker1 和nvidia-docker2 都依赖于docker, 但版本1是一个整体的可行性文件,内部实现连接docker容器与硬件GPU,版本2将整体部分拆分层一个基于docker的薄封装(cat /usr/bin/nvidia-docker 可查看)和一个插件(nvidia-container-runtime , 该插件直接实现一个 hook的功能,连接GPU硬件),在版本2 的nvidia-docker 可发现,实际上还是运行docker ,只是指定了 --runtime 参数,同时指定GPU设备,默认全部GPU设备。
(2)当需要运行一个使用GPU的容器时,版本1 必须用nvidia-docker run/create 启动, 版本二可通过设置 守护进行default-runtime参数可直接通过 docker run/create 直接启动GPU容器
docker的守护进程参数配置一般在文件 /etc/docker/daemon.json
cat /etc/docker/daemon.json
[root@localhost hadoop]# cat /etc/docker/daemon.json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置默认的插件环境 后
{
"default-runtime" : "nvidia",
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
配置完成后,重启docker
systemctl restart docker
docker容器的导入导出有两个方式docker export和docker import以及docker save和docker load。docker import和docker load导入都是导入成一个镜像,然后再跑一个容器。
docker export导出的是容器的快照,不会保存元数据。然后如果用这一种方式,就算你在你机器上创建的容器导出再导入都会出错。会使用不了GPU资源。所以,如果你想让其他人也使用也就需要使用docker save,docker save是针对镜像的,所以我们需要先将我们搭建好的docker容器提交为一个镜像:
sudo docker commit container-name image-name:version
sudo docker commit 容器id 镜像名(自定义):版本(自定义)
然后使用docker save命令导出就好(save命令导出的是docker镜像文件,注意与容器文件区分):
docker save -o image-name.tar image-name:version
然后就OK了
3、cuda10.2 docker拉取及docker ssh配置
3.1 deepstream5.0 镜像获取(适合无opencv需求场景)
1、环境配置
配置环境是一个很麻烦的事情,推荐直接在nvidia ngc中下载docker来进行部署。
事前准备:需要注册nvidia的ngc平台,在用户设置中获取到自己的key,该平台储存了nvidia预训练的模型和一些专用的docker image,比如deepstream sdk 和Transfer Learning Toolkit。
注册账号:官网地址https://ngc.nvidia.com/,注册后登录生成API Key(重要)https://ngc.nvidia.com/setup
然后在Generate API Key中点击Get API Key,点击右上角绿色按钮Generate API Key
1.1 安装docker和nvidia-docker2
apt-get update
apt-get install docker
apt-get install nvidia-docker2
1.2 登录nvidia的ngc平台下载deestream镜像
docker login nvcr.io
Username: $oauthtoken
Password:bjBsMHJucnFzOHY5dmw4YzFzMzNhbmFtcTc6ZDM5Y2RlODAtM2I0MS00Y2VmLWFmZTctMmFmYmZlZmI5MWRk
输入自己在平台获取到的Username和Password。如果未登录,在下载镜像时会出现验证错误的字样。
下载镜像并运行,使用docker images查看所有镜像,使用docker ps查看运行中的镜像
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_docker_containers.html
docker拉取镜像。推荐早上5,6点的时候下载 docker pull
nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
#允许外部连接主机xhost +# 第一种镜像运行方法,使用-v来挂载需要导入镜像的目录,-p设置镜像接口,方便之后ssh登入。
docker run --gpus all --privileged=true -it -v /home/jdh/data:/root/host -p 5000:22 -m 2g -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
#该命令可以输出显示图像
docker run --gpus all --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -p 5000:22 -m 2g -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
#第二种镜像运行方法,当执行推理出现内存空间不够时用
nvidia-docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -p 127.0.0.1:5000:22 -m 2g -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
docker run --gpus all --net=host --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/jdh/data:/root/software -p 6000:22 -m 2g -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE -w /opt/nvidia/deepstream/deepstream-5.0 nvcr.io/nvidia/deepstream:5.0-dp-20.04-triton
错误解决1
unknown flag: --gpus
docker版本要>19.03才支持gpu选择
在jetson_nano上配置docker注意事项
在docker中画面显示
#宿主机
$DISPLAY
#在docker容器中添加当前使用xshell的ip以及端口—只适合CPU显示
export DISPLAY=192.168.1.64:10.0
ps:docker --privileged=true 参数作用
- 大约在0.6版,privileged被引入docker。
- 使用该参数,container内的root拥有真正的root权限。
- 否则,container内的root只是外部的一个普通用户权限。
- privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
- 甚至允许你在docker容器中启动docker容器。
$ docker help run
…
–privileged=false Give extended privileges to this container
…
这里以一个Mysql 例子
我们启动命令还没加 --privileged=true 参数 ,可以明确看到docker 尝试去运行容器,但是马上就关闭了。
命令
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
尝试使用一些命令,提示permission denied,权限禁止

加入参数命令后
docker run --name mysql-test --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6

成功运行命令
3.2 获取cuda10.2镜像(适合有opencv需求场景)
1.去dockerhub搜索自己需要的cuda等镜像,或者可以使用docker search查找镜像
2.拉去合适的镜像
sudo docker pull nvidia/cuda:10.1-cudnn7-devel-ubuntu16.04
sudo docker pull nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
3.创建容器
通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径
现在镜像内就可以共享宿主机里的文件了。
默认挂载的路径权限为读写。
#允许外部连接主机xhost +# 第一种镜像运行方法,使用-v来挂载需要导入镜像的目录,-p设置镜像接口,方便之后ssh登入。
#该命令可以输出显示图像
docker run --gpus all --net=host --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/jdh/disk_4t:/root/host_data -p 6000:22 -m 2g -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE -w /root nvidia/cuda:10.2-cudnn8-devel-ubuntu18.04
docker run --gpus all --net=host --privileged=true -it -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/jdh/disk_4t:/root/host_data -p 60000:22 -m 2g -e DISPLAY=$DISPLAY -e GDK_SCALE -e GDK_DPI_SCALE -w /root nvidia/cuda:8.0-cudnn7-devel-ubuntu16.04
可能问题:
1.nvcc: command not found解决
添加环境变量,打开~/.bashrc ,添加环境变量如下:
export LD_LIBRARY_PATH=/usr/local/cuda/lib
export PATH=$PATH:/usr/local/cuda/bin
2.错误解决2
unknown flag: --gpus
docker版本要>19.03才支持gpu选择
3.在docker中画面显示
#在docker容器中添加当前使用xshell的ip以及端口
export DISPLAY=192.168.1.64:10.0
ps:docker --privileged=true 参数作用
- 大约在0.6版,privileged被引入docker。
- 使用该参数,container内的root拥有真正的root权限。
- 否则,container内的root只是外部的一个普通用户权限。
- privileged启动的容器,可以看到很多host上的设备,并且可以执行mount。
- 甚至允许你在docker容器中启动docker容器。
$ docker help run
...
--privileged=false Give extended privileges to this container
...
这里以一个Mysql 例子
我们启动命令还没加 --privileged=true 参数 ,可以明确看到docker 尝试去运行容器,但是马上就关闭了。
命令
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6
尝试使用一些命令,提示permission denied,权限禁止

加入参数命令后
docker run --name mysql-test --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -p 9092:3306 -d daocloud.io/library/mysql:5.7.6

成功运行命令
3.3 docker ssh配置
3.3.1 运行容器
1、运行容器
docker run --name iubuntu -t -i -d -p 3316:22 ubuntu
参数:
–name: 指定生成的容器的名称
-i: 以交互模式运行容器,保证容器中STDIN是开启的。通常与 -t 同时使用;
-t: 为容器重新分配一个伪tty终端,通常与 -i 同时使用;
-d: 后台运行容器,并返回容器ID;
-p:可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
ubuntu 则是镜像名称,镜像ID也可以的。
2、查看是否运行成功#
查看正在运行的镜像
docker ps
3.3.2 安装ssh服务
- 进入容器终端安装ssh服务
bash docker exec -t -i iubuntu /bin/bash

- 执行更新
apt-get update
等待,输入Y就可以了

3. 安装ssh-client、ssh-server
安装ssh-client命令#
apt-get install openssh-client
等待,输入Y就可以了

安装ssh-server命令#
apt-get install openssh-server
等待,输入Y就可以了

安装完成后,先启动服务
/etc/init.d/ssh start
查看是否正确启动
ps -e|grep ssh

编辑sshd_config文件
需要先安装vim编辑器
apt-get install vim
编辑sshd_config文件
vim /etc/ssh/sshd_config
添加UsePAM no

保存退出 ESC + : + WQ
ps:如果无法进入端口可在宿主机查看端口是否被占用,更换端口
sudo netstat -ap | grep 6000
如果还不行,可以在docker中该文件下更改端口号为自己设置的端口号,也可以远程接入

重启ssh服务
service ssh restart

设置ssh密码
passwd root

查看容器的IP
先安装net-tools工具包
apt-get install net-tools
查看IP
apt-get install net-tools
ifconfig
退出
exit
4、保存刚刚修改的镜像,方便后面使用
docker commit [容器ID/容器名] [REPOSITORY:TAG]
3.3.3 使用Xshell连接
1、测试
打开一个新终端,通过ssh root@host_ip -p 3316 进入docker:

2、在本机连接可以用localhost:3316连接也可以用宿主机IP:3316连接,账户名为root

然后连接就可以了 #

ps:docker修改容器端口映射的方法
方法一
1、停止容器(docker stop d00254ce3af7)
2、停止docker服务(systemctl stop docker)
3、修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)
hostconfig.json文件

config.v2.json文件


&spm=1001.2101.3001.5002&articleId=110822831&d=1&t=3&u=a29901a1ece645e19a306433e1838f7c)
949

被折叠的 条评论
为什么被折叠?



