Docker

Docker為什么出現(xiàn)?

一款產(chǎn)品:開(kāi)發(fā)到上線需要兩套環(huán)境沾乘!

而一套環(huán)境配置是十分麻煩的怜奖!尤其是集群環(huán)境!費(fèi)事費(fèi)力翅阵!

發(fā)布一個(gè)項(xiàng)目:需要(jar+(Redis+mysql+jdk+es))歪玲。而且不能進(jìn)行跨平臺(tái)!

那么引入一個(gè)問(wèn)題掷匠?

項(xiàng)目和環(huán)境能不能一塊發(fā)布滥崩?

可以的!開(kāi)發(fā)打包部署上線讹语,一套流程做完钙皮!就是Docker提出了解決方案!

Docker運(yùn)行的步驟

java -- jar(環(huán)境) ---打包項(xiàng)目帶上環(huán)境(鏡像) ---(Docker倉(cāng)庫(kù):商店) --- 下載我們的鏡像 ---直接運(yùn)行即可!

本質(zhì):所以的技術(shù)都是因?yàn)槌霈F(xiàn)了一些問(wèn)題短条,我們才需要去學(xué)習(xí)导匣。

Docker概述

Docker的歷史

2010年,幾個(gè)搞it的年輕人茸时,在美國(guó)成立了一個(gè)公司 dotCloud贡定。做一些pass的云計(jì)算服務(wù),LXC有關(guān)的容器操作屹蚊。他們把自己的技術(shù)厕氨,容器化技術(shù)命名Docker。

剛誕生的時(shí)候汹粤,沒(méi)人關(guān)注命斧,后來(lái)快堅(jiān)持不住了,就在2013年的時(shí)候開(kāi)源了嘱兼!

2014年4月9日国葬,Docker1.0發(fā)布!

Docker為什么這么火芹壕?因?yàn)檩p巧汇四。

虛擬機(jī):我們?cè)陔娔X上裝一個(gè)vm軟件,可以虛擬出一個(gè)或多個(gè)操作系統(tǒng)踢涌。

虛擬機(jī)也是屬于虛擬化技術(shù)通孽,Docker容器技術(shù),也是一種虛擬化技術(shù)睁壁!

vm:linux centos原生鏡像(就基本是一臺(tái)電腦) 隔離需要開(kāi)啟多個(gè)虛擬機(jī)背苦! 幾個(gè)G
docker:隔離,鏡像(只需要核心的環(huán)境潘明,jdk+mysql+需要的環(huán)境)十分的小巧行剂!幾個(gè)M KB 秒級(jí)啟動(dòng)!

Docker官方:https://www.docker.com/

Docker Hub官方:https://hub.docker.com/(類似于GitHub)

Docker能干什么钳降?

之前的虛擬技術(shù)

before

虛擬機(jī)技術(shù)缺點(diǎn):

1厚宰、資源占用十分多

2笆怠、冗余步驟多

3铸鹰、啟動(dòng)很慢吠昭!

現(xiàn)在的容器技術(shù)

now

比較Docker和傳統(tǒng)的虛擬技術(shù)的不同:

  • 傳統(tǒng)虛擬機(jī)沟沙,虛擬出一條硬件某弦,運(yùn)行一個(gè)完整的操作系統(tǒng)苛谷,然后在這個(gè)系統(tǒng)中安裝和運(yùn)行軟件讹躯。
  • 容器中的應(yīng)用直接運(yùn)行在宿主機(jī)的內(nèi)容顶考,容器自己是沒(méi)有內(nèi)核的凌唬,也沒(méi)有虛擬我們的硬件并齐,所以輕便了
  • 每個(gè)容器間是隔離的漏麦,每個(gè)容器間都有自己的一套文件系統(tǒng),互不影響况褪。

DevOps(開(kāi)發(fā)撕贞,運(yùn)維)

應(yīng)用更快速的交付和部署

傳統(tǒng):一堆幫助文檔,安裝測(cè)試

Docker:打包鏡像测垛,一鍵測(cè)試

更便捷的升級(jí)和擴(kuò)容

使用了Docker之后捏膨,我們部署應(yīng)用就和搭建積木一樣!

更簡(jiǎn)單的系統(tǒng)運(yùn)維

在容器化操作之后食侮,我們的開(kāi)發(fā)号涯,測(cè)試環(huán)境都是高度一致。

更高效的計(jì)算機(jī)利用資源

Docker是內(nèi)核級(jí)別的虛擬化锯七,可以再一個(gè)物理機(jī)上運(yùn)行很多的容器實(shí)例链快。服務(wù)器的性能可以被壓榨到極致。

Docker安裝

這里發(fā)現(xiàn)安裝失敗..可以參考這個(gè)進(jìn)行安裝https://blog.csdn.net/weixin_45987569/article/details/108297022

Docker的基本組成

docker組成

鏡像(image):

docker鏡像就好比是一個(gè)模板眉尸,可以通過(guò)這個(gè)模板創(chuàng)建容器服務(wù)域蜗,tomcat鏡像==>run-->tomcat容器(提供服務(wù)器)

通過(guò)這個(gè)鏡像可以創(chuàng)建多個(gè)容器。

容器(container):

Docker利用容器技術(shù)噪猾,獨(dú)立運(yùn)行一個(gè)或者一個(gè)組應(yīng)用霉祸,通過(guò)鏡像來(lái)創(chuàng)建的。

啟動(dòng)袱蜡,停止丝蹭,刪除,基本命令坪蚁。目前我們就可以把這個(gè)容器理解為一個(gè)簡(jiǎn)易的linux系統(tǒng)半夷。

倉(cāng)庫(kù):

Docker用倉(cāng)庫(kù)保存用戶創(chuàng)建的鏡像,倉(cāng)庫(kù)分共有和私有兩種迅细,Docker公司自己提供了倉(cāng)庫(kù)Docker Hub,可以在Docker Hub上創(chuàng)建賬戶淘邻,保存分享自己創(chuàng)建的鏡像茵典。當(dāng)然也可以架設(shè)私有倉(cāng)庫(kù)。

安裝Docker

環(huán)境準(zhǔn)備

1宾舅、Linux基礎(chǔ)

2统阿、Centos7

3、xshell連接服務(wù)器

查看系統(tǒng)內(nèi)核

[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# uname -r
3.10.0-1062.12.1.el7.x86_64

安裝步驟

#如果已經(jīng)安裝筹我,先清除之前的
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
#安裝Docker
yum install -y yum-utils

#配置阿里云鏡像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新yum軟件包索引
yum makecache fast

#安裝docker docker-ce社區(qū) ee企業(yè)版
yum install docker-ce-cli containerd.io

#啟動(dòng)docker
systemctl start docker

#使用docker version測(cè)試是否成功
docker version

如果安裝不成功扶平,無(wú)法啟動(dòng),可以嘗試百度中的其他方法蔬蕊!

檢查安裝是否成功

我們可以發(fā)現(xiàn)结澄,我們的docker版本號(hào),也代表啟動(dòng)成功了!

#運(yùn)行鏡像hello-world
docker run hello-world
運(yùn)行Helloworld
#查看鏡像源
docker images
查看鏡像源

卸載docker

#1麻献、卸載依賴
yum remove docker-ce docker-ce-cli containerd.io

#2们妥、刪除資源
rm -rf /var/lib/docker

# /var/lib/docker docker的默認(rèn)工作路徑

阿里云鏡像加速

登錄阿里云,找到容器鏡像加速(這部一定要加上勉吻,否則下載鏡像還是很慢<嗌簟)

配置使用:4個(gè)指令

配置阿里云

我們對(duì)Docker進(jìn)行如上的四個(gè)配置,致使我們的docker下載鏡像時(shí)會(huì)更快惑惶!

配置

回顧HelloWorld流程

首先先去本地尋找Docker鏡像,判斷如果有的話就去用藐唠,如果沒(méi)有就去下載到本地。

image.png

Docker是怎么工作的倒堕?

Docker是一個(gè) Client- Server結(jié)構(gòu)的系統(tǒng), Docker的守護(hù)進(jìn)程運(yùn)行在主機(jī)上涯雅。通過(guò) Socket從客戶端訪問(wèn)
Docker Server接收到 Docker-Client的指令,就會(huì)執(zhí)行這個(gè)命令!

下載鏡像示意圖

Docker為什么比虛擬機(jī)快锈遥?

1钾唬、Docker有比虛擬機(jī)更少的抽象層

2檩坚、Docker用的是宿主機(jī)內(nèi)核沪猴,VM需要的是Guest OS岭参。

如何工作

由以上兩點(diǎn):

  • 新建一個(gè)容器的時(shí)候, docker不需要像虛擬機(jī)一樣重新加載一個(gè)操作系統(tǒng)內(nèi)核,避免引導(dǎo)尝艘。
  • 虛擬機(jī)是加載 Guest os,分鐘級(jí)別的,而 docker是利用宿主機(jī)的操作系統(tǒng)嗎,省略了這個(gè)復(fù)雜的過(guò)程,秒級(jí)!
對(duì)比

Docker的常用命令

幫助命令

#顯示docker的版本信息
docker version
#顯示docker詳細(xì)的信息
docker info
#萬(wàn)能命令
docker 命令 -help

docker官方幫助文檔:

https://docs.docker.com/engine/reference/commandline/ps/#show-both-running-and-stopped-containers

鏡像命令

查看鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              4cdbec704e47        6 weeks ago         98.2MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

#解釋
REPOSITORY  鏡像的倉(cāng)庫(kù)源
TAG         鏡像的標(biāo)簽
IMAGE ID    鏡像的id
CREATED     鏡像的創(chuàng)造時(shí)間
SIZE        鏡像的大小

#可選項(xiàng)
-a 代表 --all             #列出所有的鏡像
-1 代表 --quite           #只顯示鏡像的id
搜索鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9494                [OK]                
mariadb                           MariaDB is a community-developed fork of MyS…   3441                [OK] 
#真實(shí)搜出來(lái)的很多演侯,這里只顯示兩個(gè)

#可選項(xiàng),通過(guò)搜索進(jìn)行過(guò)濾starts大于3000的
--filter=stars=3000


[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker search mysql --filter=stars=3000
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql               MySQL is a widely used, open-source relation…   9494                [OK]                
mariadb             MariaDB is a community-developed fork of MyS…   3441                [OK]   
下載鏡像
#下載鏡像docker pull 鏡像名[:tag]
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql
Using default tag: latest       #如果這里不寫(xiě)版本號(hào),那么就是下載的最新版
latest: Pulling from library/mysql
5b54d594fba7: Pull complete 
07e7d6a8a868: Pull complete 
abd946892310: Pull complete 
dd8f4d07efa5: Pull complete 
076d396a6205: Pull complete 
cf6b2b93048f: Pull complete 
530904b4a8b7: Pull complete 
fb1e55059a95: Pull complete 
4bd29a0dcde8: Pull complete 
b94a001c6ec7: Pull complete 
cb77cbeb422b: Pull complete 
2a35cdbd42cc: Pull complete 
Digest: sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625#簽名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真實(shí)地址

#上面的命令等價(jià)于
docker pull docker.io/library/mysql:latest


#我們還可以指定下載版本背亥,mysql5.7
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
5b54d594fba7: Already exists    #和以前共用的版本就不用下載了(聯(lián)合文件)
07e7d6a8a868: Already exists 
abd946892310: Already exists 
dd8f4d07efa5: Already exists 
076d396a6205: Already exists 
cf6b2b93048f: Already exists 
530904b4a8b7: Already exists 
a37958cbebcf: Pull complete 
04960017f638: Pull complete 
e1285def0d2a: Pull complete 
670cb3a9678e: Pull complete 
Digest: sha256:e4d39b85118358ffef6adc5e8c7d00e49d20b25597e6ffdc994696f10e3dc8e2
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

注意:下載的版本必須可以查詢到秒际,我們?cè)赿ocker hub進(jìn)行看到

docker hub
刪除鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 e73346bdf465        11 hours ago        448MB
mysql               latest              a0d4d95e478f        11 hours ago        541MB
redis               latest              4cdbec704e47        6 weeks ago         98.2MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

#刪除鏡像
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker rmi -f a0d4d95e478f
Untagged: mysql:latest
Untagged: mysql@sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625
Deleted: sha256:a0d4d95e478ff2962ede50c50b7dc2fc699382bcb94ad301e9c6805609f0939a
Deleted: sha256:4404a13192a5c458ee1c3160b910728fc3723687a5d4c6b83481d09d6cac6e7b
Deleted: sha256:2c91a02c5543a7b08784d159b4d749d0b8c82c1dcfd8567570e8350af2d76669
Deleted: sha256:9f5911321949d1869260b9fef13ba3bea465ea8db257fdcd0193ec68db2741b0
Deleted: sha256:60023f7e525ce09db7bc5c3941cf86caef06c5fbe0bf770efb648ef73f8e705e
Deleted: sha256:44d7b6c26325a1653b5052d8c15f9086a7a952f059e33763512a668848b6961c

#我們重新查看鏡像,可以發(fā)現(xiàn)已經(jīng)刪除
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               5.7                 e73346bdf465        11 hours ago        448MB
redis               latest              4cdbec704e47        6 weeks ago         98.2MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

#刪除多個(gè)鏡像
docker rmi -f 鏡像id 鏡像id 鏡像id 鏡像id

#刪除全部鏡像
#這里用到的思想就是docker images -aq顯示所有的id狡汉,進(jìn)行刪除娄徊,聯(lián)合刪除!
docker rmi -f $(docker images -aq) 

容器命令

說(shuō)明:我們有了鏡像才可以創(chuàng)建容器轴猎,我們可以下載一個(gè)centos鏡像用來(lái)學(xué)習(xí)

docker pull centos

新建容器并啟動(dòng)

docker run是利用鏡像生成容器嵌莉,并啟動(dòng)容器,而docker start是啟動(dòng)一個(gè)之前生成過(guò)的容器

docker run [可選參數(shù)] image

#參數(shù)說(shuō)明
--name="Name"           #容器名字 tomcat01 tomcat02,用來(lái)區(qū)分容器
-d                      #以后臺(tái)方式運(yùn)行
-it                     #使用交互方式運(yùn)行捻脖,進(jìn)入容器查看內(nèi)容
-p                      #指定容器的端口 -p 8080:8080
    -p ip:主機(jī)端口:容器端口
    -p 主機(jī)端口:容器端口(常用)
    -p 容器端口

-p   #隨機(jī)指定端口


#測(cè)試 啟動(dòng)容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -it centos /bin/bash
[root@9f938cd50b09 /]# ls #我們通過(guò)ls命令查看該centos容器下的文件夾
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
#我們可以發(fā)現(xiàn)這和我們自己的linux文件少了很多锐峭,正是由于它是基礎(chǔ)版本的,所以沒(méi)有正式的多

[root@9f938cd50b09 /]# exit  #從容器中退出系統(tǒng)
exit

#分別以3310和3311端口號(hào)運(yùn)行兩個(gè)tomcat容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3310:8080 --name t1 diytomcat
b912b4f691004bddadc64b511dbed6afd9d7704c1887c1a7fc03fcd3a660722a
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3311:8080 --name t2 diytomcat
2ee142c87ce1a6418c6f4a272e63aa95767718b445dfeef99b39824df25bf0c0

列出所有運(yùn)行的內(nèi)存

# 列出當(dāng)前正在運(yùn)行的容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#列出當(dāng)前正在運(yùn)行的容器+列出歷史運(yùn)行過(guò)的容器
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
9f938cd50b09        centos              "/bin/bash"         14 minutes ago      Exited (0) 11 minutes ago                       vigilant_agnesi
bb1c862ee8df        centos              "/bin/bash"         33 minutes ago      Exited (0) 33 minutes ago                       myCentos
c0734cc4eb49        hello-world         "/hello"            2 hours ago         Exited (0) 2 hours ago                          elegant_feynman

#只顯示容器的編號(hào)
docker -q

退出容器

exit #直接退出容器并且停止
ctrl + P + Q    # 容器不停止退出可婶,后臺(tái)運(yùn)行

刪除容器

docker rm 容器id       #刪除指定的容器沿癞,但是不能刪除正在運(yùn)行的容器,強(qiáng)制刪除rm -f
docker rm -f $(docker ps -aq)   #刪除所有容器
docker rm -a -q|xargs docker rm #刪除所有容器(這個(gè)不正確矛渴,有錯(cuò)誤W笛铩)

啟動(dòng)和停止容器操作

docker start 容器id   #啟動(dòng)容器
docker restart 容器id #重啟容器
docker stop 容器id    #停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id    #強(qiáng)制停止當(dāng)前容器

docker stop $(docker ps -q) #停止全部運(yùn)行的容器
docker stop $(docker ps -q) & docker rm $(docker ps -aq)    #一條命令停止并刪除所有的容器

存在的幾個(gè)問(wèn)題:

docker run 和 docker start區(qū)別

docker run 只在第一次運(yùn)行時(shí)使用,將鏡像放到容器中具温,以后再次啟動(dòng)這個(gè)容器時(shí)蚕涤,只需要使用命令docker start 即可。docker run相當(dāng)于執(zhí)行了兩步操作:將鏡像放入容器中(docker create),然后將容器啟動(dòng)铣猩,使之變成運(yùn)行時(shí)容器(docker start)揖铜。

那么docker start 又和 docker restart有什么區(qū)別?

restart Restart a running container :翻譯 就是百重啟一度個(gè)問(wèn)正在運(yùn)行的答容器
start Start a stopped container :翻譯就是啟動(dòng)版一個(gè)暫停的容器

[docker run -it centos /bin/bash 后面的 bin/bash的作用]

首先达皿,docker run -it centos 的意思是天吓,為centos這個(gè)鏡像創(chuàng)建一個(gè)容器贿肩, -i和-t這兩個(gè)參數(shù)的作用是,為該docker創(chuàng)建一個(gè)偽終端龄寞,這樣就可以進(jìn)入到容器的交互模式汰规?(也就是直接進(jìn)入到容器里面)后面的/bin/bash的作用是表示載入容器后運(yùn)行bash ,docker中必須要保持一個(gè)進(jìn)程的運(yùn)行,要不然整個(gè)容器啟動(dòng)后就會(huì)馬上kill itself物邑,這樣當(dāng)你使用docker ps 查看啟動(dòng)的容器時(shí)溜哮,就會(huì)發(fā)現(xiàn)你剛剛創(chuàng)建的那個(gè)容器并不在已啟動(dòng)的容器隊(duì)列中。這個(gè)/bin/bash就表示啟動(dòng)容器后啟動(dòng)bash拂封。

表示當(dāng)前用戶使用的shell是/bin/bash茬射,所謂的shell你可以理解為操作系統(tǒng)和人之間交互的平臺(tái)。例如windows系統(tǒng)的桌面環(huán)境就是一個(gè)shell冒签。
bin目錄中基本上都是可執(zhí)行的命令在抛。

幾個(gè)啟動(dòng)容器問(wèn)題

https://www.cnblogs.com/doraman/p/12176888.html

常用其他命令

后臺(tái)啟動(dòng)容器:

# 命令 docker run -d 鏡像名
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d centos
a85212f28e0b80f04ca85cb630a781de3a5e7a1e8f1ef5bdddb329303675b306
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#但是!我們發(fā)現(xiàn)問(wèn)題了萧恕!我們通過(guò)docker ps命令并沒(méi)有發(fā)現(xiàn)centos正在運(yùn)行
#原因刚梭?容器使用后臺(tái)進(jìn)行,就必須需要一個(gè)前臺(tái)進(jìn)程票唆,docker如果發(fā)現(xiàn)沒(méi)有應(yīng)用就會(huì)自動(dòng)停止朴读!

查看日志:

docker logs -f -t --tail    容器id

#自己編寫(xiě)一段shell腳本,不停的循環(huán)輸出szw
docker run -d centos /bin/sh -c "while true;echo szw;sleep 1;done"

#這時(shí)候再顯示日志
docker logs -f -t --tail 10 容器id
docker logs -f -t 容器id

#可選參數(shù) --tail number(顯示的條數(shù))走趋,不寫(xiě)上就輸出全部

查看容器進(jìn)程中的進(jìn)程id:

# 命令 docker top 容器id
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker top ff3d87da3618
UID                 PID                 PPID                C                   STIME     
root                9328                9311                0                   14:12    

查看鏡像的元數(shù)據(jù):

就是查看詳細(xì)的信息衅金。

#命令
docker inspect 容器id

[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker inspect ff3d87da3618
[
    {
        "Id": "ff3d87da3618e8ded5980619aa2664b40e360e2a0063668144eba51afa6c35a8",
        "Created": "2020-05-15T06:12:05.676704236Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 9328,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-05-15T06:12:06.064708089Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
        "ResolvConfPath": "/var/lib/docker/containers/ff3d87da3618e8ded5980619aa2664b40e360e2a0063668144eba51afa6c35a8/resolv.conf",

進(jìn)入當(dāng)前正在運(yùn)行的容器:

#我們通常容器都是在后臺(tái)方式運(yùn)行的,需要進(jìn)入容器簿煌,修改一些配置

#命令
docker exec -it 容器id bashShell

#測(cè)試
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ff3d87da3618        centos              "/bin/bash"         29 minutes ago      Up 29 minutes                           zen_keller
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker exec -it ff3d87da3618 /bin/bash
[root@ff3d87da3618 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@ff3d87da3618 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 06:12 pts/0    00:00:00 /bin/bash
root        14     0  0 06:42 pts/1    00:00:00 /bin/bash
root        28    14  0 06:42 pts/1    00:00:00 ps -ef


#方式二氮唯,這種方式會(huì)執(zhí)行當(dāng)前容器正在執(zhí)行的代碼
docker attch 容器id


sudo docker run -p 3306:3306 --name newsql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123 \
-d mysql:latest

以上兩種方式的區(qū)別:

方式1:是新開(kāi)啟一個(gè)終端

方式2:是進(jìn)入容器中正在執(zhí)行的終端,不會(huì)啟動(dòng)新的進(jìn)程

從容器內(nèi)拷貝文件到自己主機(jī)上

docker cp 

#我們?cè)赿ocker centos下的/home目錄下創(chuàng)建一個(gè)文件szw.java
[root@b58fcf3b7532 home]# touch szw.java
[root@b58fcf3b7532 home]# ls
szw.java
#退出docker中的centos
exit    
#進(jìn)行拷貝
docker cp b58fcf3b7532:/home/szw.java /home


#拷貝是一個(gè)手動(dòng)過(guò)程,未來(lái)我們使用-V卷的技術(shù),可以實(shí)
image.png

小結(jié)

所有的命令總結(jié)圖:

image.png

練習(xí)

docker安裝nginx

#1姨伟、在docker hub中搜索ngix信息惩琉,可以看到詳細(xì)信息和幫助文檔
#2、下載鏡像
#3夺荒、啟動(dòng)鏡像
#意思就是新建一個(gè)Nginx容器瞒渠,命名為Nginx01,暴露服務(wù)器端口為3000映射內(nèi)部的80端口,-d后臺(tái)運(yùn)行
docker run -d --name nginx01 -p 3000:80 nginx
#4技扼、本機(jī)自測(cè)
curl localhost:3000
##5伍玖、再利用公網(wǎng)ip進(jìn)行訪問(wèn)

端口暴露詳解圖:

端口暴露詳解

思考問(wèn)題:我們每次改動(dòng) nginx配置文件,都需要進(jìn)入容器內(nèi)部?十分的麻煩,我要是可以在容器外部提供一個(gè)映射路徑,達(dá)到在容器修改文件名,容器內(nèi)部就可以自動(dòng)修改?數(shù)據(jù)卷!

在docker中裝tomcat

#官方的使用
docker run -it --rm tomcat:9.0

#我們之前的啟動(dòng)都是后臺(tái),停止了容器之后,容器還是可以查到 docker run-it-rm,一般用來(lái)測(cè)試,用完及刪除
#但是我們不建議這樣使用!

docker pull tomcat:9.0

#啟動(dòng)運(yùn)行
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -p 3310:8080 --name tomcat01 tomcat:9.0

#測(cè)試發(fā)現(xiàn)剿吻,404
#發(fā)現(xiàn)問(wèn)題:1窍箍、linux命令少了,ll都沒(méi)有
#2、沒(méi)有webapps目錄下沒(méi)有文件

原因:阿里云鏡像的問(wèn)題仔燕,默認(rèn)是最小的鏡像,將一些不必要的全部都剔除掉

那么怎么解決魔招?

#首先進(jìn)入當(dāng)前運(yùn)行的這個(gè)mcat容器中
docker exec -it tomcat01 /bin/bash
復(fù)制.list文件

我們可以發(fā)現(xiàn)晰搀,可以訪問(wèn)到了docker中的tomcat。

image.png

練習(xí):安裝ES

docker可視化工具

  • portainer(先用這個(gè))
docker run -d -p 3310:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name prtainer-test \
docker.io/portainer/portainer

安裝好之后办斑,我們可以通過(guò)ip地址加上端口號(hào)訪問(wèn)我們的可視化工具外恕。

第一步看到的就是一個(gè)設(shè)置管理員密碼的操作,設(shè)置好以后乡翅,點(diǎn)擊local本地連接鳞疲。

可視化工具

就會(huì)顯示這個(gè)界面,再繼續(xù)點(diǎn)擊local蠕蚜,我們就可以了解我們本機(jī)關(guān)于docker的詳細(xì)信息了尚洽。

Docker鏡像詳解

鏡像是什么?

鏡像是一種輕量級(jí)靶累、可執(zhí)行的獨(dú)立軟件包,用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境開(kāi)發(fā)的軟件,它包含運(yùn)行某個(gè)軟件

所需的所有內(nèi)容,包括代碼腺毫、運(yùn)行町庫(kù)、環(huán)境變量和配置文件挣柬。

所有的應(yīng)用,直接打包 docker鏡像,就可以直接跑起來(lái)!

Docker鏡像加載原理

UnionFS(聯(lián)合文件系統(tǒng))

UnionFS (聯(lián)合文件系統(tǒng)) : Union文件系統(tǒng)( UnionFS )是一種分層潮酒、 輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系

統(tǒng)的修改作為-次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。

Union 文件系統(tǒng)是Docker鏡像的基礎(chǔ)邪蛔。鏡像可以通過(guò)分層來(lái)進(jìn)行繼承,基紆基礎(chǔ)鏡像(沒(méi)有父鏡像),可以制作各種具

體的應(yīng)用鏡像急黎。

特性: 一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來(lái),只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),這

樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。

注意:我們pull下載鏡像的時(shí)候侧到,看到的一層一層就是這個(gè)勃教!

言簡(jiǎn)意賅的就是說(shuō):我如果下載一個(gè)文件,之前存在的東西床牧,我不進(jìn)行下載了荣回,相同的東西作為底層,我只去下載上一層的東西就可了戈咳!

分層

Docker鏡像加速原理

docker實(shí)際上由一層一層的文件系統(tǒng)組成心软,這種層級(jí)系統(tǒng)就是我們上面說(shuō)的UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引|導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs著蛙。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的 ,包含boot加載器和內(nèi)核删铃。當(dāng)bootfs加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs.(就是我們?cè)陂_(kāi)機(jī)時(shí)候看到的引導(dǎo)!docker中就是省略了這個(gè)部分踏堡!

rootfs (root file system) , 在bootfs之上猎唁。包含的就是典型Linux 系統(tǒng)中的/dev, /proc, /bin, /etc等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu , Centos等等顷蟆。(這個(gè)部分就是docker中需要下載的東西诫隅,他使用的bootfs實(shí)際上是本機(jī)的腐魂,這就導(dǎo)致了我們啟動(dòng)docker的時(shí)候基本都是秒級(jí)打開(kāi)的!

有了以上兩個(gè)概念逐纬,我們就只到我們的docker下載的鏡像這么谢滓佟!并且打開(kāi)快豁生!

對(duì)于一個(gè)精簡(jiǎn)的0S ,布rootfs可以很小,只需要包含最基本的命令,工具和程序庫(kù)就可以了,因?yàn)榈讓又苯佑肏ost的kernel ,自己只需要提供rootfs就可以了兔毒。由此可見(jiàn)對(duì)于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會(huì)有差別,因此不同的發(fā)行版可以公用bootfs。

分層理解

我們平常pull鏡像的時(shí)候甸箱,可以發(fā)現(xiàn)下載進(jìn)行都是一層一層的育叁。

就比如我們上面下載mysql的時(shí)候:

#我們還可以指定下載版本,mysql5.7
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
5b54d594fba7: Already exists    #和以前共用的版本就不用下載了(聯(lián)合文件)
07e7d6a8a868: Already exists 
abd946892310: Already exists 
dd8f4d07efa5: Already exists 
076d396a6205: Already exists 
cf6b2b93048f: Already exists 
530904b4a8b7: Already exists 
a37958cbebcf: Pull complete 
04960017f638: Pull complete 
e1285def0d2a: Pull complete 
670cb3a9678e: Pull complete 

我們就可以看到他是一個(gè)一個(gè)文件下載的芍殖!也就一層一層的進(jìn)行下載豪嗽!如果本機(jī)內(nèi)之前存才的!就不進(jìn)行下載了豌骏。

特點(diǎn)

Docker鏡像都是只讀的昵骤,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫(xiě)層被加載到鏡像的頂部肯适!

這一層就是我們通常說(shuō)的容器層变秦。

示意圖

當(dāng)我們?cè)诎炎约旱倪@個(gè)打包成一個(gè)鏡像的時(shí)候,別人操作的時(shí)候框舔,你的鏡像就又會(huì)變成了鏡像層 了蹦玫!

那么怎么發(fā)布我們自己的鏡像呢?

Commit鏡像

#我們都知道刘绣,我們?cè)趐ull官方下的tomcat的webapps下沒(méi)有文件的樱溉!
#我們每次下載后都需要給webapps下都需要進(jìn)行復(fù)制webapps.list
#非常麻煩!那么我們是不是可以根據(jù)自己的容器配置一個(gè)進(jìn)行呢纬凤?就用到了以下的命令福贞。

docker commit 提交容器稱為一個(gè)新的副本

#命令和git原理
docker commit -m="描述的信息" -a="作者" 容器id 目標(biāo)進(jìn)行名:[Tag]

實(shí)戰(zhàn)測(cè)試

[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker commit -m="szwTomcat" -a="szw" 29f9b0ebc838 szwtomcat:1.0
sha256:84a932e22a55ef6a2a15b75d1360ded2303c9552db85c7bc91e8a081e6e8f772

注意:轉(zhuǎn)化為的鏡像名不能含有大寫(xiě)!

我們可以看到szwtomcat的大小比之前的tomcat大小少停士,這就是因?yàn)槲覀冃陆ǖ溺R像包含了之前鏡像和容器層的原因挖帘!所以大小變大了!

自定義tomcat明顯變小

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

什么是容器數(shù)據(jù)卷恋技?

docker理念回顧

如果數(shù)據(jù)都在容器中拇舀,那么如果我們刪除容器,數(shù)據(jù)就會(huì)丟失蜻底!需求:數(shù)據(jù)可持續(xù)化骄崩!

容器之間可以有一個(gè)數(shù)據(jù)共享技術(shù)!Docker容器產(chǎn)生數(shù)據(jù),同步到本地要拂!

這就是卷技術(shù)抠璃!目錄的掛載!

目錄掛載

總結(jié)一句話:容器的持久化和同步操作脱惰!容器間可以進(jìn)行數(shù)據(jù)共享鸡典!

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

方式1:直接使用名來(lái)來(lái)掛載

docker run -it -v 主機(jī)目錄:容器內(nèi)目錄

#測(cè)試
[root@iZ2zeeqh1fctjw2bhzgjnaZ home]# docker run -it -v /home/test:/home centos /bin/bash

#使用docker inspect查看信息
[root@iZ2zeeqh1fctjw2bhzgjnaZ home]# docker inspect 7de2961f9101

詳細(xì)信息截圖:(我們可以發(fā)現(xiàn)兩者進(jìn)行了掛載)

詳細(xì)截圖
#我們?cè)龠M(jìn)行測(cè)試一下是不是真正綁定了
掛載目錄顯示
#1、還可以再進(jìn)行一個(gè)測(cè)試枪芒,先停止容器運(yùn)行
#2、在服務(wù)器上修改同步的文件
#3谁尸、運(yùn)行容器舅踪,查看綁定的目錄

我們發(fā)現(xiàn),文件依然進(jìn)行了同步良蛮!

好處抽碌!我們以后修改只需要在本地修改就可以了,容器內(nèi)會(huì)自己進(jìn)行同步决瞳!

實(shí)戰(zhàn)測(cè)試mysql

思考:mysql的數(shù)據(jù)持久化問(wèn)題货徙!

#獲取鏡像
docker pull mysql:5.7

#先參照docker hub中的幫助
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#參數(shù)詳細(xì)
-d 后臺(tái)運(yùn)行
-p端口映射
-v卷掛載
-e環(huán)境配置
--name 容器名字
docker run -d -p 3310:3306 -v /home/mysq/conf:/etc.mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e  MYSQL_ROOT_PASSWORD=123 --name mysql01 mysql:5.7


#我們可以通過(guò)docker ps發(fā)現(xiàn)這個(gè)容器正在運(yùn)行

#外部測(cè)試:我們可以用可視化工具去連接服務(wù)器的端口,輸入面進(jìn)行測(cè)試皮胡,測(cè)試成功則代表了設(shè)置成功痴颊!

#下圖,配置文件放在了mysq路徑下屡贺。蠢棱。。甩栈。
配置文件

我們外部測(cè)試使用Navicat進(jìn)行測(cè)試連接:

Navicat連接
#我們?cè)谶@個(gè)Navicat中新創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)test泻仙,然后去服務(wù)器綁定容器的位置去查看數(shù)據(jù)庫(kù)test。

我們可以根據(jù)下圖發(fā)現(xiàn)量没!該數(shù)據(jù)庫(kù)存在這個(gè)data文件中
data中成功的掛載了mysql中的數(shù)據(jù)
#我們?cè)龠M(jìn)行測(cè)試玉转!將容器刪除,看看掛載在本地的數(shù)據(jù)卷還會(huì)不會(huì)存在殴蹄?
容器刪除還會(huì)存在掛載文件

具名和匿名掛載

#匿名掛載
#就是在掛載的時(shí)候究抓,只寫(xiě)了容器內(nèi)的路徑,并沒(méi)有寫(xiě)容器外的路徑袭灯!
docker run -d -P --name nginx01 -v /etc/nginx nginx

#用下面這個(gè)鏡像查看本地的卷
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               5a5341c46b2ef49d9e496c7017beff66c86d6f6f3f0e2594143a8b9a18f9f6c9
local               7e147bcd894d89adce362efa62bc96f9522f3c47a1675e1b4d875ab85e1735d4
local               10cff4d870ab1c1062dc8cfb86b982d41a326f47453851ac0e664c48b638a228
local               063c2e58b4011356e35ad30961c7aac5f997c37d3692c2d4b22c5ffc26525b6c
local               158b76b3fc9cd28e759c6c8b0040c75316b16be424b5ce0b2288a532c556eacb
local               b5b9277a857841d04079d967bd6ba25dda5ed4550ac349e506587d6bf8634918
local               ba9b9e208e1b5e6c5470b45f2ba823b4388b0ef5bbe19f403ce73c13fca3690c
#上面的這些數(shù)據(jù)是真實(shí)存在的路徑漩蟆,這種就是屬于匿名掛載
#那么對(duì)應(yīng)的具名掛載是什么呢?就是加上了名字而已妓蛮!
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker run -d -P --name nginx02 -v juming:/etc/nginx nginx
ccabd3cf2414de60516acbe7d668cd67a3f839c74bb8e65d7f21d040cbcac312
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               5a5341c46b2ef49d9e496c7017beff66c86d6f6f3f0e2594143a8b9a18f9f6c9
local               7e147bcd894d89adce362efa62bc96f9522f3c47a1675e1b4d875ab85e1735d4
local               10cff4d870ab1c1062dc8cfb86b982d41a326f47453851ac0e664c48b638a228
local               063c2e58b4011356e35ad30961c7aac5f997c37d3692c2d4b22c5ffc26525b6c
local               158b76b3fc9cd28e759c6c8b0040c75316b16be424b5ce0b2288a532c556eacb
local               b5b9277a857841d04079d967bd6ba25dda5ed4550ac349e506587d6bf8634918
local               ba9b9e208e1b5e6c5470b45f2ba823b4388b0ef5bbe19f403ce73c13fca3690c
local               juming

#從上面的信息我們可以看到怠李,多了個(gè)juming的卷,這就是具名掛載
#我們還可以再用以下命令進(jìn)行查看這個(gè)卷的詳細(xì)信息
[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker volume inspect juming
[
    {
        "CreatedAt": "2020-05-16T23:23:30+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming/_data",
        "Name": "juming",
        "Options": null,
        "Scope": "local"
    }
]
# 多有的docker容器內(nèi)的卷,沒(méi)有指定外部的路徑捺癞,就會(huì)存在這個(gè)路徑下/var/lib/docker/volumes/
#我們進(jìn)入到這個(gè)路徑下
掛載路徑

可以發(fā)現(xiàn)夷蚊,這里面就是存放著,我們?cè)谌萜鲀?nèi)掛載的數(shù)據(jù)髓介!

#大多數(shù)情況下惕鼓,我們都使用的是具名掛載

#那么怎么區(qū)分匿名掛載還是具名掛載?
-v 容器內(nèi)路徑            #匿名掛載
-v 卷名:容器內(nèi)路徑       #具名掛載
-v/宿主機(jī)路徑:容器內(nèi)路徑  #指定路徑掛載

拓展:

docker run -d -P --name nginx01 -v /etc/nginx:ro nginx
docker run -d -P --name nginx01 -v /etc/nginx:rw nginx

#我們發(fā)現(xiàn)上面兩個(gè)具名掛載的命令唐础,在目錄下有一個(gè):ro:rw
#那么這個(gè)ro和rw是什么意思呢箱歧?
:ro readonly    #只讀
:rw readWrite   #可讀可寫(xiě)

#一旦設(shè)置了只讀,我們?cè)谌萜髦芯椭荒苤蛔x了

Dockerfile

DockerFile介紹

dockerfile是用來(lái)構(gòu)建docker鏡像的文件一膨,命令參數(shù)腳本呀邢!

構(gòu)建步驟:

1、編寫(xiě)一個(gè)dockerfile文件

2豹绪、docker build構(gòu)建成一個(gè)鏡像

3价淌、docker run 運(yùn)行鏡像

4、docker push 發(fā)布鏡像(發(fā)布到docker hub上瞒津、阿里云遠(yuǎn)程鏡像)

查看一下官方是怎么做的:

在docker hub上搜索centos蝉衣,然后點(diǎn)擊版本,會(huì)跳轉(zhuǎn)到git hub上巷蚪,我們就可以發(fā)現(xiàn)了這個(gè)centos的docker file文件病毡。

查看DockerFile文件

DockerFile的構(gòu)建過(guò)程

基礎(chǔ)知識(shí)

1、每個(gè)保留關(guān)鍵字(指令)都是必須是大寫(xiě)字母

2屁柏、執(zhí)行從上到下順序執(zhí)行

3剪验、#表示注釋

4、每一個(gè)指令都會(huì)創(chuàng)建一個(gè)新的鏡像層前联,并提交功戚!

示意圖

dockerFile是面向開(kāi)發(fā)的!我們以后要發(fā)布項(xiàng)目似嗤,做成鏡像啸臀,就需要?jiǎng)e寫(xiě)dockerFile文件,這個(gè)文件不難烁落!

Docker鏡像逐漸成為了一個(gè)企業(yè)交付的標(biāo)準(zhǔn)乘粒,必須要掌握!

步驟:開(kāi)發(fā)伤塌,部署灯萍,運(yùn)維。每聪。旦棉。缺一不可齿风!

DockerFile:構(gòu)建文件,定義了一切的步驟绑洛,源代碼

DockerImages:通過(guò)DockerFile構(gòu)建生成的鏡像救斑,最終發(fā)布和運(yùn)行的產(chǎn)品!

Docker容器:容器就是鏡像運(yùn)行起來(lái)提供服務(wù)器真屯!

DockerFile指令

常見(jiàn)指令
From        #基礎(chǔ)鏡像脸候,一切從這里構(gòu)建
MAINTAINER  #鏡像是誰(shuí)寫(xiě)的,姓名+郵箱
run         #鏡像構(gòu)建的時(shí)候需要運(yùn)行的命令
ADD         #步驟:tomcat鏡像,這個(gè)tomcat壓縮包绑蔫!添加內(nèi)容
WORKDIR     #鏡像的工作目錄
VOLUME      #掛載的目錄
EXPOSE      #保留端口配置
CMD         #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令运沦,只有最后一個(gè)會(huì)生效,可被替代
ENTRYPOINT  #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令配深,可以追加命令
ONBUILD     #當(dāng)構(gòu)建一個(gè)被繼承DOCKERFILE這個(gè)時(shí)候就會(huì)運(yùn)行ONBUILD的指令携添。觸發(fā)指令
COPY        #類似ADD,將我們文件拷貝到鏡像中
ENV         #構(gòu)建的時(shí)候設(shè)置環(huán)境變量

centos實(shí)戰(zhàn)測(cè)試

DockerHub中大部分的centos鏡像都是從 centos-7-x86_64-docker.tar.xz過(guò)來(lái)的凉馆,也就是說(shuō)這是一個(gè)最基層的鏡像!

創(chuàng)建一個(gè)自己的contos鏡像

1亡资、編寫(xiě)自己的配置文件

FROM centos
MAINTAINER shaozhaowei<1277524222@qq.com>

ENV MYPATH /user/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD "--------"
CMD /bin/bash             

2澜共、通過(guò)這個(gè)鏡像構(gòu)建鏡像

#注意結(jié)尾處有一個(gè)點(diǎn)
docker build -f mydockerfile-centos -t mycentos:0.1 .
構(gòu)建鏡像

3、測(cè)試運(yùn)行

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run -it mycentos:0.1
[root@9b924b5f6fc5 local]# pwd
/user/local
#這里可以發(fā)現(xiàn)我們直接進(jìn)入了我們?cè)谂渲梦募芯帉?xiě)的工作目錄
[root@9b924b5f6fc5 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.4  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:04  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@9b924b5f6fc5 local]# vim szw.java
[root@9b924b5f6fc5 local]# ls
szw.java
#以上是測(cè)試的兩個(gè)我們自己配置的命令锥腻,全部成功嗦董!
#我們還可以根據(jù)以下命令查看當(dāng)前的docker鏡像是怎么做出來(lái)的
#我們可以根據(jù)這個(gè)歷史查看他是怎么做的
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker history 5559295ad3fc
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
5559295ad3fc        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
46c14122fbc3        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "\"--…   0B                  
5c9e8d094bc9        6 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
4607fb979c7b        6 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B                  
0a13147a565f        6 minutes ago       /bin/sh -c yum -y install net-tools             24.1MB              
72f1c108662c        6 minutes ago       /bin/sh -c yum -y install vim                   59.8MB              
3e21b077a0b9        7 minutes ago       /bin/sh -c #(nop) WORKDIR /user/local           0B                  
230e9f4efd9c        7 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/user/local       0B                  
0c5002514cc7        7 minutes ago       /bin/sh -c #(nop)  MAINTAINER shaozhaowei<12…   0B                  
470671670cac        4 months ago        /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 months ago        /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           4 months ago        /bin/sh -c #(nop) ADD file:aa54047c80ba30064…   237MB    

CMD和ENTRYPOINT區(qū)別

CMD         #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令,只有最后一個(gè)會(huì)生效瘦黑,可被替代
ENTRYPOINT  #指定這個(gè)容器啟動(dòng)的時(shí)候需要運(yùn)行的命令京革,可以追加命令

測(cè)試cmd命令

#編寫(xiě)dockerFile
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# vim docker-cmd-test

FROM centos
CMD ["LS","-a"]

#編寫(xiě)完之后,使用命令進(jìn)行構(gòu)建
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker build -f docker-cmd-test -t cmdtest .
#中間省略
Successfully built 56e5493262cd
Successfully tagged cmdtest:latest
#我們可以發(fā)現(xiàn)啟動(dòng)成功
啟動(dòng)成功

運(yùn)行上面這個(gè)鏡像幸斥,就會(huì)列出所有所有的目錄匹摇。

#我們?cè)俅芜\(yùn)行這個(gè)鏡像,追加一個(gè)命令 -l
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run 56e5493262cd -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 
#我們這里可以發(fā)現(xiàn)甲葬,報(bào)錯(cuò)了廊勃!
#為什么呢?
#CMD的情況下 -l 替換了CMD的["ls","-a"]命令经窖,而-l根本不是命令坡垫,所以報(bào)錯(cuò)

我們繼續(xù)測(cè)試ENTRYPOINT命令,用這個(gè)進(jìn)行構(gòu)建dockerFile

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# vim docker-entrypoint-test

FORM centos
ENTRYPOINT ["ls","-a"]

#使用配置文件進(jìn)行構(gòu)建
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker build -f docker-entrypoint-test -t entrycentos .

#進(jìn)行運(yùn)行
運(yùn)行

tomcat實(shí)戰(zhàn)測(cè)試

1画侣、準(zhǔn)備鏡像文件tomcat壓縮包冰悠,jdk壓縮包,放在同一個(gè)目錄下

壓縮包

2配乱、編寫(xiě)Dockerfile

FROM centos
MAINTAINER shaozhaowei<1277524222@qq.com>

COPY readme.txt /usr/local/readme.txt

Add jdk-8u201-linux-x64.tar.gz /usr/local/
Add apache-tomcat-9.0.16.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local
WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.16
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.16
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.16/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.16/bin/logs/catalina.out

3溉卓、構(gòu)建這個(gè)鏡像

docker build -t diytomcat .

4皮迟、構(gòu)建容器

docker run -d -p 3310:8080 --name diytomcat -v /root/testAll/test:/usr/local/apache-tomcat-9.0.16/webapps/test -v /root/testAll/logs/:/usr/local/apache-tomcat-9.0.16/webapps/logs diytomcat

5、運(yùn)行進(jìn)入自己的容器

[root@iZ2zeeqh1fctjw2bhzgjnaZ testAll]# docker exec -it 8df6726000b813bcf775 /bin/bash
[root@8df6726000b8 local]# ls
aegis             bin  games    jdk1.8.0_201  lib64    readme.txt  share
apache-tomcat-9.0.16  etc  include  lib       libexec  sbin        src
#我們可以發(fā)現(xiàn)已經(jīng)把復(fù)制的兩個(gè)jdk和tomcat解壓進(jìn)了容器中

6的诵、訪問(wèn)我們服務(wù)器ip地址+端口號(hào)万栅,可以看到tomcat主頁(yè)就代表成功了!

7西疤、如果想嘗試頁(yè)面發(fā)布到服務(wù)器蔼两,要先編寫(xiě)web.xml,然后再在webapps/test/下漩仙,訪問(wèn)對(duì)應(yīng)的頁(yè)面踊兜。

發(fā)布自己的鏡像

DockerHub

1、在官網(wǎng)上進(jìn)行注冊(cè)賬號(hào)

2芭碍、確定這個(gè)賬號(hào)可以登錄

3徒役、在我們服務(wù)器上提交自己的鏡像

#查看登錄命令的幫助
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username
登陸成功

這里就算登錄成功了!

[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker push diytomcat
The push refers to repository [docker.io/library/diytomcat]
2d7c03c9871a: Preparing 
0fcab5fa81bf: Preparing 
1dd967f434ae: Preparing 
ce3680ddfbcf: Preparing 
0683de282177: Preparing 
denied: requested access to the resource is denied
#這里提示push失敗
#push鏡像的的問(wèn)題窖壕?
#解決忧勿,增加一個(gè)tag
docker tag 4f4184981337 shaozhaowei/tomcat:1.1
#注意,標(biāo)簽前面的那個(gè)shaozhaowei必須是你需要push的賬戶名瞻讽,就是作者名

[root@iZ2zeeqh1fctjw2bhzgjnaZ ~]# docker push shaozhaowei/tomcat:1.1
The push refers to repository [docker.io/shaozhaowei/tomcat]
2d7c03c9871a: Pushing  31.31MB/59.78MB
0fcab5fa81bf: Pushed 
1dd967f434ae: Pushing  11.99MB/396.7MB
ce3680ddfbcf: Pushed 
0683de282177: Pushing  57.52MB/237.1MB
^C
#這樣就顯示上傳了鸳吸,需要等待!這個(gè)就是按照鏡像的層級(jí)上傳的

發(fā)布到阿里云鏡像中

1速勇、登錄阿里云

2晌砾、找到容器鏡像服務(wù)

Docker網(wǎng)絡(luò)

理解Docker0

測(cè)試

ip addr
查看ip

三種網(wǎng)絡(luò)代表三種網(wǎng)絡(luò):

#問(wèn)題:docker是怎樣處理網(wǎng)絡(luò)訪問(wèn)的?
烦磁?
#我們?cè)赿ocker的容器內(nèi)部查看ip养匈,發(fā)現(xiàn)容器啟動(dòng)的時(shí)候會(huì)有一個(gè)eth0@if99
root@dff7be9666bc:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
98: eth0@if99: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
#我們測(cè)試一下服務(wù)器內(nèi)部是否能ping

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.074 ms

#我們發(fā)現(xiàn)linux可以ping通容器內(nèi)的ip

原理

1、我們每安裝一個(gè)docker容器都伪,docker就會(huì)給docker容器分配一個(gè)ip呕乎,只要我們安裝了docker,就會(huì)有一個(gè)網(wǎng)卡docker0陨晶。這就是橋接楣嘁,使用的技術(shù)是evth-pair技術(shù)!

我們?cè)俅蝡ing一下linux中的網(wǎng)絡(luò)

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# ip addr
#中間的1-5省略
#我們可以和剛才容器內(nèi)的ip進(jìn)行對(duì)比珍逸,發(fā)現(xiàn)了98,99這一對(duì)ip驚人的相似逐虚!
99: veth98b8be1@if98: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 6e:f2:ee:28:10:86 brd ff:ff:ff:ff:ff:ff link-netnsid 0

2、我們?cè)俅芜M(jìn)行測(cè)試谆膳!

#繼續(xù)啟動(dòng)一個(gè)tomcat
101

我們?cè)谌萜鲀?nèi)進(jìn)行查看ip

查看ip
#我們發(fā)現(xiàn)容器帶來(lái)的網(wǎng)卡叭爱,都是一對(duì)一對(duì)存在的!
#evth-pair就是一對(duì)的虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一段連著協(xié)段彼此相連
#正因?yàn)橛羞@個(gè)特性,evth-pair充當(dāng)一個(gè)橋粱漱病,連接各種虛擬網(wǎng)絡(luò)設(shè)備
#openStac买雾,Docker容器之間的連接把曼,ovs的鏈接,都是使用了evth-pair技術(shù)

3漓穿、我們測(cè)試兩個(gè)tomcat是否能ping通

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat02 ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.077 ms
#測(cè)試我們發(fā)現(xiàn)兩個(gè)容器之間也是可以ping通的

結(jié)論:tomcat01和tomcat02是公用的一個(gè)路由器嗤军,docker0.

所有的容器不指定網(wǎng)絡(luò)的情況下,都是 docker0路由的, docker會(huì)給我們的容器分配一個(gè)默認(rèn)的可用IP。

.

小結(jié)

核心就是:利用了linux中的虛擬化網(wǎng)絡(luò)技術(shù)晃危。在容器中和docker0中分別創(chuàng)建了一個(gè)虛擬網(wǎng)卡叙赚,通過(guò)veth進(jìn)行連接。

Docker中的所有的網(wǎng)絡(luò)接口都是虛擬的僚饭。虛擬的轉(zhuǎn)發(fā)效率特別快U鸲!(內(nèi)網(wǎng)傳遞)。

只要?jiǎng)h除容鳍鸵,對(duì)應(yīng)的網(wǎng)橋就會(huì)消失苇瓣。

示意圖

--link

思考一個(gè)場(chǎng)景:我們編寫(xiě)了一個(gè)微服務(wù),datebase url = ip偿乖,項(xiàng)目不重啟击罪,數(shù)據(jù)庫(kù)ip換掉了,我們希望可以處理這個(gè)問(wèn)題贪薪,可以利用名字來(lái)訪問(wèn)容器媳禁。

#上面的場(chǎng)景就是歸結(jié)于一個(gè)問(wèn)題,怎么使用服務(wù)名代替ip地址訪問(wèn)容器古掏?
#先做一個(gè)測(cè)試
#我們后面不跟ip地址损话,直接跟容器名侦啸。
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known


#使用link
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker run -d -P --name tomcat03 --link tomcat02 tomcat:9.0
58aae10fb4ecb6324d50139b27800f6cc1a58af0340c21477cd735fded967a98
#使用--link進(jìn)行把tomcat03和tomcat02的網(wǎng)絡(luò)互連
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.18.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.18.0.3): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat02 (172.18.0.3): icmp_seq=2 ttl=64 time=0.080 ms
64 bytes from tomcat02 (172.18.0.3): icmp_seq=3 ttl=64 time=0.084 ms
^C
--- tomcat02 ping statistics ---
#我們可以通過(guò)以上發(fā)現(xiàn)tomcat03和tomcat02進(jìn)行了一個(gè)連接

#但是經(jīng)過(guò)測(cè)試槽唾,發(fā)現(xiàn)tomcat02是無(wú)法與tomcat03進(jìn)行ping通的!

探究

[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
095914b1b0c6        bridge              bridge              local
c5b2a21d16c0        host                host                local
755347b3adf4        none                null                local
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker network inspect 095914b1b0c6
#摘選出主要信息
"Containers": {
            "58aae10fb4ecb6324d50139b27800f6cc1a58af0340c21477cd735fded967a98": {
                "Name": "tomcat03",
                "EndpointID": "b9fe7d0503be687a08bfee2c7d4b53dc72b4db8c18f0c2f546a277070a539b3d",
                "MacAddress": "02:42:ac:12:00:04",
                "IPv4Address": "172.18.0.4/16",
                "IPv6Address": ""
            },
            "def92693ca704227cf7d8c5602606d14e614a1af7c2f877b2429d65a0dd5a89e": {
                "Name": "tomcat02",
                "EndpointID": "ba161992c42eb4060705330baee39110456d31e473fd866ac2a7fb9603eee085",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "dff7be9666bcb7b5567b1e03127ac72efff9bcd4c24933ad30072f807ab029bf": {
                "Name": "tomcat01",
                "EndpointID": "5eb39f854209ee16a9813dad5964ab04950603c4f24c933641d5c39361137289",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
image.png
[root@iZ2zeeqh1fctjw2bhzgjnaZ dockerfile]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.3  tomcat02 def92693ca70
172.18.0.4  58aae10fb4ec
#我們查看tomcat03中的本地網(wǎng)絡(luò)配置光涂,發(fā)現(xiàn)綁定了tomcat02庞萍,這就是為什么我們通過(guò)容器名就可以ping到ip地址

但是不推薦使用!

自定義網(wǎng)絡(luò)

使用命令查看docker所有的網(wǎng)絡(luò)模式

查看網(wǎng)絡(luò)模式

網(wǎng)絡(luò)模式

bridge:橋接 docker(默認(rèn))

none:不配置網(wǎng)絡(luò)

host:和宿主機(jī)共用一個(gè)網(wǎng)絡(luò)

container:容器網(wǎng)絡(luò)連同(用的少忘闻,局限性很大)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钝计,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齐佳,更是在濱河造成了極大的恐慌私恬,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炼吴,死亡現(xiàn)場(chǎng)離奇詭異本鸣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)硅蹦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)荣德,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闷煤,“玉大人,你說(shuō)我怎么就攤上這事涮瞻±鹉茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵署咽,是天一觀的道長(zhǎng)近顷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)艇抠,這世上最難降的妖魔是什么幕庐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮家淤,結(jié)果婚禮上异剥,老公的妹妹穿的比我還像新娘。我一直安慰自己絮重,他們只是感情好冤寿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著青伤,像睡著了一般督怜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狠角,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天号杠,我揣著相機(jī)與錄音,去河邊找鬼丰歌。 笑死姨蟋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立帖。 我是一名探鬼主播眼溶,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晓勇!你這毒婦竟也來(lái)了堂飞?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绑咱,失蹤者是張志新(化名)和其女友劉穎绰筛,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體描融,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铝噩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稼稿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄榛。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讳窟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敞恋,到底是詐尸還是另有隱情丽啡,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布硬猫,位于F島的核電站补箍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啸蜜。R本人自食惡果不足惜坑雅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衬横。 院中可真熱鬧裹粤,春花似錦、人聲如沸蜂林。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)噪叙。三九已至矮锈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間睁蕾,已是汗流浹背苞笨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留子眶,地道東北人瀑凝。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像壹店,于是被迫代替她去往敵國(guó)和親猜丹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子芝加,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355