一篇文章學(xué)會docker

一篇文章學(xué)會docker

docker安裝

docker在線安裝

1.更新yum到最新

yum update

2.卸載舊版本

sudo yum remove docker \
            docker-client \
            docker-client-latest \
            docker-common \
            docker-latest \
            docker-latest-logrotate \
            docker-logrotate \
            docker-selinux \
            docker-engine-selinux \
            docker-engine

3.安裝需要的軟件包殃姓,yum-util提供yum-config-manager功能

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

3.設(shè)置yum倉庫

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

4.安裝docker铐然,默認y確認

yum install -y docker-ce

5.啟動并查看docker版本

systemctl start docker
docker -v

離線安裝

1.下載好docker的離線二進制包

wget https://download.docker.com/linux/static/stable/x86_64/docker-18.06.3-ce.tgz

2.解壓docker涝滴,并將所有docker下所有內(nèi)容已到/usr/bin目錄下

tar -zxvf docker-18.06.3-ce.tgz
sudo cp docker/* /usr/bin

3.開啟docker服務(wù)

sudo dockerd &

4.現(xiàn)在你可以嘗試著打印下版本號,試著看看 images鲤拿,看看 info

sudo docker --version

5.docker命令不需要敲sudo的方法

sudo groupadd docker
sudo usermod -aG docker 用戶名

6.綁定docker倉庫ip和端口

sudo vim /etc/docker/daemon.json
{ "insecure-registries":["ip:port"] }

7.注冊docker為service服務(wù)

注冊后可以通過systemclt來管理socker服務(wù)

systemctl start/stop/restart/ docker

將以下內(nèi)容寫入/etc/systemd/system/docker.service中(沒有該文件則新建)假褪。

vim /etc/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target

8.修改文件為可執(zhí)行文件

chmod +x /etc/systemd/system/docker.service #添加文件權(quán)限

9.啟動docker

systemctl daemon-reload #重載unit配置文件
systemctl start docker #啟動Docker
systemctl enable docker.service #設(shè)置開機自啟

docker架構(gòu)

image-20200319214545670

docker三個基本概念

  • 鏡像images:docker鏡像(image),相當(dāng)于一個root文件系統(tǒng)近顷,如官方鏡像ubuntu:16.04生音,包含了ubuntu:16.04完整的最小的root文件系統(tǒng)。
  • 容器container:鏡像(image)和容器(container)的關(guān)系幕庐,好比面向?qū)ο笾蓄惡蛯ο蟮年P(guān)系久锥。鏡像是靜態(tài)的定義,容器是鏡像實例化的實體异剥。
  • 倉庫repository:倉庫(repository)可以看作一個代碼管理中心,用來保存鏡像絮重。

配置docker鏡像加速器

Docker Registry 公開服務(wù)是開放給用戶使用冤寿、允許用戶管理鏡像的 Registry 服 務(wù)。

最常使用的 Registry 公開服務(wù)是官方的 Docker Hub青伤,這也是默認的 Registry督怜,并 擁有大量的高質(zhì)量的官方鏡像。

Docker Hub下載docker鏡像狠角,比較慢号杠,一般會配置鏡像加速器:

1.daocloud加速器

終端執(zhí)行:

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

這個命令是修改/etc/docker/daemon.json文件,寫入一個json數(shù)據(jù)如下

[root@s20 ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}# 配置好了docker加速器,下載鏡像就快很多了

注意:有的人使用這個命令后會出問題,這個問題可以通過修改這個json文本丰歌,去掉最后的逗號姨蟋,即可。

2.阿里云加速器

通過修改daemon配置文件/etc/docker/daemon.json來使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jaqjblse.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

鏡像加速地址立帖,通過登錄阿里云服務(wù)搜索得到眼溶。

docker操作命令

docker服務(wù)相關(guān)命令

1.啟動docker服務(wù)

systemctl start docker

2.停止docker服務(wù)

systemctl stop docker

3.重啟docker服務(wù)

systemctl restart docker

4.查看docker服務(wù)狀態(tài)

systemctl status docker

5.開機自啟動docker

systemctl enable docker

docker鏡像相關(guān)命令

docker鏡像命令如下幾類:

1.查看鏡像

docker images
docker images -q # 查看所有的鏡像id

2.搜索鏡像

docker search 鏡像名稱

3.拉取鏡像

docker pull 鏡像名[:版本]
docker pull centos:7

可以指定版本,版本號取hub倉庫查找:hub.docker.com

4.刪除鏡像

docker rmi 容器id/容器名  # 刪除指定本地鏡像
docker rmi `docker images -q`  # 刪除所有本地鏡像

docker容器相關(guān)命令

1.查看容器

docker ps  # 查看正在運行的容器
docker ps -a  # 查看所有容器晓勇,包括停止的

2.創(chuàng)建并啟動容器

docker run 參數(shù)

參數(shù)說明

  • -i:interactive-交互式堂飞,保持容器運行,與-t同時使用绑咱,-it創(chuàng)建容器并進入绰筛,退出后,容器自動關(guān)閉
  • -t:terminate-終端描融,為容器分配一個偽終端铝噩,通常與-i同時使用
  • -d:daemon-守護,以守護(后臺)模型運行容器稼稿,使用docker exec 進入容器
  • -it:創(chuàng)建交互式容器薄榛,-id:創(chuàng)建守護式容器
  • --name:為創(chuàng)建的容器命名

3.進入容器

docker exec 參數(shù) 容器名  # 退出容器讳窟,容器不會關(guān)閉

4.停止容器

docker stop 容器名

5.刪除容器,運行狀態(tài)需要先停止在刪除

docker rm 容器名

6.查看容器信息

docker inspect 容器名

容器的數(shù)據(jù)卷

數(shù)據(jù)卷概念

1.數(shù)據(jù)卷:宿主機中的一個目錄或文件

宿主機和容器中映射的文件夾敞恋,或者文件

image-20200321231232301

2.數(shù)據(jù)卷的特點

  • 數(shù)據(jù)卷目錄和容器目錄綁定是丽啡,目錄的修改對宿主機和容器是同步的
  • 一個數(shù)據(jù)卷可以被多個容器同時掛載
  • 一個容器也可以掛載多個數(shù)據(jù)卷

3.數(shù)據(jù)卷作用

  • 容器數(shù)據(jù)持久化
  • 外部機器和容器間通信
  • 容器之間數(shù)據(jù)交換

配置數(shù)據(jù)卷

1.創(chuàng)建容器時,使用-v參數(shù)設(shè)置數(shù)據(jù)卷

docker run ... -v 宿主機目錄(文件):容器內(nèi)目錄(文件)

注意:

  • 目錄必須是絕對路徑
  • 如果目錄不存在硬猫,會自動創(chuàng)建
  • 可以掛載多個數(shù)據(jù)卷

數(shù)據(jù)卷容器

多個容器進行數(shù)據(jù)交換

  1. 多個容器掛載數(shù)據(jù)卷同一個數(shù)據(jù)卷
  2. 數(shù)據(jù)卷容器
image-20200321234111606

配置數(shù)據(jù)卷容器

1.創(chuàng)建啟動c3數(shù)據(jù)卷容器补箍,使用-v設(shè)置數(shù)據(jù)卷

docker run -it --name=c3 -v /volume centos /bin/bash

2.創(chuàng)建啟動c1,c2容器,使用 --volumes-from 參數(shù) 設(shè)置數(shù)據(jù)卷

docker run -it --name=c1 --volumns-from c3 centos /bin/bash
docker run -it --name=c2 --volumns-from c3 centos /bin/bash

作用:

  • 創(chuàng)建一個容器啸蜜,掛載一個目錄坑雅,讓其他容器繼承該容器(--volumn-from
  • 通過簡單的方式實現(xiàn)數(shù)據(jù)卷配置

docker端口映射

1.概念

容器內(nèi)的網(wǎng)絡(luò)服務(wù)和外部機器不能直接通信,但是外部機器可以和宿主機直接通信衬横,這樣就需要通過宿主機搭建橋梁裹粤。

讓容器中的網(wǎng)絡(luò)服務(wù)需要被外部機器訪問是,可以將容器中提供服務(wù)的端口映射到宿主機的端口上蜂林,外部機器訪問宿主機的該端口是遥诉,間接訪問容器的服務(wù),這個就被稱作:端口映射

端口映射通過-p參數(shù)指定

2.實現(xiàn)端口映射

docker -run ... -p 宿主機port:容器中port 容器名

docker應(yīng)用部署實例

docker部署mysql

實現(xiàn)docker容器中部署mysql噪叙,并通過外部mysql客戶端操作mysql server

1.搜索myslq鏡像

docker search mysql

2.拉取mysql鏡像

docker pull mysql:5.6

3.創(chuàng)建容器矮锈,設(shè)置端口映射,目錄映射

root目錄下創(chuàng)建/data/mysql

mkdir -p /opt/mysql
cd /opt/mysql

運行容器

docker run -id \
-p 3307:3306 \
--name c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6

參數(shù)說明

  • -p 3307:3306睁蕾,容器3306映射到宿主機3307
  • -v $PWD/conf:/etc/mysql/conf.d苞笨,當(dāng)前路徑下/conf掛載到容器/etc/mysql/conf.d
  • -v $PWD/logs:/logs,當(dāng)前路徑下/conf掛載到容器/logs
  • -v $PWD/data:/var/lib/mysql子眶,當(dāng)前路徑下/conf掛載到容器/var/lib/mysql
  • -e MYSQL_ROOT_PASSWORD=123456瀑凝,初始root密碼 -e 配置環(huán)境變量

docker部署tomcat

1.搜索tomcat鏡像

docker search tomcat

2.拉取tomcat鏡像

docker pull tomcat

3.創(chuàng)建容器,設(shè)置端口映射壹店,目錄映射

root目錄下創(chuàng)建/opt/tomcat

mkdir -p /opt/tomcat
cd /opt/tomcat

運行容器

docker run -id \
-p 8080:8080 \
--name c_tomcat \
-v $PWD:/usr/local/tomcat/webapps \
tomcat

參數(shù)說明

  • -p 8080:8080猜丹,容器8080映射到宿主機8080
  • -v $PWD/:/usr/local/tomcat/webapps,當(dāng)前路徑下/conf掛載到容器webapps

docker部署nginx

實現(xiàn)docker容器中部署mysql硅卢,并通過外部mysql客戶端操作mysql server

1.搜索nginx鏡像

docker search nginx

2.拉取nginx鏡像

docker pull nginx

3.創(chuàng)建容器射窒,設(shè)置端口映射,目錄映射

root目錄下創(chuàng)建/data/mysql

mkdir -p /opt/nginx
cd /opt/nginx
mkdir conf

拷貝nginx官方配置文件将塑,寫入/opt/nginx/conf/nginx.conf

#user  nobody;
#nginx進程脉顿,一般數(shù)值為cpu核數(shù)
worker_processes  1;
#錯誤日志存放目錄
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#進程pid存放位置
#pid        logs/nginx.pid;

#工作模式及連接數(shù)上限
events {
    #單個后臺worker process進程的最大并發(fā)鏈接數(shù)
    worker_connections  1024;
}


http {
    #文件擴展名與類型映射表
    include       mime.types;
    #默認文件類型
    default_type  application/octet-stream;
    #設(shè)置日志模式
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #nginx訪問日志
    #access_log  logs/access.log  main;
    #開啟高效傳輸模式   
    sendfile        on;
    #激活tcp_nopush參數(shù)可以允許把httpresponse header和文件的開始放在一個文件里發(fā)布, 積極的作用是減少網(wǎng)絡(luò)報文段的數(shù)量
    #tcp_nopush     on;
    #連接超時時間点寥,單位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #開啟gzip壓縮功能
    #gzip  on;
    
    #基于域名的虛擬主機
    server {
        #監(jiān)聽端口
        listen       80;
        server_name  localhost;
        #編碼識別
        #charset koi8-r;
        #日志格式及日志存放路徑
        #access_log  logs/host.access.log  main;

        location / {
            #站點根目錄艾疟,即網(wǎng)站程序存放目錄 
            root   html;
            #首頁排序
            index  index.html index.htm;
        }
        #錯誤頁面
        #error_page  404              /404.html;
        # 將服務(wù)器錯誤頁面重定向到靜態(tài)頁面/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }        

       
        #代理PHP腳本到Apache上監(jiān)聽127.0.0.1:80
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

   
        #將PHP腳本傳遞到正在監(jiān)聽127.0.0.1:9000的FastCGI服務(wù)器
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        #如果Apache的文檔根目錄與nginx的根目錄一致,則拒絕訪問.htaccess文件
        #location ~ /\.ht {
        #    deny  all;
        #}
    }



    #另一個虛擬主機,混合使用IP蔽莱、名稱和基于端口的配置
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    服務(wù)的證書
    #    ssl_certificate      cert.pem;
    #    服務(wù)端key
    #    ssl_certificate_key  cert.key;
    #    會話緩存
    #    ssl_session_cache    shared:SSL:1m;
    #    會話超時時間
    #    ssl_session_timeout  5m;
    #    #加密算法
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    啟動加密算法
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}

運行容器

docker run -id \
-p 80:80 \
--name c_nginx \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx

參數(shù)說明

  • -p 80:80弟疆,容器80映射到宿主機80
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf,掛載配置文件到容器

docker部署redis

1.搜索redis鏡像

docker search redis

2.拉取redis鏡像

docker pull redis

3.創(chuàng)建容器盗冷,設(shè)置端口映射怠苔,目錄映射

運行容器

docker run -id \
-p 6379:6379 \
--name c_redis \
redis:5.0

4.外部鏈接redis服務(wù)

./redis-cli.exe -h ip -p port

docker鏡像原理

1.操作系統(tǒng)重要的組成部分:文件管理子系統(tǒng)。而linux文件系統(tǒng)有bootfs和rootfs兩部分組成:

  • bootfs:包含bootloader(引導(dǎo)加載程序)和kernel(內(nèi)核)

  • rootfs:root文件系統(tǒng)仪糖,包含的就是典型Linux系統(tǒng)中的/dev柑司,/proc,/etc

image-20200323235347486

2.docker鏡像是由特殊的文件系統(tǒng)疊加而成

  • 最底層是bootfs锅劝,并使用宿主機的bootfs
  • 第二層是root文件系統(tǒng)rootfs攒驰,成為base image
  • 在往上疊加其他鏡像文件

3.docker鏡像的特點

  • 統(tǒng)一的文件系統(tǒng),隱藏了很多層的存在故爵,用戶看來玻粪,只存在一個文件系統(tǒng)。

  • 一個鏡像放在另一個鏡像上稠集,下面的稱為父鏡像奶段,最底層稱為基礎(chǔ)鏡像。

  • 當(dāng)一個鏡像容器啟動剥纷,docker在會在頂層加載一個讀寫文件系統(tǒng)作為容器

image-20200324000243929

4.小結(jié)

docker鏡像本質(zhì):一個分層的文件系統(tǒng),能夠不斷復(fù)用呢铆,

centos鏡像比操作系統(tǒng)iso小很多晦鞋,是因為對rootfs的復(fù)用。

tomcat鏡像比安裝包大很多棺克,是因為有很多依賴父鏡像和基礎(chǔ)鏡像悠垛。

Docker鏡像制作

1.容器轉(zhuǎn)鏡像

在已存在的鏡像中做修改,最終提交為新的鏡像

docker commit 容器id 鏡像名稱:版本號

還可以將鏡像壓縮為文件娜谊,進行傳輸确买。

docker save -o 壓縮文件名 鏡像名稱:版本號

將文件解壓為鏡像

docker load -i 壓縮文件名

注意:通過這種方式生成的容器,目錄掛載的地方不會改變纱皆,其他位置都會改變湾趾。

2.dockerfile制作鏡像*

dockerfile是一個文件,包含了一條條指令派草,每一條指令構(gòu)建一層搀缠,基于基礎(chǔ)鏡像,最終構(gòu)建一個新鏡像近迁。

<img src="https://tva1.sinaimg.cn/large/00831rSTgy1gd4bnw8ienj30hg0l8gpt.jpg" alt="image-20200324002244500" style="zoom:67%;" />

3.dockerfile命令

關(guān)鍵字 作用 備注
FROM 指定父鏡像 指定dockerfile基礎(chǔ)鏡像
MAINTAINER 作者信息 標識dockerfile作者
LABEL 標簽 docker標簽艺普,可代替maintainer
RUN 執(zhí)行命令 指定一段命令,默認/bin/sh;RUN commond或RUN["commond", "param1", "param2"]
CMD 容器啟動命令 容器啟動時候的默認命令歧譬,格式CMD command p1 p2
ENTRYPOINT 入口 一般在制作一些執(zhí)行就關(guān)閉的容器中使用
COPY 復(fù)制文件 build的時候復(fù)制文件到images中
ADD 添加文件 build的時候添加到images岸浑,另含解壓作用,來源可以是遠程服務(wù)
ENV 環(huán)境變量 指定build時候的環(huán)境變量瑰步,在容器時可以通過 -e 格式name=value覆蓋
ARG 構(gòu)建參數(shù) 在構(gòu)建的時候使用的參數(shù)矢洲,ENV中相同名字的值始終覆蓋arg的參數(shù)
VOLUME 定義外部掛載數(shù)據(jù)卷 指定build的image那些目錄可以掛載到文件系統(tǒng)中,啟動時使用-v格式綁定。
EXPOSE 暴露端口 定義容器運行監(jiān)聽的端口卡儒,啟動容器時使用-p來綁定胞皱,EXPOST 8080
WORKDIR 工作目錄 指定容器內(nèi)部工作目錄,沒有的則自動創(chuàng)建掘譬,“/”開頭是絕對路徑,不是“/”開頭呻拌,則是workdir路徑的相對路徑
USER 指定指定用戶 指定build或者啟動容器時葱轩,在 RUN COM ENTRYPOINT執(zhí)行的時候的用戶
HEALTHCHECK 檢查健康 指定檢測當(dāng)前容器的健康檢測的命令,基本沒用
ONBUILD 觸發(fā)器 存在ONBUILD關(guān)鍵字的鏡像作基礎(chǔ)鏡像的時候藐握,當(dāng)指定FROM完成之后靴拱,會指定ONBUILD的命令,用處不大
STOPSINGNAL 發(fā)送信號到宿主機 STOPSINGNAL指令設(shè)置將發(fā)送到容器的系統(tǒng)調(diào)用信號以退出
SHELL 指定執(zhí)行腳本的shell 指定RUN COM ENTRYPOINT執(zhí)行命令的時候猾普,使用的shell

4.dockerfile制作鏡像例子

vim centos_dockerfiles
# 1.定義父鏡像
FROM centos:7
# 2.指定作者信息
MAINTAINER ryxiong <ryxiong.com>
# 3.執(zhí)行安裝vim命令
RUN yum install -y vim
# 4.定義默認工作目錄
WORKDIR /usr
# 5.定義容器啟動執(zhí)行的命令
CMD /bin/bash

制作命令

docker build -f ./centos_dockerfiles -t centos:1.0 .
  • -f 指定dockerfile文件
  • -t 執(zhí)行鏡像名字

案例-django項目docker部署

1.準備django運行的環(huán)境基礎(chǔ)鏡像

[ryxiong@ryxiong ~]$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
django               1.0                 ba0aa44992b1        9 hours ago         372MB

2.準備django項目工程文件

django-test

3.編寫dockerfile文件

FROM django:1.0
MAINTAINER ryxiong
ADD ./django-test  # 當(dāng)前路徑的django工程
CD ./django-test  # 進入工程文件根目錄
CMD python3 manage.py runserver

4.打包項目鏡像

docker build -f ./dockerfile -t web:1.0 .

5.根據(jù)項目鏡像啟動容器

docker run -id -p 9000:8000 web:1.0

6.查看項目容器狀態(tài)

docker ps

Docker服務(wù)編排

docker-compose

1.背景

微服務(wù)架構(gòu)中應(yīng)用系統(tǒng)包含若干個微服務(wù)袜炕,每個微服務(wù)部署多個實例,每個微服務(wù)手動啟停初家,維護工作巨大偎窘。

  • Dockerfile build image 或 docker pull image
  • 創(chuàng)建多個container
  • 管理多個container(啟動停止)

2.服務(wù)編排

按照一定的業(yè)務(wù)規(guī)則批量管理容器

3.docker-compose工具

Docker-compose是一個編排多容器分布式部署的工具,提供命令集中管理容器化應(yīng)用的完整開發(fā)周期溜在,包括服務(wù)構(gòu)建陌知,啟動和停止,使用方法:

  1. 利用dockerfile定義運行環(huán)境鏡像
  2. 使用docker-compose.yml定義組成應(yīng)用的各服務(wù)
  3. 運行docker-compose up 啟動應(yīng)用
image-20200328095301188

4.docker-compose安裝

docker-compose是基于docker掖肋,安裝之前仆葡,需要先安裝docker,docker-compose以編譯好的二進制包方式安裝在linux中志笼。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

其他版本替換1.24.1沿盅。

設(shè)置文件可執(zhí)行權(quán)限

$ 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
cker-compose version 1.24.1, build 4667896b

docker-compose的卸載

rm /usr/local/bin/docker-compose

docker-compose部署項目案例

1.創(chuàng)建測試項目

$ mkdir composetest
$ cd composetest

編寫composetest/app.py 文件代碼

import time
import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

在此示例中,redis 是應(yīng)用程序網(wǎng)絡(luò)上的 redis 容器的主機名籽腕,該主機使用的端口為 6379嗡呼。

在 composetest 目錄中創(chuàng)建另一個名為 requirements.txt 的文件,內(nèi)容如下:

flask
redis

2.創(chuàng)建dockerfile文件

在 composetest 目錄中皇耗,創(chuàng)建一個名為的文件 Dockerfile南窗,內(nèi)容如下:

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]

Dockerfile 內(nèi)容解釋:

  • FROM python:3.7-alpine: 從 Python 3.7 映像開始構(gòu)建鏡像。

  • WORKDIR /code: 將工作目錄設(shè)置為 /code。

  •   ENV FLASK_APP app.py
      ENV FLASK_RUN_HOST 0.0.0.0
    

    設(shè)置 flask 命令使用的環(huán)境變量万伤。

  • RUN apk add --no-cache gcc musl-dev linux-headers: 安裝 gcc窒悔,以便諸如 MarkupSafe 和 SQLAlchemy 之類的 Python 包可以編譯加速。

  •   COPY requirements.txt requirements.txt
      RUN pip install -r requirements.txt
    

    復(fù)制 requirements.txt 并安裝 Python 依賴項敌买。

  • COPY . .: 將 . 項目中的當(dāng)前目錄復(fù)制到 . 鏡像中的工作目錄简珠。

  • CMD ["flask", "run"]: 容器提供默認的執(zhí)行命令為:flask run。

3.創(chuàng)建 docker-compose.yml

在測試目錄中創(chuàng)建一個名為 docker-compose.yml 的文件虹钮,然后粘貼以下內(nèi)容:

docker-compose.yml 配置文件

# yaml 配置
version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

該 Compose 文件定義了兩個服務(wù):web 和 redis聋庵。

  • web:該 web 服務(wù)使用從 Dockerfile 當(dāng)前目錄中構(gòu)建的鏡像。然后芙粱,它將容器和主機綁定到暴露的端口 5000祭玉。此示例服務(wù)使用 Flask Web 服務(wù)器的默認端口 5000 。
  • redis:該 redis 服務(wù)使用 Docker Hub 的公共 Redis 映像春畔。

4.使用 Compose 命令構(gòu)建和運行您的應(yīng)用

在測試目錄中脱货,執(zhí)行以下命令來啟動應(yīng)用程序:

docker-compose up

如果你想在后臺執(zhí)行該服務(wù)可以加上 -d 參數(shù):

docker-compose up -d

5.yml配置指令參考

build

指定為構(gòu)建鏡像上下文路徑

version: "3.7"
services:
  webapp:
    build: ./dir

depends_on

設(shè)置依賴關(guān)系。

  • docker-compose up :以依賴性順序啟動服務(wù)律姨。在以下示例中振峻,先啟動 db 和 redis ,才會啟動 web择份。
  • docker-compose up SERVICE :自動包含 SERVICE 的依賴項扣孟。在以下示例中,docker-compose up web 還將創(chuàng)建并啟動 db 和 redis荣赶。
  • docker-compose stop :按依賴關(guān)系順序停止服務(wù)哈打。在以下示例中,web 在 db 和 redis 之前停止讯壶。
version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

deploy

指定與服務(wù)的部署和運行有關(guān)的配置。只在 swarm 模式下才會有用湾盗。

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      mode:replicated
      replicas: 6
      endpoint_mode: dnsrr
      labels: 
        description: "This redis service label"
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s

可以選參數(shù):

endpoint_mode:訪問集群服務(wù)的方式伏蚊。

endpoint_mode: vip 
# Docker 集群服務(wù)一個對外的虛擬 ip。所有的請求都會通過這個虛擬 ip 到達集群服務(wù)內(nèi)部的機器格粪。
endpoint_mode: dnsrr
# DNS 輪詢(DNSRR)躏吊。所有的請求會自動輪詢獲取到集群 ip 列表中的一個 ip 地址。

labels:在服務(wù)上設(shè)置標簽帐萎”确可以用容器上的 labels(跟 deploy 同級的配置) 覆蓋 deploy 下的 labels。

mode:指定服務(wù)提供的模式疆导。

  • replicated:復(fù)制服務(wù)赁项,復(fù)制指定服務(wù)到集群的機器上。

  • global:全局服務(wù),服務(wù)將部署至集群的每個節(jié)點悠菜。

  • 圖解:下圖中黃色的方塊是 replicated 模式的運行情況舰攒,灰色方塊是 global 模式的運行情況。

    img

environment

添加環(huán)境變量悔醋。您可以使用數(shù)組或字典摩窃、任何布爾值,布爾值需要用引號引起來芬骄,以確保 YML 解析器不會將其轉(zhuǎn)換為 True 或 False猾愿。

environment:
  RACK_ENV: development
  SHOW: 'true'

expose

暴露端口,但不映射到宿主機账阻,只被連接的服務(wù)訪問蒂秘。

僅可以指定內(nèi)部端口為參數(shù):

expose:
 - "3000"
 - "8000"

image

指定容器運行的鏡像。以下格式都可以:

image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 鏡像id

volumes

將主機的數(shù)據(jù)卷或著文件掛載到容器里宰僧。

version: "3.7"
services:
  db:
    image: postgres:latest
    volumes:
      - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
      - "/localhost/data:/var/lib/postgresql/data"

docker私有倉庫

搭建私有倉庫

1.拉取私有倉庫鏡像

docker pull registry

2.啟動私有倉庫

docker run -id --name registry -p 5000:5000 registry

3.驗證私有倉庫

打開瀏覽器材彪,輸入http://私有倉庫服務(wù)器ip:5000/v2/_catalog,看到{"repositories":[]}表示搭建成功

4.修改daemon.json

vim /etc/docker/daemon.json

添加key琴儿,信任私有倉庫地址段化,寫入自己私有倉庫真實ip

{"insecure-registries":["私有倉庫服務(wù)器ip:5000"]}

私有倉庫上傳和拉取

1.標記鏡像為私有倉庫鏡像

docker tag centos:7 私有倉庫ip:5000/centos:7

2.上傳標記的鏡像

docker push 私有倉庫ip:5000/centos:7

3.拉取到本地

docker pull 私有倉庫ip:5000/centos:7

Docker-machine

簡介

Docker Machine 是一種讓您在虛擬主機上安裝 Docker 的工具,并可以使用 docker-machine 命令來管理主機造成。

Docker Machine 功能

  • 集中管理所有的 docker 主機
  • 啟動显熏,檢查,停止和重新啟動托管主機
  • 升級 Docker 客戶端和守護程序
  • 配置 Docker 客戶端與主機進行通信
image-20200328113617027

安裝

安裝 Docker Machine 之前你需要先安裝 Docker

Linux 安裝命令

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
  sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

macOS 安裝命令

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/usr/local/bin/docker-machine &&
  chmod +x /usr/local/bin/docker-machine

Windows 安裝命令

如果你是 Windows 平臺晒屎,可以使用 Git BASH喘蟆,并輸入以下命令:

base=https://github.com/docker/machine/releases/download/v0.16.0 &&
  mkdir -p "$HOME/bin" &&
  curl -L $base/docker-machine-Windows-x86_64.exe > "$HOME/bin/docker-machine.exe" &&
  chmod +x "$HOME/bin/docker-machine.exe"

查看是否安裝成功:

docker-machine version
docker-machine version 0.16.0, build 9371605

使用

1.列出可用機器,默認有default虛擬機

docker-machine ls

2.創(chuàng)建機器

創(chuàng)建一個名為test的機器

$ docker-machine create --driver virtualbox test
  • --driver:指定用來創(chuàng)建機器的驅(qū)動類型鼓鲁,這里是 virtualbox

3.查看機器ip

docker-machine ip test

4.停止機器

docker-machine stop test

5.啟動機器

docker-machine start test

6.進入機器

docker-machine ssh test

docker-machine 命令參數(shù)說明

  • docker-machine active:查看當(dāng)前激活狀態(tài)的 Docker 主機蕴轨。

    docker-machine ls
    
    NAME      ACTIVE   DRIVER         STATE     URL
    dev       -        virtualbox     Running   tcp://192.168.99.103:2376
    staging   *        digitalocean   Running   tcp://203.0.113.81:2376
    
    echo $DOCKER_HOST
    tcp://203.0.113.81:2376
    
    docker-machine active
    staging
    
  • config:查看當(dāng)前激活狀態(tài) Docker 主機的連接信息。

  • creat:創(chuàng)建 Docker 主機

  • env:顯示連接到某個主機需要的環(huán)境變量

  • inspect: 以 json 格式輸出指定Docker的詳細信息

  • ip: 獲取指定 Docker 主機的地址

  • kill: 直接殺死指定的 Docker 主機

  • ls: 列出所有的管理主機

  • provision: 重新配置指定主機

  • regenerate-certs: 為某個主機重新生成 TLS 信息

  • restart: 重啟指定的主機

  • rm: 刪除某臺 Docker 主機骇吭,對應(yīng)的虛擬機也會被刪除

  • ssh: 通過 SSH 連接到主機上橙弱,執(zhí)行命令

  • scp: 在 Docker 主機之間以及 Docker 主機和本地主機之間通過 scp 遠程復(fù)制數(shù)據(jù)

  • mount: 使用 SSHFS 從計算機裝載或卸載目錄

  • start: 啟動一個指定的 Docker 主機,如果對象是個虛擬機燥狰,該虛擬機將被啟動

  • status: 獲取指定 Docker 主機的狀態(tài)(包括:Running棘脐、Paused、Saved龙致、Stopped蛀缝、Stopping、Starting目代、Error)等

  • stop: 停止一個指定的 Docker 主機

  • upgrade: 將一個指定主機的 Docker 版本更新為最新

  • url: 獲取指定 Docker 主機的監(jiān)聽 URL

  • version: 顯示 Docker Machine 的版本或者主機 Docker 版本

  • help: 顯示幫助信息

Swarm 集群管理

簡介

Docker Swarm 是 Docker 的集群管理工具屈梁。它將 Docker 主機池轉(zhuǎn)變?yōu)閱蝹€虛擬 Docker 主機嗤练。 Docker Swarm 提供了標準的 Docker API,所有任何已經(jīng)與 Docker 守護程序通信的工具都可以使用 Swarm 輕松地擴展到多個主機俘闯。

支持的工具包括但不限于以下各項:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

原理

如下圖所示潭苞,swarm 集群由管理節(jié)點(manager)和工作節(jié)點(work node)構(gòu)成。

  • swarm mananger:負責(zé)整個集群的管理工作包括集群配置真朗、服務(wù)管理等所有跟集群有關(guān)的工作此疹。
  • work node:即圖中的 available node,主要負責(zé)運行相應(yīng)的服務(wù)來執(zhí)行任務(wù)(task)遮婶。

<img src="https://tva1.sinaimg.cn/large/00831rSTgy1gd9i1s8m9mj31200qsgve.jpg" alt="image-20200328115130329" style="zoom:67%;" />

使用

1.創(chuàng)建 swarm 集群管理節(jié)點(manager)

docker-machine create -d virtualbox swarm-manager

初始化 swarm 集群蝗碎,進行初始化的這臺機器,就是集群的管理節(jié)點旗扑。

docker-machine ssh swarm-manager
docker swarm init --advertise-addr 192.168.99.107 #這里的 IP 為創(chuàng)建機器時分配的 ip蹦骑。

成功會輸出一段命令,在增加工作節(jié)點時會用到:

docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377

2.創(chuàng)建swarm 集群工作節(jié)點(worker)

這里直接創(chuàng)建好倆臺機器臀防,swarm-worker1 和 swarm-worker2

docker-machine create -d virtualbox swarm-worker1
docker-machine create -d virtualbox swarm-worker2

分別進入倆個機器里眠菇,指定添加至上一步中創(chuàng)建的集群,這里會用到上一步復(fù)制的內(nèi)容袱衷。

docker-machine ssh swarm-worker1
docker swarm join --token SWMTKN-1-4oogo9qziq768dma0uh3j0z0m5twlm10iynvz7ixza96k6jh9p-ajkb6w7qd06y1e33yrgko64sk 192.168.99.107:2377

3.查看集群信息

docker info

4.部署服務(wù)到集群中

注意:跟集群管理有關(guān)的任何操作捎废,都是在管理節(jié)點上操作的。

以下例子致燥,在一個工作節(jié)點上創(chuàng)建一個名為 helloworld 的服務(wù)登疗,這里是隨機指派給一個工作節(jié)點

docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com

5.查看服務(wù)部署情況

docker@swarm-manager:~$ docker service create --replicas 1 --name helloworld alpine ping docker.com

查看 helloworld 部署的具體信息:

docker@swarm-manager:~$ docker service inspect --pretty helloworld

6.擴展集群服務(wù)

docker@swarm-manager:~$ docker service scale helloworld=2

服務(wù)已經(jīng)從一個節(jié)點,擴展到兩個節(jié)點

7.刪除服務(wù)

docker@swarm-manager:~$ docker service rm helloworld

確認是否刪除

docker service ps helloworld

8.滾動升級服務(wù)

將 redis 版本滾動升級至更高版本

創(chuàng)建一個 3.0.6 版本的 redis嫌蚤。

docker@swarm-manager:~$ docker service create --replicas 1 --name redis --update-delay 10s redis:3.0.6

滾動升級 redis 辐益。

docker@swarm-manager:~$ docker service update --image redis:3.0.7 redis

9.停止某個節(jié)點接收新的任務(wù)

查看所有的節(jié)點:

docker@swarm-manager:~$ docker node ls

可以看到目前所有的節(jié)點都是 Active, 可以接收新的任務(wù)分配。

停止節(jié)點 swarm-worker1

docker@swarm-manager:~$  docker node update --availability drain swarm-worker1

注意:swarm-worker1 狀態(tài)變?yōu)?Drain脱吱。不會影響到集群的服務(wù)智政,只是 swarm-worker1 節(jié)點不再接收新的任務(wù),集群的負載能力有所下降箱蝠。

重新激活節(jié)點

docker@swarm-manager:~$  docker node update --availability active swarm-worker1

docker-stack集群管理

docker stack deploy命令用于部署新的堆椗觯或更新現(xiàn)有堆棧。從群集中的compose文件或dab文件創(chuàng)建和更新堆棧抡锈,必須以管理員節(jié)點為目標運行此命令。

用法

docker stack deploy [OPTIONS] STACK

參數(shù)

名稱乔外,簡寫 默認 說明
--bundle-file 分布式應(yīng)用程序包文件的路徑
--compose-file, -c Compose 文件的路徑
--with-registry-auth false 將注冊表身份驗證詳細信息發(fā)送給Swarm代理

相關(guān)命令

命令 描述
docker stack deploy 部署新的堆棿踩或更新現(xiàn)有堆棧
docker stack ls 列出現(xiàn)有堆棧
docker stack ps 列出堆棧中的任務(wù)
docker stack rm 刪除堆棧
docker stack services 列出堆棧中的服務(wù)

示例

deploy命令支持3.0及更高版本的Compose文件。

$ docker stack deploy --compose-file docker-compose.yml vossibility

Ignoring unsupported options: links

Creating network vossibility_vossibility
Creating network vossibility_default
Creating service vossibility_nsqd
Creating service vossibility_logstash
Creating service vossibility_elasticsearch
Creating service vossibility_kibana
Creating service vossibility_ghollector
Creating service vossibility_lookupd

您可以驗證服務(wù)是否正確創(chuàng)建 -

$ docker service ls

ID            NAME                               MODE        REPLICAS  IMAGE
29bv0vnlm903  vossibility_lookupd                replicated  1/1       nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4awt47624qwh  vossibility_nsqd                   replicated  1/1       nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4tjx9biia6fs  vossibility_elasticsearch          replicated  1/1       elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa
7563uuzr9eys  vossibility_kibana                 replicated  1/1       kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03
9gc5m4met4he  vossibility_logstash               replicated  1/1       logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe
axqh55ipl40h  vossibility_vossibility-collector  replicated  1/1       icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba

DAB文件

$ docker stack deploy --bundle-file vossibility-stack.dab vossibility

Loading bundle from vossibility-stack.dab
Creating service vossibility_elasticsearch
Creating service vossibility_kibana
Creating service vossibility_logstash
Creating service vossibility_lookupd
Creating service vossibility_nsqd
Creating service vossibility_vossibility-collector

您可以驗證服務(wù)是否正確創(chuàng)建 -

$ docker service ls

ID            NAME                               MODE        REPLICAS  IMAGE
29bv0vnlm903  vossibility_lookupd                replicated  1/1       nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4awt47624qwh  vossibility_nsqd                   replicated  1/1       nsqio/nsq@sha256:eeba05599f31eba418e96e71e0984c3dc96963ceb66924dd37a47bf7ce18a662
4tjx9biia6fs  vossibility_elasticsearch          replicated  1/1       elasticsearch@sha256:12ac7c6af55d001f71800b83ba91a04f716e58d82e748fa6e5a7359eed2301aa
7563uuzr9eys  vossibility_kibana                 replicated  1/1       kibana@sha256:6995a2d25709a62694a937b8a529ff36da92ebee74bafd7bf00e6caf6db2eb03
9gc5m4met4he  vossibility_logstash               replicated  1/1       logstash@sha256:2dc8bddd1bb4a5a34e8ebaf73749f6413c101b2edef6617f2f7713926d2141fe
axqh55ipl40h  vossibility_vossibility-collector  replicated  1/1       icecrime/vossibility-collector@sha256:f03f2977203ba6253988c18d04061c5ec7aab46bca9dfd89a9a1fa4500989fba
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杨幼,一起剝皮案震驚了整個濱河市撇簿,隨后出現(xiàn)的幾起案子聂渊,更是在濱河造成了極大的恐慌,老刑警劉巖四瘫,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汉嗽,死亡現(xiàn)場離奇詭異,居然都是意外死亡找蜜,警方通過查閱死者的電腦和手機饼暑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洗做,“玉大人弓叛,你說我怎么就攤上這事〕现剑” “怎么了撰筷?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畦徘。 經(jīng)常有香客問我毕籽,道長,這世上最難降的妖魔是什么井辆? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任关筒,我火速辦了婚禮,結(jié)果婚禮上掘剪,老公的妹妹穿的比我還像新娘平委。我一直安慰自己,他們只是感情好夺谁,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布廉赔。 她就那樣靜靜地躺著,像睡著了一般匾鸥。 火紅的嫁衣襯著肌膚如雪蜡塌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天勿负,我揣著相機與錄音馏艾,去河邊找鬼。 笑死奴愉,一個胖子當(dāng)著我的面吹牛琅摩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锭硼,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼房资,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了檀头?” 一聲冷哼從身側(cè)響起轰异,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤岖沛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搭独,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婴削,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年牙肝,在試婚紗的時候發(fā)現(xiàn)自己被綠了唉俗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惊奇,死狀恐怖互躬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情颂郎,我是刑警寧澤吼渡,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站乓序,受9級特大地震影響寺酪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜替劈,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一寄雀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陨献,春花似錦盒犹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至龄捡,卻和暖如春卓嫂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聘殖。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工晨雳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奸腺。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓餐禁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親突照。 傳聞我的和親對象是個殘疾皇子坠宴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容