docker-compose安裝elasticsearch8.5.0集群

1.Compose 簡介

Compose 是用于定義和運行多容器 Docker 應用程序的工具庄岖。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務心剥。然后优烧,使用一個命令链峭,就可以從 YML 文件配置中創(chuàng)建并啟動所有服務。
Compose 使用的三個步驟:

  • 使用 Dockerfile 定義應用程序的環(huán)境杖刷。
  • 使用 docker-compose.yml 定義構成應用程序的服務驳癌,這樣它們可以在隔離環(huán)境中一起運行喂柒。
  • 最后灾杰,執(zhí)行 docker-compose up 命令來啟動并運行整個應用程序熙参。

2.centos7安裝docker-compose

首先下載Docker Compose

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.14.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

將可執(zhí)行權限應用于二進制文件:

sudo chmod +x /usr/local/bin/docker-compose

創(chuàng)建軟鏈:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

測試是否安裝成功:

docker-compose version

3.Centos7環(huán)境設置:

  • 設置max_map_count不然es啟動報錯
# 查看max_map_count的值孽椰,應該是65530
cat /proc/sys/vm/max_map_count
# 設置max_map_count的值
sysctl -w vm.max_map_count=262144
  • 注意:centos7需要對外暴漏端口9200以及5601黍匾,具體操作請百度锐涯。

4.創(chuàng)建集群

4.1 不帶密碼的集群

  • 開發(fā)環(huán)境自用的es不需要證書驗證
  • 創(chuàng)建一個干凈的目錄,然后進入該目錄霎终。
# es為創(chuàng)建的es用戶莱褒,具體根據(jù)自己的來
cd /home/es
mkdir es_docker_compose
cd es_docker_compose
# 重點是創(chuàng)建下面兩個文件
touch .env
touch docker-compose.yml
  • .env文件中的內容
# kibana_system賬號的密碼 (至少六個字符)广凸,該賬號僅用于一些kibana的內部設置蛛枚,不能用來查詢es
KIBANA_PASSWORD=abcdef

# es和kibana的版本
STACK_VERSION=8.5.0

# 集群名字
CLUSTER_NAME=docker-cluster

# es映射到宿主機的的端口
ES_PORT=9200

# kibana映射到宿主機的的端口
KIBANA_PORT=5601

# es容器的內存大小坤候,請根據(jù)自己硬件情況調整(字節(jié)為單位白筹,當前1G)
MEM_LIMIT=1073741824

# 命名空間谅摄,會體現(xiàn)在容器名的前綴上
COMPOSE_PROJECT_NAME=demo
  • docker-compose.yaml文件內容送漠。操作步驟其實為:1.啟動操作 2.三個es集群一個kibana闽寡。
    注意:docker-compose的版本號與第2步中安裝的docker-compose版本號一致
# docker-compose的版本號
version: "2.14.2"

services:
  es01:
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es02:
    depends_on:
      - es01
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1

  es03:
    depends_on:
      - es02
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - xpack.security.http.ssl.enabled=false
      - xpack.security.transport.ssl.enabled=false
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
  kibana:
    image: kibana:${STACK_VERSION}
    volumes:
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=http://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
    mem_limit: ${MEM_LIMIT}

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  • 啟動應用
    在docker-compose.yaml與.env的目錄下,執(zhí)行命令涎永。
# -d是后臺運行
docker-compose up -d

輸出:

CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS                              NAMES
11663375288d   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   9200/tcp, 9300/tcp                 demo_es03_1
ad6f0390b9cf   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   9200/tcp, 9300/tcp                 demo_es02_1
5080709e5358   kibana:8.5.0          "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   0.0.0.0:5601->5601/tcp             demo_kibana_1
4b1e576fbfd3   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   4 minutes ago   Up 4 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp   demo_es01_1

驗證成功

  • 瀏覽器直接訪問https://docker主機地址:9200/,注意是http羡微。
  • 進入后賬號密碼都是.env里的注釋以及數(shù)據(jù)(請注意查看)
  • 訪問http://localhost:5601/妈倔,就是訪問kibana绸贡。賬號密碼也在.env里恃轩。

4.2 帶密碼以及安全檢查的集群(自簽證書+賬號密碼)

  • 創(chuàng)建一個干凈的目錄,然后進入該目錄松忍。
# es為創(chuàng)建的es用戶鸣峭,具體根據(jù)自己的來
cd /home/es
mkdir es_docker_compose
cd es_docker_compose
# 重點是創(chuàng)建下面兩個文件
touch .env
touch docker-compose.yml
  • .env文件中的內容
# elastic賬號的密碼 (至少六個字符)
ELASTIC_PASSWORD=123456

# kibana_system賬號的密碼 (至少六個字符)酥艳,該賬號僅用于一些kibana的內部設置充石,不能用來查詢es
KIBANA_PASSWORD=abcdef

# es和kibana的版本
STACK_VERSION=8.5.0

# 集群名字
CLUSTER_NAME=docker-cluster

# x-pack安全設置,這里選擇basic坷剧,基礎設置喊暖,如果選擇了trail陵叽,則會在30天后到期
LICENSE=basic
#LICENSE=trial

# es映射到宿主機的的端口
ES_PORT=9200

# kibana映射到宿主機的的端口
KIBANA_PORT=5601

# es容器的內存大小巩掺,請根據(jù)自己硬件情況調整(字節(jié)為單位,當前1G)
MEM_LIMIT=1073741824

# 命名空間,會體現(xiàn)在容器名的前綴上
COMPOSE_PROJECT_NAME=es
  • docker-compose.yaml文件內容刊殉。操作步驟其實為:1.啟動操作 2.三個es集群一個kibana记焊。
    注意:docker-compose的版本號與第2步中安裝的docker-compose版本號一致
# docker-compose的版本號
version: "2.14.2"

services:
  setup:
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
    user: "0"
    command: >
      bash -c '
        if [ x${ELASTIC_PASSWORD} == x ]; then
          echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
          exit 1;
        elif [ x${KIBANA_PASSWORD} == x ]; then
          echo "Set the KIBANA_PASSWORD environment variable in the .env file";
          exit 1;
        fi;
        if [ ! -f config/certs/ca.zip ]; then
          echo "Creating CA";
          bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
          unzip config/certs/ca.zip -d config/certs;
        fi;
        if [ ! -f config/certs/certs.zip ]; then
          echo "Creating certs";
          echo -ne \
          "instances:\n"\
          "  - name: es01\n"\
          "    dns:\n"\
          "      - es01\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: es02\n"\
          "    dns:\n"\
          "      - es02\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          "  - name: es03\n"\
          "    dns:\n"\
          "      - es03\n"\
          "      - localhost\n"\
          "    ip:\n"\
          "      - 127.0.0.1\n"\
          > config/certs/instances.yml;
          bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
          unzip config/certs/certs.zip -d config/certs;
        fi;
        echo "Setting file permissions"
        chown -R root:root config/certs;
        find . -type d -exec chmod 750 \{\} \;;
        find . -type f -exec chmod 640 \{\} \;;
        echo "Waiting for Elasticsearch availability";
        until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
        echo "Setting kibana_system password";
        until curl -s -X POST --cacert config/certs/ca/ca.crt -u elastic:${ELASTIC_PASSWORD} -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
        echo "All done!";
      '
    healthcheck:
      test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
      interval: 1s
      timeout: 5s
      retries: 120

  es01:
    depends_on:
      setup:
        condition: service_healthy
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - ${ES_PORT}:9200
    environment:
      - node.name=es01
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es02,es03
      - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es01/es01.key
      - xpack.security.http.ssl.certificate=certs/es01/es01.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es01/es01.key
      - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es02:
    depends_on:
      - es01
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata02:/usr/share/elasticsearch/data
    environment:
      - node.name=es02
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es03
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es02/es02.key
      - xpack.security.http.ssl.certificate=certs/es02/es02.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es02/es02.key
      - xpack.security.transport.ssl.certificate=certs/es02/es02.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  es03:
    depends_on:
      - es02
    image: elasticsearch:${STACK_VERSION}
    volumes:
      - certs:/usr/share/elasticsearch/config/certs
      - esdata03:/usr/share/elasticsearch/data
    environment:
      - node.name=es03
      - cluster.name=${CLUSTER_NAME}
      - cluster.initial_master_nodes=es01,es02,es03
      - discovery.seed_hosts=es01,es02
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=true
      - xpack.security.http.ssl.key=certs/es03/es03.key
      - xpack.security.http.ssl.certificate=certs/es03/es03.crt
      - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.http.ssl.verification_mode=certificate
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=certs/es03/es03.key
      - xpack.security.transport.ssl.certificate=certs/es03/es03.crt
      - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - xpack.license.self_generated.type=${LICENSE}
    mem_limit: ${MEM_LIMIT}
    ulimits:
      memlock:
        soft: -1
        hard: -1
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

  kibana:
    depends_on:
      es01:
        condition: service_healthy
      es02:
        condition: service_healthy
      es03:
        condition: service_healthy
    image: kibana:${STACK_VERSION}
    volumes:
      - certs:/usr/share/kibana/config/certs
      - kibanadata:/usr/share/kibana/data
    ports:
      - ${KIBANA_PORT}:5601
    environment:
      - SERVERNAME=kibana
      - ELASTICSEARCH_HOSTS=https://es01:9200
      - ELASTICSEARCH_USERNAME=kibana_system
      - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
      - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
    mem_limit: ${MEM_LIMIT}
    healthcheck:
      test:
        [
          "CMD-SHELL",
          "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
        ]
      interval: 10s
      timeout: 10s
      retries: 120

volumes:
  certs:
    driver: local
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local
  kibanadata:
    driver: local
  • 啟動應用
    在docker-compose.yaml與.env的目錄下弛说,執(zhí)行命令木人。
# -d表示后臺啟動
docker-compose up -d

輸出:

Creating network "demo_default" with the default driver
Pulling setup (elasticsearch:8.5.0)...
8.5.0: Pulling from library/elasticsearch
Digest: sha256:8c666cb1e76650306655b67644a01663f9c7a5422b2c51dd570524267f11ce3d
Status: Downloaded newer image for elasticsearch:8.5.0
Pulling kibana (kibana:8.5.0)...
8.5.0: Pulling from library/kibana
Digest: sha256:cf34801f36a2e79c834b3cdeb0a3463ff34b8d8588c3ccdd47212c4e0753f8a5
Status: Downloaded newer image for kibana:8.5.0
Creating demo_setup_1 ... done
Creating demo_es01_1  ... done
Creating demo_es02_1  ... done
Creating demo_es03_1  ... done
Creating demo_kibana_1 ... done
  • 查看容器的狀態(tài),負責啟動的setup容器已經退出醒第,其他容器正常運行。
docker ps -a

輸出:

CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS                      PORTS                              NAMES
c8ce010cddfc   kibana:8.5.0          "/bin/tini -- /usr/l…"   20 minutes ago   Up 20 minutes (healthy)     0.0.0.0:5601->5601/tcp             demo_kibana_1
78662d44ae31   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     9200/tcp, 9300/tcp                 demo_es03_1
7e96273872cb   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     9200/tcp, 9300/tcp                 demo_es02_1
8b8be1d645ba   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   21 minutes ago   Up 21 minutes (healthy)     0.0.0.0:9200->9200/tcp, 9300/tcp   demo_es01_1
c48ffb724ca2   elasticsearch:8.5.0   "/bin/tini -- /usr/l…"   21 minutes ago   Exited (0) 20 minutes ago                                      demo_setup_1
  • 查看setup容器日志,提示啟動成功
docker logs demo_setup_1

輸出:

Setting file permissions
Waiting for Elasticsearch availability
Setting kibana_system password
All done!
  • 如果需要使用curl命令像ES發(fā)請求窒朋,必須將crt文件從容器中復制出來
docker cp demo_es01_1:/usr/share/elasticsearch/config/certs/es01/es01.crt .

驗證成功

  • 瀏覽器直接訪問https://docker主機地址:9200/,注意是https。因為帶證書榔至。
  • 進入后賬號密碼都是.env里的注釋以及數(shù)據(jù)(請注意查看)
  • 訪問http://localhost:5601/唧取,就是訪問kibana划提。賬號密碼也在.env里。

5.清理環(huán)境

  • 如果要刪除es淡诗,執(zhí)行docker-compose down就會刪除容器韩容,但是唐瀑,此命令不會刪除數(shù)據(jù)哄辣,下次執(zhí)行docker-compose up -d后,新的es集群中會出現(xiàn)剛才創(chuàng)建的test001索引毅弧,并且數(shù)據(jù)也在当窗。
  • 這是因為docker-compose.yaml中使用了數(shù)據(jù)卷volume存儲es集群的關鍵數(shù)據(jù)超全,這些輸入被保存在宿主機的磁盤上
> docker volume ls

DRIVER    VOLUME NAME
local     demo_certs
local     demo_esdata01
local     demo_esdata02
local     demo_esdata03
local     demo_kibanadata
  • 執(zhí)行docker volume rm demo_certs demo_esdata01 demo_esdata02 demo_esdata03即可將它們徹底清除
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嘶朱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脉课,更是在濱河造成了極大的恐慌倘零,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷泽,死亡現(xiàn)場離奇詭異司致,居然都是意外死亡聋迎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門霉晕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庭再,“玉大人,你說我怎么就攤上這事牺堰≈羟幔” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵萌焰,是天一觀的道長哺眯。 經常有香客問我谷浅,道長扒俯,這世上最難降的妖魔是什么一疯? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任撼玄,我火速辦了婚禮,結果婚禮上墩邀,老公的妹妹穿的比我還像新娘掌猛。我一直安慰自己,他們只是感情好眉睹,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布荔茬。 她就那樣靜靜地躺著,像睡著了一般竹海。 火紅的嫁衣襯著肌膚如雪慕蔚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天斋配,我揣著相機與錄音孔飒,去河邊找鬼灌闺。 笑死,一個胖子當著我的面吹牛坏瞄,可吹牛的內容都是我干的桂对。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸠匀,長吁一口氣:“原來是場噩夢啊……” “哼蕉斜!你這毒婦竟也來了?” 一聲冷哼從身側響起狮崩,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛛勉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睦柴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诽凌,經...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年坦敌,在試婚紗的時候發(fā)現(xiàn)自己被綠了侣诵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狱窘,死狀恐怖杜顺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蘸炸,我是刑警寧澤躬络,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站搭儒,受9級特大地震影響穷当,放射性物質發(fā)生泄漏。R本人自食惡果不足惜淹禾,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一馁菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铃岔,春花似錦汪疮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纺且,卻和暖如春盏道,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隆檀。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工摇天, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粹湃,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓泉坐,卻偏偏與公主長得像为鳄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腕让,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容