docker整理

自闭症网瘾萝莉.ら 提交于 2020-04-06 02:44:51

声明: 我用的是mac,以下不做说明一般都是在mac上做的操作。

一. docker简介---docker初使用

Docker 查看版本

docker version

docker查找 tutorial镜像

docker search tutorial

下载仓库镜像到本地

docker pull learn/tutorial

运行镜像

docker run learn/tutorial echo ‘hello world’

向learn/tutorial容器中安装ping命令

docker run learn/tutorial apt-get install -y ping

docker ps -l

提交镜像,相当于新创建了个镜像learn/ping是起的名字

docker commit id号 learn/ping

用新镜像运行个容器

docker run learn/ping ping www.baidu.com

查看当前运行的容器

docker ps

查看运行中的容器

docker inspect 容器id

查看有哪些镜像

docker images

将新创建的镜像保存到github中

push命令保存镜像到github上
docker push learn/ping

注意:
1. docker images命令可以列出所有安装过的镜像。
2. docker push命令可以将某一个镜像发布到官方网站。
3. 你只能将镜像发布到自己的空间下面。这个模拟器登录的是learn帐号。

二. 安装docker

Ubuntu 14.04安装docker

  1. 查看内核版本

     uname -a
    

2.检查Device Mapper

ls -l /sys/class/misc/device-mapper

依赖关系:
Ubuntu 14.04版本无需安装额外的依赖包,可以直接安装。
安装步骤:

使用管理员帐号登录ubuntu 14.04系统,保证该管理有root权限,或者可以执行sudo命令。

检查curl包有没有安装。

$ which curl

如果curl没有安装的话,更新apt源之后,安装curl包。

$ sudo apt-get update 
$ sudo apt-get install curl

获得最新的docker安装包。

$ curl -sSL https://get.docker.com/ | sh 

shell会提示你输入sudo的密码,然后开始执行安装过程。

确认Docker是否安装成功。

这个命令会下载一个测试用的镜像并启动一个容器运行它。
$ sudo docker run hello-world

额外补充:
使用非root用户启动docker
1.sudo groupadd docker
2.sudo gpasswd -a ${USER} docker
3.sudo service docker restart
需要注销docker再重新登录下docker才能生效
不用sudo验证
docker version

在windos中安装docker

http://www.docker.org.cn/book/

在mac os下安装docker

去docker官网下载dmg文件,注册自己的dockerhub账号登录,

查看docker版本

docker version

用ubuntu镜像输出hello world 如果没有ubuntu镜像,docker会默认给下载个最新的ubuntu镜像

docker run ubuntu echo 'hello world'

以交互式运行

docker run -i -t ubuntu /bin/bash   #

-i --interactive=ture|false 默认是false 始终打开标准输入
-t --tty=true|false 默认是false 为docker分配个伪tty终端

这样新创建的容器才能提供个交互式的shell

在ubuntu容器中就和在ubuntu服务器一样 执行ps -ef 测试 exit退出

docker容器的基本操作

docker ps [-a][-l]

-a表示列出所有创建的容器
-l 表示列出最新创建的容器

查看指定容器详细配置信息

docker inspect [id或者名字]

自定义容器名

docker run --name=自定义名 -i -t IMAGE /bin/bash

重新启动和停止容器:

docker start [-i] 容器名

删除停止的容器:(不能删除正在运行的容器)

docker rm 容器名

守护式容器: 什么是守护式容器: 能够长期运行 没有交互式会话 适合运行应用程序和服务

docker run --name=自定义名 -i -t IMAGE /bin/bash

Ctrl+P  Ctrl+Q组合键退出容器

这样会以后台运行

附加到运行中的容器:

docker attach 容器名

执行exit看到容器停止了

守护式容器

启动守护式容器:

docker run -d 镜像名[COMMAND][ARG...]
docker run --name dc1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

查看容器日志:

docker logs [-f][-t][--tail] 容器名

-f --follows=true|false 默认为false 一直跟踪日志的变化并返回结果
-t --timestamps=true|false 默认为false 返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志

不指定返回logs所有的日志

-tf一直跟新,按Ctrl+c停止

--tail 10 最近十条

-tail 0 最近的一条

查看容器内进程:

docker top 容器名

在运行的容器内启动新进程:

docker exec [-d][-i][-t] 容器名 [COMMAND][ARG...]

24120是我们在容器中加进去的进程

停止守护式容器:

docker stop 容器名
docker kill 容器名

在容器中部署静态网站

设置容器的端口映射

run [-P][-p]
 -P, --publish-all=true|false 默认为false #为容器暴露的所有端口映射

	docker run -P -i -t ubuntu /bin/bash

 -p, --publish=[]  #可以指定映射哪些容器的端口
小写的p有四种格式
containerPort  #只指定容器的端口,宿主机的端口随机映射

	docker run -p 80 -i -t ubuntu /bin/bash

hostPort:containerPort #容器和宿主机的端口都指定

	docker run -p 8080:80 -i -t ubuntu /bin/bash

ip::containerPort

	docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash

ip:hostPort:containerPort

	docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署流程

  1. 创建映射80端口的交互式容器

     docker run -p 80 --name web -i -t ubuntu /bin/bash
    
  2. 安装nginx

     apt-get update
     apt-get install -y nginx
    
  3. 安装文本编辑器vim

     apt-get install -y vim
    
  4. 创建静态页面

     mkdir -p /var/www/html
     cd /var/www/html
     vim index.html
    
    	<html>
    			<head>
    					<title>Nginx in Docker</title>
    			</head>
    			<body>
    					<h1>Hello, I`m website in Docker!</h1>
    			</body>
    	</html>
    
  5. 修改nginx配置文件

     whereis nginx #查找nginx的位置
    

  1. 打开nginx的配置文件

     vim /etc/nginx/sites-enabled/default #root指定到自己创建的静态文件目录,如果一致就不用修改了。
    

  1. 运行nginx

     cd /
     nginx
    

Ctrl+P+Q退出,让容器在后台运行。

  1. 验证网站访问

     curl http://127.0.0.1:32768
    

或者在浏览器输入

练习:

停止web容器

启动web容器

Ctrl+P+Q让容器后台运行。

启动web容器中nginx服务

查看web容器配置

查看和删除镜像:

列出镜像
镜像标签和仓库
查看镜像
删除镜像

	docker images [OPTIONS] [REPOSITORY[:TAG]]
	  -a, --all=false             #显示所有镜像,默认不显示中间层的镜像
		  --digests         #显示摘要
	  -f, --filter=[] 过滤条件
		  --format string   使用Go模板打印漂亮的图像
		  --no-trunc=false 指定不使用截断的形式显示镜像的id
	  -q, --quiet=false 只显示镜像的id

可以为相同的镜像打上不同的标签

docker images --no-trunc

docker images -a

docker images -q

docker images ubuntu

查看镜像

docker inspect [OPTIONS] NAME|ID [NAME|ID...]
 -f, --format=” ”

删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
  -f, --force=false      强制删除图像
	  --no-prune=false   会保留未打标签的父镜像

docker rmi ubuntu:latest

根据镜像仓库和标签只能删除一个

docker rmi 4e5021d210f6

#根据镜像id能删除多个
在运行的无法删除必须指定
删除多个

docker rmi ubuntu:latest admin:1.0.0

删除ubuntu中所有镜像

docker rmi $(docker images -q ubuntu)

docker批量删除容器、镜像

1、删除所有容器

docker rm -f `docker ps -a -q`

2、删除所有镜像

docker rmi -f `docker images -q`

3、按条件删除镜像

//镜像名包含关键字 其中none为关键字
$ docker rmi -f $(docker images -q | grep "none" | awk '{print $3}')

停止容器

docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')

按条件删除容器

docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')

获取和推送镜像

docker search [OPTIONS] TERM
  -f, --filter filter   过滤条件
	  --limit int       默认最大查25条
	  --no-trunc        显示全id
	  
docker search --filter=stars=4 ubuntu

docker search --limit 4 ubuntu

拉取镜像

docker pull ubuntu:14.04

2.使用 --registry-mirror选项

如果之前没用过,最好把自己的镜像上传到dockerhub或者私有部署上,这样设置完有可能会更新docker导致你的镜像和容器丢失。

https://www.daocloud.io

https://www.daocloud.io/mirror

配置 Docker 镜像站

  1. Linux

    curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

    该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件

    /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。更多详情请访问文档。

  2. macOS

Docker For Mac

右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中

加入下面的镜像地址:

http://f1361db2.m.daocloud.io

点击 Apply & Restart 按钮使设置生效。

Docker Toolbox 等配置方法请参考帮助文档。
  1. Windows

Docker For Windows

在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把下面的地址:

http://f1361db2.m.daocloud.io

加到" registry-mirrors"的数组里。点击 Apply 。

mac上遇到的问题:

当你重新下载镜像测试的时候可能报错,这个时候你需要重启reset factory,启动docker 的时候点击第一个按钮

dawn-2:~ root# docker pull ubuntu:12.10
Error response from daemon: Bad response from Docker engine

重新登录dockerhub就可以了
注意:登录上去我之前的本地镜像都没了。呵呵

这个是我用的中国科技大学的国内镜像
https://docker.mirrors.ustc.edu.cn

开始推送镜像到dockerhub上

推送镜像的规范是:

  1. docker push 注册用户名/镜像名  

tag命令修改为规范的镜像:

docker tag ubuntu:12.10 hexiaoming/ubuntu

docker login
输入dockerhub用户名
输入dockerhub密码   #mac提示
你没有找到xxx的秘钥串,这个时候点击
还原默认值
输入dockerhub的密码看到shell 页面Login Succeeded登录成功了
这个时候可以上传了
docker push hexiaoming/ubuntu

看dockerhub已经上传上去镜像,dockerhub上私有仓库只能有一个

  1. 使用commit构建镜像

     docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
       -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
       -c, --change list      Apply Dockerfile instruction to the created image
       -m, --message string   Commit message
       -p, --pause            Pause container during commit (default true)
    
  2. 启动个交互式容器

     docker run -it -p 80 --name commit_test ubuntu /bin/bash
     apt-get update
     apt-get install -y nginx
     exit
    

  1. 把容器提交为镜像

     docker commit -a 'hexiaoming' commit_test hexiaoming/commit_test1
     docker images
    

  1. 用镜像运行个容器(容器启动时运行nginx命令,已后台运行-d)

     docker run -d --name nginx_web2 -p 80 hexiaoming/commit_test1 nginx -g "deamon off;"
    
     curl http://127.0.0.1:8080验证
    

  1. 使用dockerfile构建镜像

     创建dockerfile
     使用docker build命令
    
     #First Dockerfile
     FROM ubuntu:14.04  #镜像的基础
     MAINTAINER hexiaoming "17710146600@163.com"  #镜像的维护人
     RUN apt-get update #执行的命令
     RUN apt-get install -y nginx
     EXPOSE 80 #暴露的端口
    

docker build参数

	docker build [OPTIONS] PATH | URL | -

	Options:
		  --add-host list           Add a custom host-to-IP mapping (host:ip)
		  --build-arg list          Set build-time variables
		  --cache-from strings      Images to consider as cache sources
		  --cgroup-parent string    Optional parent cgroup for the container
		  --compress                Compress the build context using gzip
		  --cpu-period int          Limit the CPU CFS (Completely Fair Scheduler) period
		  --cpu-quota int           Limit the CPU CFS (Completely Fair Scheduler) quota
	  -c, --cpu-shares int          CPU shares (relative weight)
		  --cpuset-cpus string      CPUs in which to allow execution (0-3, 0,1)
		  --cpuset-mems string      MEMs in which to allow execution (0-3, 0,1)
		  --disable-content-trust   Skip image verification (default true)
	  -f, --file string             Dockerfile的名称(默认为“PATH/Dockerfile”)
		  --force-rm                始终移除中间容器,默认为false
		  --iidfile string          Write the image ID to the file
		  --isolation string        Container isolation technology
		  --label list              Set metadata for an image
	  -m, --memory bytes            Memory limit
		  --memory-swap bytes       Swap limit equal to memory plus swap: '-1' to enable unlimited swap
		  --network string          Set the networking mode for the RUN instructions during build (default "default")
		  --no-cache                生成图像时不要使用缓存 ,默认为false
		  --pull                    总是尝试提取较新版本的镜像,默认为false
	  -q, --quiet                   成功时抑制生成输出并打印图像ID默认为false
		  --rm                      成功生成后删除中间容器(默认为true)
		  --security-opt strings    Security options
		  --shm-size bytes          Size of /dev/shm
	  -t, --tag list                给镜像取个名字
		  --target string           Set the target build stage to build.
		  --ulimit ulimit           Ulimit options (default [])

正确的dockerfile格式

#First Dockerfile 
FROM ubuntu:14.04
#镜像的维护人
MAINTAINER hexiaoming "17710146600@163.com"
RUN apt-get update
RUN apt-get install -y nginx
#暴露的端口
EXPOSE 80

查看镜像

docker images

运行镜像

docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"

注释:run后加-g "deamon off;"的原因:

容器启动时执行的那条入口命令一旦结束了,容器也会结束。如果启动命令单纯是以后台守护(daemon)模式启动nginx,那么启动命令会立即结束,容器也会立即结束。

其实只要在任何命令之后加一句 && cat,就会让这条命令卡在前台而不会结束,不是非得用daemon off

docker本地访问

Remote API没有了可以用engine/api/ https://docs.docker.com/engine/api/

原文:

Docker provides an API for interacting with the Docker daemon (called the Docker Engine API), as well as SDKs for Go and Python. The SDKs allow you to build and scale Docker apps and solutions quickly and easily. If Go or Python don’t work for you, you can use the Docker Engine API directly.

翻译:

Docker提供了一个用于与Docker守护进程进行交互的API(称为Docker Engine API),以及Go和Python的SDK。使用SDK,您可以快速轻松地构建和扩展Docker应用程序和解决方案。如果Go或Python不适用于您,则可以直接使用Docker Engine API。

运行过Docker Hub的Docker镜像的话,会发现其中一些容器时需要挂载/var/run/docker.sock文件。这个文件是什么呢?为什么有些容器需要使用它?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。

我的docker engineAPI版本

官方文档

https://docs.docker.com/engine/api/sdk/examples/

测试

curl --unix-socket /var/run/docker.sock http:/v1.24/images/json

http例子可以继续参考这个。

https://docs.docker.com/engine/api/v1.40/#

第三方的库,用于代码方式链接docker

https://docs.docker.com/engine/api/sdk/

docker守护进程的配置和操作

查看守护进程

ps -ef | grep docker

linux上使用启动docker查看docker状态

sudo status docker不行就用
systemctl status docker不行就用
sysvinit status docker
sudo service docker stop
sudo service docker start
sudo service docker restart

FROM #镜像的基础 已经存在的镜像,基础镜像,必须是第一条非注释指令
MAINTAINER #镜像的维护人
RUN指定当前镜像中运行的命令
#执行的命令 因为镜像分层,下个run指令会在当前镜像创建个新镜像运行当前的命令,
如果把两个run命令用&&连接起来会减少重复构建镜像。其实都差不多,docker是集装箱一样增量构建。

RUN <command> (shell模式)

/bin/sh -c command
RUN echo hello
RUN ["executable","param1","param2"](exec模式)
RUN ["/bin/bash","-c","echo hello"]

EXPOSE指定运行该镜像的容器使用的端口

EXPOSE <port>[<port>...]
但是处于安全考虑docker容器并不会自动打开端口,需要我们手动去指定打开端口。


CMD ["executable","param1","param2"](exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1","param2"](作为ENTRYPOINT指令的默认参数)

run和cmd区别

run是在镜像构建过程中运行的,cmd是在容器运行时运行的
如果用docker run 启动一个容器制定了容器运行时命令,cmd中的指令会被覆盖不会执行。

示例

之前的运行容器命令

docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"

如果dockerfile中加了CMD ["/usr/sbin/nginx","-g" ,"deamon off;"] 这里就可以去掉nginx -g "deamon off;" 写为

docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1

如果这里run指定了cmd命令会覆盖调dockerfile中的cmd命令

docker run -d --name cmd_test2 -p 80 hexiaoming/df_test1 /bin/bash

ENTRYPOINT["excutable","param1","param2"](exec模式)
ENTRYPOINT command param1 param2 (shell模式)

唯一和cmd区别就是ENTRYPOINT 不会被启动命令所覆盖,
如果需要覆盖可以使用docker run --entrypoint覆盖。

ENTRYPOINT 可以和CMD组合使用。

例如 dockerfile中

ENTRYPOINT [/usr/sbin/nginx]
CMD  [-h]

运行docker容器

docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1 -g "deamon off;"

这时会覆盖cmd中参数。

ADD <src>...<dest> 
ADD["src"..."dest"](适用于文件路径中有空格的情况)

来源地址如果是本地地址必须是构建目录中的相对地址,docker不推荐使用远程地址推荐用wget之类的下载下来再指定。

目标路径需要指定镜像中的绝对路径

COPY <src>...<dest> 
COPY["src"..."dest"](适用于文件路径中有空格的情况)

ADD vs. COPY

ADD 包含类似的tar的解压功能 

如果单纯复制文件,Docker推荐使用COPY

示例

在dockerfile目录添加了个index.html文件替换docker中nginx的默认页

向容器中添加卷

VOLUME ["/data"]

在构建中为后续的指令指定工作目录,一般使用绝对路径,如果是相对路径工作目录会一直传递下去

WORKDIR /path/to/workdir

设置环境变量

构建过程中及运行运行过程中同样有效
ENV <key><value>
ENV <key>=<value>...

镜像会以什么用户去运行

USER daemon

示例

会以nginx的用户去运行

USER nginx

可以是任意组合,不指定以root用户去运行

镜像触发器

当一个镜像被其他镜像作为基础镜像时执行 会在构建过程中插入指令
ONBUILD [INSTRUCTION]

ONBUILD 中指定的命令并不会在本次镜像构建过程中构建。

dockerfile构建过程

中间层的容器会删除,镜像会保留,可以根据中间层镜像进行调试、查找错误
  1. 构建缓存

     docker会把之前的镜像看做缓存
     当你执行同样的命令构建镜像,会使用缓存
     不使用缓存
     docker build --no-cache
    

docker容器的网络连接 以下得在linux运行

  1. docker容器的网络基础docker0

    sudo apt-get install bridge-utils sudo brctl show

ifconfig查看linux会有docker0的网桥

macos没有得装软件,往下继续看

OSI七层模型中的网桥

  1. linux虚拟网桥的特点:

linux修改docker0地址:

ifconfig查看docker0网卡地址为172.121.1.2

修改地址

sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

sudo service docker restart

docker run -it ubuntu /bin/bash

ifconfig

echo已经修改为我们修改的地址

自定义虚拟网桥

sudo vim /etc/default/docker
增加DOCKER_OPS="-b=br0"

docker容器的互联

  1. 以下是linux中的操作,因为依赖linux的iptables

一个宿主机上的docker容器默认可以互联。

指定docker间不能访问。在默认配置文件中添加

DOCKER_OPS="--ICC=false"

启动cct3链接到cct1上给cct1起别名webtest

用虚拟机访问docker 中的端口能访问通

查看当前虚拟机地址

查看cct6的端口映射为49154

docker容器的数据管理

这个不依赖linux系统的iptables,在mac上可以操作

  1. docker容器的数据卷

docker run -it -v /tmp:/data ubuntu /bin/bash

docker inspect fc8d003898d5

设置为加载卷只读

docker run -it -v /tmp:/data:ro ubuntu /bin/bash

docker inspect fce42ddc61ecs

使用dockerfile构建包含数据卷的镜像

VOLUME ["/data"]

docker build -t ubuntu .

docker run --name dvt3 -it ubuntu

exit
docker inspect dvt3

docker 的数据卷容器

什么是数据卷容器:

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

挂载数据卷容器的方法

docker run --volumes-from [CONTAINER NAME]
  1. 创建数据卷容器dvt4

     docker run -it --name dvt4 ubuntu
    
  2. 在下边创建个文件

  1. 使用容器dvt5去挂载这个数据卷容器

     docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash
    

    也在下边创建个新文件

    使用容器dv6 去挂载这个数据卷容器 在下边查看文件发现文件数据是同步的

     docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash
    

     docker inspect --format="{{.Mounts}}" dvt5
     docker inspect --format="{{.Mounts}}" dvt6
    

    这俩容器的数据挂载的数据是一致的

     使用数据卷容器挂载数据这个容器起到的作用:是将挂载配置传递到挂载了数据卷容器的应用容器中
    

以下是验证过程:

docker数据卷的备份和还原

备份的原理:创建一个数据卷容器,在创建一个引用数据卷容器的新容器,并设置数据卷为本地下的某个目录,并用tar -cvf 命令对数据卷目录进行打压缩。 

备份:

必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar cvf /backup/backup.tar 数据卷

示例:
cd /tmp
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume1

还原:

必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar xvf /backup/backup.tar

新打开个shell,进入到dvt5数据卷容器删除数据

开始还原

示例:
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt11 ubuntu tar xvf /backup/dvt5.tar

在dvt5数据卷容器又看到数据了

docker跨主机连接

  1. 使用网桥实现跨主机容器连接

    网络拓扑

还没在mac上安装这些。先整理出来,以后再安装。

网络设置

docker设置

reboot

另一台虚拟机

2. 使用open vswitch实现跨主机容器连接

环境准备

操作

Host2

因为要查找路由表

添加路由表查找指定机器,启动容器

3.使用weave实现跨主机容器连接

环境准备

操作

  curl -L git.io/weave -o /usr/bin/weave  #下载用这个下载也行
  chmod a+x /usr/bin/weave  #赋予执行权限
weave launch   #启动weave   

格式:
weave launch  ip | hostName #节点启动的时候连接到master (创建weave网络的主机叫master)

虚拟机2上的docker下载weave和1一样不做演示

192.168.59.103是虚拟机1上docker的地址
192.168.1.2是给虚拟机2上docker分配的地址
在虚拟机1上docker指定和虚拟机2上指定相同网段的地址,启动docker,
ping虚拟机2上docker容器,可以ping通

dockerfile 外部jdk和tomcat示例

docker images

使用Docker快速搭建Mysql,并进行数据卷分离

https://www.jianshu.com/p/57420240e877

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!