Docker之安装和容器操作

1 Docker容器

系统环境:docker最低支持centos7且在64位平台上,内核版本在3.10以上
版本:社区版(免费),企业版(包含了一些收费服务)

1.1 安装Docker

安装docker 社区版前需要修改yum源为国内镜像源,不然用官方的yum源只能装docker
yum install docker-ce

启动docker
systemctl start/status docker

查看docker启动状态
docker version

1.2 加速下载和配置

1.2.1 使用yum-config-manager加速下载

如果觉得从官网的yum源安装太慢,可以用 yum-config-manager 修改yum源
点击了解yum源相关问题
yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

使用以下命令来设置稳定的仓库

使用官方源地址(比较慢)
sudo yum-config-manager --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

阿里云
sudo yum-config-manager --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

清华大学源
sudo yum-config-manager  --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

1.2.2 使用 wget 加速下载

下载yum源

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

yum  -y install docker-ce

启动并开机自启

systemctl  start docker && systemctl enable docker

1.2.3 配置加速器

DaoCloud 加速器是广受欢迎的Docker工具,解决了国内用户访问 Docker Hub 缓慢的问题。DaoCloud 加速器结合国内的 CDN 服务与协议层优化,成倍的提升了下载速度。
DaoCloud官网:https://www.daocloud.io/mirror#accelerator-doc

一条命令加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

该脚本可以将 --registry-mirror 加入到 Docker 配置文件/etc/docker/daemon.json

或者直接操作文件:

vi /etc/docker/daemon.json

{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}

1.3 如何修改Docker的存储位置

默认情况下 Docker的存放位置为:/var/lib/docker
可以通过命令查看具体位置:docker info | grep “Docker Root Dir”

修改到其它目录:

  • 首先停掉 Docker 服务:
    systemctl stop docker
  • 然后移动整个/var/lib/docker 目录到目的路径
mkdir -p /root/data/docker
mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker --快捷方式

1.4 使用Docker帮助文档

docker 客户端非常简单,我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项

image.png

可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:

docker stats --help

2 Docker容器操作

2.1 Docker容器启动

Docker启动容器有两种方式:

  • 基于镜像新建一个容器并启动;
  • 将处于终止状态 (exited)的容器重新启动

当利用docker run来创建容器时,Docker在后台运行的步骤如下:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
  • 利用镜像创建并启动一个容器
  • 分配一个文件系统,并在只读的镜像层外面挂在一层可读写层
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
  • 从地址池配置一个ip地址给容器
  • 执行用户指定的应用程序
  • 执行完毕后容器被终止

2.1.1 基于镜像新建容器并启动

通过如下命令来快速启动容器:

docker run --name mydocker 
    -d IMAGE:TAG 
    --network test-net
    --dns=114.114.114.114
    --rm
    -h host_ubuntu
    /bin/bash -c "while true;do echo 正在运行; sleep 1;done"

参数:

  • name:给容器定义一个名称
  • d:后台运行容器
    后台运行的容器可以通过 docker logs 命令来查看日志:
    docker container logs [container ID or NAMES]
  • /bin/sh:指定使用centosbash解释器
  • c:运行一段shell命令
    "while true;do echo 正在运行; sleep 1;done":在linux后台,每秒中打印一次正在运行
  • IMAGE:镜像名称
  • TAG:标签,镜像版本号
  • p 80:80:端口映射
    不同指定映射方法
    • -p hostPort:containerPort:端口映射 -p 8080:80
    • -p ip:hostPort:containerPort:配置监听地址 -p 10.0.0.100:8080:80
    • -p ip::containerPort:随机分配端口 -p 10.0.0.100::80
    • -p hostPort:containerPort:udp:指定协议 -p 8080:80:tcp
    • -p 81:80 –p 443:443:指定多个
    • 随机映射:docker run -P (大P) 需要镜像支持
  • network:运行一个容器并连接到新建的test-net 网络
  • dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名
  • rm:容器退出时自动清理容器内部的文件系统
  • -h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname/etc/hosts

或者:创建容器,两步走(不常用)

docker create centos:latest  /bin/bash
bb7f32368ecf0492adb59e20032ab2e6cf6a563a0e6751e58930ee5f7aaef204
docker start stupefied_nobel
stupefied_nobel

举个例子,比如想启动一个 ubuntu 容器, 并通过终端输出 Hello world:


在这里插入图片描述

执行命令如下:

docker run ubuntu:latest /bin/echo 'Hello world'

在这里插入图片描述

注意,上面这行命令运行容器,在输出 Hello world 后就会终止运行。如果想以交互的方式运行容器,执行如下命令:

docker run -t -i ubuntu:latest /bin/bash

参数说明:
-t: 让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上;
-i: 让容器的标准输入保持打开;
以交互的方式运行 docker 容器

2.1.2 启动终止状态的容器

执行如下命令,可以将已经终止 (exited)运行的容器重启。

docker container start [container ID or NAMES]

测试一波好不好使,先通过 docker ps 命令获取正在运行的容器:

图片

假如本地有个 Redis 容器正在运行,先拿到容器 ID或者容器名称,执行 docker stop 停止它后,再执行 docker container start 命令重启这个 Redis容器 :

图片

可以看到,成功重启了一个终止状态的容器。

2.1.3 Docker 重启容器

执行如下命令重启 Docker 容器:

不管容器是否启动,直接重启
docker restart [container ID or NAMES]

举个例子,比如想要重启下面的 Redis 容器:

图片

docker重启 redis 容器
执行如下命令即可:

通过容器 ID 或者名称都可以
docker restart redis
限时 5s 关闭 redis 容器,然后重启
docker restart -t=5 redis

-t : 设置关闭容器的限制时间,若超时未能关闭,则使用 kill 命令强制关闭,默认值为 10s,这个时间用于容器保存自己的状态。

2.2 Docker查看容器

docker container lsdocker ps命令一样,docker container ls 查看docker容器的命令,docker ps 查看docker 进程的命令。
结合:容器的本质就是进程

docker ps : 查看正在运行中的容器;
docker ps -a : 查看所有容器,包括运行中的、已经停止运行的容器
docker ps -l : 查看最新创建的容器,注意,只列出最后创建的容器。
docker ps -n=2: -n=2 指定列出最新创建的 2 个容器

docker container ls :查看正在运行的容器
docker container  inspect  容器名称/id :查看容器详细信息/ip
在这里插入图片描述

返回字段说明:

  • CONTAINER ID : 容器 ID;
  • IMAGE : 创建容器时使用的镜像;
  • COMMAND : 容器最后运行的命令;
  • CREATED : 容器创建时间;
  • STATUS : 容器状态;
  • PORTS : 端口信息;
  • NAMES : 容器名:和容器 ID 一样,可以标识容器的唯一性,同一台宿主机上不允许有同名容器存在,否则会冲突;

2.3 Docker 进入容器

要想进入到已运行的 Docker 容器,主要有如下两种方式:

  • 使用 docker exec 命令;
  • 使用 docker attach 命令;

2.3.1 exec 命令(推荐)

Docker 在 1.3.X 版本后开始支持 exec 命令进入容器,命令如下:

docker exec -it [container ID or NAMES] 

举个例子,比如想进入到本地的 Redis 容器中:

图片

Docker 准备进入 redis 容器
可以通过容器 ID 或者名称进入容器:

docker exec -it redis /bin/bash

图片

docker 通过 exec 命令进入到容器后,要想退出容器,只需键入 exit 命令回车即可:

(base) ➜  ~ docker exec -it redis /bin/bash
root@023d93457910:/data#
root@023d93457910:/data#
root@023d93457910:/data#
root@023d93457910:/data# exit
exit

注意exec 命令和下面 attach 命令的区别在于,当使用 exit 退出容器时,不会导致容器停止。

2.3.2 attach 命令

attach进入容器,使用pts/0 ,会让所用通过此方法进如放入用户看到同样的操作。
执行命令格式如下:

docker attach [container ID or NAMES] 

注意:这种方式在执行 exit 命令退出容器时,会导致容器停止运行。

2.4 Docker 停止&关闭容器

有以下两种方式关闭一个正在运行的 Docker 容器:

2.4.1 stop 优雅模式

docker container stop [container ID or NAMES]

简写模式(可省略关键字 container )
docker stop [container ID or NAMES]

举个例子,比如想要停止下图中的 Ubuntu 容器:

在这里插入图片描述

docker 停止关闭 ubuntu 容器
通过容器 ID 或者容器名称都可以停止容器,命令如下:

通过容器 ID 关闭容器
docker stop 4e6fc78cc0c4

2.4.2 kill 强制模式

kill命令强制关闭容器:

docker container kill [container ID or NAMES]

简写模式(可省略关键字 container )
docker kill [container ID or NAMES]

2.4.3 关闭交互形式运行容器

对于交互形式运行的容器如何关闭
前面说到的交互形式运行的容器,可以通过输入exit 或者 Ctrl+d退出容器。

2.4.4 查看已经停止运行的容器

执行如下命令,可以看到那些已经停止运行的容器:

docker container ls -a

图片

查看 docker 已经停止运行的容器
想要重启已经停止运行的容器,命令如下:

docker container start [container ID or NAMES]

另外,docker container restart 命令会将一个已经运行中的容器重新启动。

2.5 Docker 导出&导入容器

2.5.1 导出容器

使用 docker export 命令可以导出容器,比如想导出下面的 Redis 容器:

图片

查看本地的 docker容器

docker export 9e8d11aeef0c > redis.tar

导出的 tar 包快照存于当前目录下

2.5.2 导入容器快照

使用 docker import 命令可以将快照导入为镜像,例如:

cat redis.tar | docker import - test/redis:v1.0

导入成功后,就可以看到新生成的镜像了:


图片

除了通过快照的方式导入容器,还可以通过指定 URL 或者某个目录来导入,例如:

docker import http://example.com/exampleimage.tgz example/imagerepo

2.6 Docker 删除容器

执行如下命令可以删除一个已经停止运行的容器:

docker container rm [container ID or NAMES]

简写模式(可省略关键字 container )
docker rm [container ID or NAMES]

举个例子,比如想要删除下面的 Redis 容器:


在这里插入图片描述

执行如下命令即可:

通过容器 ID 删除
docker rm 023d93457910

2.6.1 强制删除容器

添加 -f 参数可强制删除一个正在运行的容器:

图片

docker查看正在运行的容器
如图示,强制删除这个 Redis 容器:

通过容器 ID 强制删除容器
docker rm -f 207aaf2e3384

2.6.2 删除所有已经停止运行的容器

如何一次性删除所有已经停止的容器

docker container ls -a 命令可以查看所有已经创建的包括停止运行的容器,如果数量太多要一个个删除会很麻烦,执行如下命令即可删除掉所有已经停止运行的容器:

docker container prune

转载于:https://mp.weixin.qq.com/s/v4irskK_uXgsnLe2FUoTLw

2.7 Docker连接

Docker容器互联,端口映射并不是唯一把 docker 连接到另一个容器的方法。docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

2.7.1 容器命名

当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 --name 标识来命名容器,例如:

runoob@runoob:~$  docker run -d -P --name runoob training/webapp python app.py
43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我们可以使用 docker ps 命令来查看容器名称。

runoob@runoob:~$ docker ps -l
CONTAINER ID     IMAGE            COMMAND           ...    PORTS                     NAMES
43780a6eabaa     training/webapp   "python app.py"  ...     0.0.0.0:32769->5000/tcp   runoob

2.7.2 新建网络

下面先创建一个新的 Docker 网络。

$ docker network create -d bridge test-net

参数说明:

2.7.3 连接容器

运行一个容器并连接到新建的 test-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

点击图片查看大图:


image.png

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。
如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping

apt-get update
apt install iputils-ping

这样,test1 容器和 test2 容器建立了互联关系。
如果有多个容器之间需要互相连接,推荐使用 Docker Compose

2.7.4 apt和apt-get区别

由于镜像是基于Ubuntu操作系统构建的,因此需要知道这俩个命令区别
随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版也开始遵循 Ubuntu 的脚步,开始鼓励用户使用 apt 而不是 apt-get
在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cacheapt-config,而且 apt 更加结构化,并为用户提供了管理软件包所需的必要选项。
简单来说就是:apt = apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。

通过 apt 命令,用户可以在同一地方集中得到所有必要的工具,apt 的主要目的是提供一种以让终端用户满意的方式来处理 Linux 软件包的有效方式。
apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。除此之外,它默认启用的几个特性对最终用户也非常有帮助。例如,可以在使用 apt 命令安装或删除程序时看到进度条

虽然 aptapt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令。也就是说,可以用 apt 替换部分 apt-get 系列命令,但不是全部

apt 命令 取代的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示装细节

当然,apt 还有一些自己的命令:

新的apt命令 命令的功能
apt list 列出包含条件的包(已安装,可升级等)
apt edit-sources 编辑源列表

2.7.5 配置DNS

我们可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8

查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf

手动指定容器的配置
如果只想在指定的容器设置 DNS,则可以使用以下命令:

$ docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

  • rm:容器退出时自动清理容器内部的文件系统。
  • h HOSTNAME 或者 --hostname=HOSTNAME:设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
  • dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
  • dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com

注意:如果没有指定,则 Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS

2.8 使用docker运行zabbix-server

2.8.1 容器间的互联

在运行zabbix之前务必要了解容器间互联的方法

创建一个nginx容器
docker run -d -p 80:80 nginx

创建容器,做link,并进入容器中
docker run -it --link quirky_brown:web01 centos-ssh /bin/bash

在容器中访问nginx容器可以ping通
ping web01

命令执行过程

启动apache容器
[root@docker01 ~]# docker run -d httpd:2.4  
3f1f7fc554720424327286bd2b04aeab1b084a3fb011a785b0deab6a34e56955
^[[A[root@docker01 docker ps -a
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS               NAMES
3f1f7fc55472        httpd:2.4"httpd-foreground"6 seconds ago       Up 5 seconds        80/tcp              determined_clarke

拉取一个busybox 镜像
[root@docker01 ~]# docker pull busybox 

启动容器
[root@docker01 ~]# docker run -it  --link determined_clarke:web busybox:latest   /bin/sh 
/ # 
# 使用新的容器访问最初的web容器
/ # ping web 
PING web (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.058 ms
^C
--- web ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.058/0.058/0.058 ms

2.8.2 启动zabbix容器

1、启动一个mysql的容器

docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin

2、启动java-gateway容器监控java服务

docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest

3、启动zabbix-mysql容器使用link连接mysql与java-gateway

docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest

4、启动zabbix web显示,使用link连接zabbix-mysql与mysql。

docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest

2.8.3 关于zabbix API

关于zabbix API可以参考官方文档:https://www.zabbix.com/documentation/3.4/zh/manual/api

获取token方法

# 获取token
[root@docker02 ~]# curl -s -X POST -H 'Content-Type:application/json' -d '
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "test"
},
"id": 1
}' http://10.0.0.100/api_jsonrpc.php
{"jsonrpc":"2.0","result":"d3be707f9e866ec5d0d1c242292cbebd","id":1}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容