docker基础篇——万字解读小鲸鱼
????????
目錄
前言? ? ? ??
為什么會(huì)出現(xiàn)docker?
背景
docker理念
容器和虛擬機(jī)比較
容器發(fā)展簡(jiǎn)史
?容器虛擬化技術(shù)
Why Docker
docker的基本組成
??鏡像(image)
容器(container)
倉庫(repository)
總結(jié)
第一個(gè)docker鏡像——hello-world
run干了什么
docker為什么比虛擬機(jī)快
幫助啟動(dòng)類命令
幫助命令
鏡像命令
docker images 查看所有本地主機(jī)上的鏡像
docker search 搜索鏡像
docker pull 下載鏡像
查看鏡像/容器/數(shù)據(jù)卷所占的空間
刪除鏡像
容器命令
新建容器并啟動(dòng)
列出運(yùn)行中的程序
退出容器
刪除容器
啟動(dòng)和停止容器操作
后臺(tái)啟動(dòng)容器
前臺(tái)啟動(dòng)和后臺(tái)啟動(dòng)區(qū)別
Detached (-d)
Foregroud(不寫-d)
其他常用命令(重點(diǎn))
查看日志
查看容器中的進(jìn)程信息
查看鏡像的元數(shù)據(jù)
進(jìn)入當(dāng)前正在運(yùn)行的容器
方式一
方式二
attach與exec對(duì)比:
從容器拷貝文件到主機(jī)上
?導(dǎo)入和導(dǎo)出容器
Docker鏡像
鏡像是什么?
鏡像是分層的
???UnionFS(聯(lián)合文件系統(tǒng))
Docker鏡像加載原理
為什么 Docker 鏡像要采用這種分層結(jié)構(gòu)呢?
??重點(diǎn)理解
Docker容器數(shù)據(jù)卷
數(shù)據(jù)卷是什么?
數(shù)據(jù)卷能干什么?
?容器和宿主機(jī)之間數(shù)據(jù)共享
查看數(shù)據(jù)卷是否掛載成功?
??讀寫規(guī)則限制說明
卷的繼承和共享
?容器1完成和宿主機(jī)的映射?
容器2繼承容器1的卷規(guī)則
繼承舉例
思考
總結(jié)一波當(dāng)前學(xué)的命令:
練習(xí):下載nginx
端口暴露
查找ngnix的位置 whereis
作業(yè): docker來裝一個(gè)tomcat
???????
前言?
?????????大家好,我是躺平哥,這是我的docker學(xué)習(xí)筆記基礎(chǔ)篇,用來記錄自己的學(xué)歷歷程,我感覺學(xué)習(xí)docker主要是多敲多練多看。我也是個(gè)小白,如果有寫的不好的地方也請(qǐng)大家多多指點(diǎn)!? ? ?
為什么會(huì)出現(xiàn)docker?
背景
在公司開發(fā)過程中,開發(fā)需要清楚的告訴運(yùn)維部署團(tuán)隊(duì),用的全部配置文件+所有軟件環(huán)境。不過,即便如此,仍然常常發(fā)生部署失敗的狀況。
于是——
docker誕生了
Docker的出現(xiàn)使得Docker得以打破過去「程序即應(yīng)用」的觀念。
透過鏡像(images)將作業(yè)系統(tǒng)核心除外,運(yùn)作應(yīng)用程式所需要的系統(tǒng)環(huán)境,由下而上打包,達(dá)到應(yīng)用程式跨平臺(tái)間的無縫接軌運(yùn)作。
大白話來講:就是我把環(huán)境連帶程序都給你一塊打包起來了!
docker理念
Docker是基于Go語言實(shí)現(xiàn)的云開源項(xiàng)目。
只需要一次配置好環(huán)境,換到別的機(jī)子上就可以一鍵部署好,大大簡(jiǎn)化了操作。
?????一句話:
???解決了運(yùn)行環(huán)境和配置問題的軟件容器, 方便做持續(xù)集成并有助于整體發(fā)布的容器虛擬化技術(shù)。
在了解docker之前我們先聊聊虛擬機(jī),虛擬機(jī)也是一個(gè)偉大的發(fā)明!
容器和虛擬機(jī)比較
容器發(fā)展簡(jiǎn)史
傳統(tǒng)虛擬機(jī)的缺點(diǎn)
- 資源占用多,因?yàn)樗M出一整套操作系統(tǒng)
- 冗余步驟多,虛擬機(jī)創(chuàng)建出一個(gè)操作系統(tǒng)往往要有很多步驟
- 啟動(dòng)慢,往往好幾分鐘。
?容器虛擬化技術(shù)
由于前面虛擬機(jī)存在某些缺點(diǎn),Linux發(fā)展出了另一種虛擬化技術(shù):
Linux容器(Linux Containers,縮寫為 LXC)
Linux 容器不是模擬一個(gè)完整的操作系統(tǒng)而是對(duì)進(jìn)程進(jìn)行隔離。
有了容器,就可以將軟件運(yùn)行所需的所有資源打包到一個(gè)隔離的容器中。
容器與虛擬機(jī)不同,不需要捆綁一整套操作系統(tǒng),只需要軟件工作所需的庫資源和設(shè)置。
*容器內(nèi)的應(yīng)用進(jìn)程直接運(yùn)行于宿主的內(nèi)核,容器內(nèi)沒有自己的內(nèi)核且也沒有進(jìn)行硬件虛擬。因此容器要比傳統(tǒng)虛擬機(jī)更為輕便。
例如下圖:
那話又說回來了——
Why Docker
●更輕量: 基于容器的虛擬化,僅包含業(yè)務(wù)運(yùn)行所需的runtime環(huán)境,CentOS/Ubuntu基礎(chǔ)鏡像僅170M;宿主機(jī)可部署100~ 1000個(gè)容器
●更高效:無操作系統(tǒng)虛擬化開銷
●計(jì)算:輕量,無極外開銷
#存儲(chǔ):系統(tǒng)盤aufs/dmloverlayts; 數(shù)據(jù)盤volume
●網(wǎng)絡(luò):宿主機(jī)網(wǎng)絡(luò),NS隔離
.更敏捷、更靈活:
●分層的存儲(chǔ)和包管理,devops理念
●支持多種網(wǎng)絡(luò)配置
docker的基本組成
下面的圖可以很清楚的看出docker各個(gè)組成之間的轉(zhuǎn)換關(guān)系,以及對(duì)應(yīng)命令:
??鏡像(image)
Docker 鏡像(Image)就是一個(gè)只讀的模板。鏡像可以用來創(chuàng)建 Docker 容器,一個(gè)鏡像可以建很多容器。
它也相當(dāng)于是一個(gè)root文件系統(tǒng)。比如官方鏡像 centos:7 就包含了完整的一套 centos:7 最小系統(tǒng)的 root 文件系統(tǒng)。
相當(dāng)于容器的“源代碼”,docker鏡像文件類似于Java的類模板,而docker容器實(shí)例類似于java中new出來的實(shí)例對(duì)象。
容器(container)
下面我們從以下兩個(gè)角度來介紹容器?:
1 從面向?qū)ο蠼嵌?/span>
????????Docker 利用容器(Container)獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用,應(yīng)用程序或服務(wù)運(yùn)行在容器里面,容器就類似于一個(gè)虛擬化的運(yùn)行環(huán)境,容器是用鏡像創(chuàng)建的運(yùn)行實(shí)例。就像是Java中的類和實(shí)例對(duì)象一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器為鏡像提供了一個(gè)標(biāo)準(zhǔn)的和隔離的運(yùn)行環(huán)境,它可以被啟動(dòng)、開始、停止、刪除。每個(gè)容器都是相互隔離的、保證安全的平臺(tái)
2 從鏡像容器角度
可以把容器看做是一個(gè)簡(jiǎn)易版的 Linux 環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。
倉庫(repository)
倉庫(Repository)是集中存放鏡像文件的場(chǎng)所。
最大的公開倉庫是 DockerHub(Docker Hub)
tar與dockerfile以后會(huì)說
總結(jié)
鏡像文件
- image 文件生成的容器實(shí)例,本身也是一個(gè)文件,稱為鏡像文件。
容器實(shí)例
- ?一個(gè)容器運(yùn)行一種服務(wù),當(dāng)我們需要的時(shí)候,就可以通過docker客戶端創(chuàng)建一個(gè)對(duì)應(yīng)的運(yùn)行實(shí)例,也就是我們的容器
倉庫
- 就是放一堆鏡像的地方,我們可以把鏡像發(fā)布到倉庫中,需要的時(shí)候再從倉庫中拉下來就可以了。
第一個(gè)docker鏡像——hello-world
run干了什么
docker為什么比虛擬機(jī)快
(1)docker有著比虛擬機(jī)更少的抽象層:
(2)docker利用的是linux的內(nèi)核,而不需要加載操作系統(tǒng)OS內(nèi)核
幫助啟動(dòng)類命令
- 啟動(dòng)docker : systemctl start docker
- 停止docker : systemctl stop docker
- 重啟docker : systemctl restart docker
- 查看docker狀態(tài): systemctl status docker
- 開機(jī)啟動(dòng) : systemctl enable docker
- 查看docker概要信息: docker info
- 查看docker 總體幫助文檔: docker --help
- 查看docker命令幫助文檔: docker 具體命令 --help
幫助命令
docker version //顯示docker 的版本信息
docker info //顯示docker 的系統(tǒng)信息 包括鏡像和容器數(shù)量
docker 命令 -- help
鏡像命令
docker images 查看所有本地主機(jī)上的鏡像
REPOSITORY 倉庫的鏡像
TAG 鏡像的標(biāo)簽,也就是鏡像版本號(hào),不寫默認(rèn)最新版
IMAGE ID 鏡像的id
CREATE 鏡像的創(chuàng)建時(shí)間
SIZE 鏡像的大小
可選項(xiàng)
- -a --all 列出所有鏡像
- -q --quiet 只列出鏡像的id
docker search 搜索鏡像
可選項(xiàng),通過搜索來過濾
[root@ecs-287241 ~]# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13384 [OK]
mariadb MariaDB Server is a high performing open sou… 5109 [OK]
[root@ecs-287241 ~]#
篩選starts大于3000的
docker pull 下載鏡像
下載鏡像 docker pull 鏡像名 [: tag版本]
- docker pull mysql
- 如果不寫tag,默認(rèn)就是latest
- 分層下載,這是docker images 的核心,聯(lián)合文件信息
查看鏡像/容器/數(shù)據(jù)卷所占的空間
docker system df
刪除鏡像
docker rmi id
[root@ecs-287241 ~]# docker rmi -f feb5d9fea6a5
Untagged: hello-world:latest
Untagged: hello-world@sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
[root@ecs-287241 ~]# docker images
?面試題:談?wù)刣ocker虛懸鏡像是什么?
·????????是什么
·????????倉庫名、標(biāo)簽都是<none>的鏡像,俗稱虛懸鏡像dangling image
·????????長(zhǎng)什么樣
·????????后續(xù)Dockerfile章節(jié)再介紹
容器命令
說明:我們有了鏡像才可以創(chuàng)建容器,linux,下載一個(gè)centos來學(xué)習(xí)
docker pull centos (centos小型的服務(wù)器)
新建容器并啟動(dòng)
docker run [可選參數(shù)] image
#參數(shù)說明(最常用參數(shù))
--name="Name" 容器名字 tomcat1 tomcat2 用來區(qū)分容器
-d 后臺(tái)方式運(yùn)行
-i:以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
-t:為容器重新分配一個(gè)偽輸入終端,通常與 -i 同時(shí)使用;
也即啟動(dòng)交互式容器(前臺(tái)有偽終端,等待交互),就是等待你輸入命令!
-it 使用交互方式運(yùn)行,進(jìn)入容器查看內(nèi)容
為什么要寫 -it?
不寫-it你會(huì)發(fā)現(xiàn)是這樣的
我們想要一個(gè)終端進(jìn)行交互!輸入命令,所以必須寫!
后面往往還要寫上/bin/bash:?是指此腳本使用/bin/bash來解釋執(zhí)行。/bin/bash:放在鏡像名后的shell命令,這里我們希望有個(gè)交互式 Shell,因此用的是 /bin/bash。
#使用鏡像centos:latest以交互模式啟動(dòng)一個(gè)容器,在容器內(nèi)執(zhí)行/bin/bash命令。
docker run -it centos /bin/bash
或者
docker run -it centos bash 也可以!即使你沒寫/bin/bash 他也會(huì)默認(rèn)在你后面帶一個(gè)shell腳本
-p 指定容器的端口 -p 8080:8080
-p IP:主機(jī)端口:容器端口
-p 主機(jī)端口:容器端口 (常用)
-p 容器端口
-P: 隨機(jī)端口映射,大寫P
-p: 指定端口映射,小寫p
一般我們用小p
如下圖:
左邊是宿主機(jī)暴露的端口,右邊是docker訪問redis暴露的端口
啟動(dòng) 并進(jìn)入容器
[root@ecs-287241 ~]# docker run -it centos /bin/bash
查看容器內(nèi)的centos,基礎(chǔ)鏡像都是不完善的
[root@882655ac322c /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
從容器中退到主機(jī)
exit
列出運(yùn)行中的程序
docker ps 命令
-a 當(dāng)前正在運(yùn)行,帶出歷史運(yùn)行過的容器。
-l:顯示最近創(chuàng)建的容器。
-n=? 最近創(chuàng)建的容器。
-q 靜默模式,只顯示容器的編號(hào)。
退出容器
exit 直接容器停止并退出
ctrl +p +q 容器不停止退出
刪除容器
docker rm 容器id 刪除指定的容器,不能刪除正在運(yùn)行的容器,如果要強(qiáng)制刪除 rm -f
可以先docker stop 停止容器 再docker rm
docker rm -f $(docker ps -aq) 刪除所有的容器
docker ps -a -qlxargs docker rm
啟動(dòng)和停止容器操作
docker satrt 容器id 啟動(dòng)容器
docker restart 容器id 重啟容器
docker stop 容器id 停止當(dāng)前正在運(yùn)行的容器
docker kill 容器id 強(qiáng)制停止當(dāng)前容器
后臺(tái)啟動(dòng)容器
- 命令 docker run -d 鏡像名!
- docker run -d centos
- 問題docker ps,發(fā)現(xiàn)了 centos停止了
- docker run 之后一定要docker ps查看容器是否運(yùn)行!
- 常見的坑,docker 容器使用后臺(tái)運(yùn)行,就必須要有一個(gè)前臺(tái)進(jìn)程,docker發(fā)現(xiàn)沒有應(yīng)用,就會(huì)自動(dòng)停止 。
- ngnix ,容器啟動(dòng)后,發(fā)現(xiàn)自己沒有提供服務(wù),就會(huì)立即停止,就是沒有程序了
- Nginx?(engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器
前臺(tái)啟動(dòng)和后臺(tái)啟動(dòng)區(qū)別
- 前臺(tái)交互式啟動(dòng)
- ?????docker run -it redis:6.0.8
- ?? ??后臺(tái)守護(hù)式啟動(dòng)
- ??????docker run -d redis:6.0.8
Detached (-d)
如果在docker run后面追加-d=true或者-d,那么容器將會(huì)運(yùn)行在后臺(tái)模式。此時(shí)所有I/O數(shù)據(jù)只能通過網(wǎng)絡(luò)資源或者共享卷組來進(jìn)行交互。因?yàn)槿萜鞑辉俦O(jiān)聽你執(zhí)行docker run的這個(gè)終端命令行窗口。但你可以通過執(zhí)行docker attach來重新附著到該容器的會(huì)話中。需要注意的是,容器運(yùn)行在后臺(tái)模式下,是不能使用--rm選項(xiàng)的。
Foregroud(不寫-d)
在前臺(tái)模式下(不指定-d參數(shù)即可),Docker會(huì)在容器中啟動(dòng)進(jìn)程,同時(shí)將當(dāng)前的命令行窗口附著到容器的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤中。也就是說容器中所有的輸出都可以在當(dāng)前窗口中看到。甚至它都可以虛擬出一個(gè)TTY窗口,來執(zhí)行信號(hào)中斷。
我們要在在容器中干活!
以redis容器為例,在里面干活
兩個(gè)開發(fā)方式對(duì)比,想必你更能體會(huì)到容器的威力!
其他常用命令(重點(diǎn))
查看日志
查看容器日志:docker logs 容器ID
docker logs -f -t --tail 容器,沒有日志
顯示日志
-tf 顯示日志
--tail number 顯示日志條數(shù)
查看容器中的進(jìn)程信息
查看容器內(nèi)運(yùn)行的進(jìn)程
命令: docker top 容器id
查看鏡像的元數(shù)據(jù)
命令:
?查看容器內(nèi)部細(xì)節(jié)
docker inspect 容器 id
進(jìn)入當(dāng)前正在運(yùn)行的容器
我們通常容器都是使用后臺(tái)放式運(yùn)行的,需要進(jìn)入容器,修改一些配置
方式一
#命令
docker exec -it 容器id bashShell
[root@ecs-287241 /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6e5cf171dca0 centos "/bin/bash" 10 minutes ago Up 10 minutes serene_goodall [root@ecs-287241 /]# docker exec -it 6e5cf171dca0 /bin/bash [root@6e5cf171dca0 /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@6e5cf171dca0 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:42 pts/0 00:00:00 /bin/bash root 15 0 0 13:54 pts/1 00:00:00 /bin/bash root 30 15 0 13:55 pts/1 00:00:00 ps -ef [root@6e5cf171dca0 /]#
方式二
docker attach 容器id
進(jìn)入后會(huì)發(fā)現(xiàn)正在執(zhí)行當(dāng)前代碼!
attach與exec對(duì)比:
????attach 直接進(jìn)入容器啟動(dòng)命令的終端,不會(huì)啟動(dòng)新的進(jìn)程 用exit退出,會(huì)導(dǎo)致容器的停止。
????exec 是在容器中打開新的終端,并且可以啟動(dòng)新的進(jìn)程 用exit退出,不會(huì)導(dǎo)致容器的停止。
docker exec 進(jìn)入容器后開啟一個(gè)新的終端,可以在里面操作(常用)
docker attach 進(jìn)入容器正在執(zhí)行的終端,不會(huì)啟動(dòng)新的進(jìn)程
從容器拷貝文件到主機(jī)上
為了防止別人或者自己誤刪!所以要做備份
docker cp 容器id :容器內(nèi)路徑 目的主機(jī)路徑
[root@ecs-287241 home]# docker cp 6e5cf171dca0:/home/test.java /home [root@ecs-287241 home]# ls one1 test1 test.java wei wei.java www [root@ecs-287241 home]#
拷貝是一個(gè)手動(dòng)過程,未來我們使用 -v卷的技術(shù),可以實(shí)現(xiàn),自動(dòng)同步
即容器內(nèi)的home目錄和主機(jī)內(nèi)的home目錄連通,打通
?導(dǎo)入和導(dǎo)出容器
比拷貝docker cp 更加強(qiáng)大,這是拷貝整個(gè)容器!
·????????export 導(dǎo)出容器的內(nèi)容留作為一個(gè)tar歸檔文件[對(duì)應(yīng)import命令]
·????????docker export 容器ID > 文件名.tar
·????????import 從tar包中的內(nèi)容創(chuàng)建一個(gè)新的文件系統(tǒng)再導(dǎo)入為鏡像[對(duì)應(yīng)export]
·????????cat 文件名.tar | docker import - 鏡像用戶/鏡像名:鏡像版本號(hào)
刪除之后,利用import將abcd.tar變成一個(gè)鏡像,然后在通過run運(yùn)行成為一個(gè)容器。
下面我們來深入探究一下docker運(yùn)行原理!
Docker鏡像
鏡像是什么?
鏡像
是一種輕量級(jí)、可執(zhí)行的獨(dú)立軟件包,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,我們把應(yīng)用程序和配置依賴打包好形成一個(gè)可交付的運(yùn)行環(huán)境(包括代碼、運(yùn)行時(shí)需要的庫、環(huán)境變量和配置文件等),這個(gè)打包好的運(yùn)行環(huán)境就是image鏡像文件。
只有通過這個(gè)鏡像文件才能生成Docker容器實(shí)例!
鏡像是分層的
以我們的pull為例,在下載的過程中我們可以看到docker的鏡像好像是在一層一層的在下載
一層一層的下載! 因此鏡像是分層的。
???UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):
Union文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。
Union文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來,只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄。
Docker鏡像加載原理
Docker鏡像加載原理:
???docker的鏡像實(shí)際上由一層一層的文件系統(tǒng)組成,這種層級(jí)的文件系統(tǒng)UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引導(dǎo)加載kernel, Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是引導(dǎo)文件系統(tǒng)bootfs。
這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。
當(dāng)boot加載完成之后整個(gè)內(nèi)核就都在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)已由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)也會(huì)卸載bootfs。
rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系統(tǒng)中的 /dev, /proc, /bin, /etc 等標(biāo)準(zhǔn)目錄和文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版,比如Ubuntu,Centos等等。?
說白了我們只要bootfs和rootfs!
平時(shí)我們安裝進(jìn)虛擬機(jī)的CentOS都是好幾個(gè)G,為什么docker這里才200M??
對(duì)于一個(gè)精簡(jiǎn)的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因?yàn)榈讓又苯佑盟拗鳈C(jī)的linux內(nèi)核(Host的kernel),自己只需要提供 rootfs 就行了。
由此可見對(duì)于不同的linux發(fā)行版, bootfs基本是一致的, rootfs會(huì)有差別, 因此不同的發(fā)行版可以公用bootfs。
就像這樣:
那么話說回來了——
為什么 Docker 鏡像要采用這種分層結(jié)構(gòu)呢?
其實(shí)就是像樂高積木一樣,想用哪塊拿來組裝就行了!
鏡像分層最大的一個(gè)好處就是共享資源,方便復(fù)制遷移,就是為了復(fù)用。
比如說有多個(gè)鏡像都從相同的 base 鏡像構(gòu)建而來,那么 Docker Host 只需在磁盤上保存一份 base 鏡像;
同時(shí)內(nèi)存中也只需加載一份 base 鏡像,就可以為所有容器服務(wù)了。而且鏡像的每一層都可以被共享。?
一句話來講分層的意義:
加載簡(jiǎn)單,資源復(fù)用
??重點(diǎn)理解
·????????Docker鏡像層都是只讀的,容器層是可寫的當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。 這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。
所有對(duì)容器的改動(dòng)——無論添加、刪除、還是修改文件都只會(huì)發(fā)生在容器層中。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
Docker容器數(shù)據(jù)卷
?????坑:容器卷記得加入
??????--privileged=true
???why??
?Docker掛載主機(jī)目錄訪問如果出現(xiàn)cannotopen directory .: Permission denied
解決辦法:在掛載目錄后多加一個(gè)--privileged=true參數(shù)即可
如果是CentOS7安全模塊會(huì)比之前系統(tǒng)版本加強(qiáng),不安全的會(huì)先禁止,所以目錄掛載的情況被默認(rèn)為不安全的行為,
在SELinux里面掛載目錄被禁止掉了額,如果要開啟,我們一般使用--privileged=true命令,擴(kuò)大容器的權(quán)限解決掛載目錄沒有權(quán)限的問題,也即使用該參數(shù),container內(nèi)的root擁有真正的root權(quán)限,否則,container內(nèi)的root只是外部的一個(gè)普通用戶權(quán)限。一個(gè)容器就相當(dāng)于是一個(gè)小的linux內(nèi)核。
數(shù)據(jù)卷是什么?
卷就是目錄或文件,存在于一個(gè)或多個(gè)容器中,由docker掛載到容器,但不屬于聯(lián)合文件系統(tǒng),因此能夠繞過Union File System提供一些用于持續(xù)存儲(chǔ)或共享數(shù)據(jù)的特性:
卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此Docker不會(huì)在容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷。
·????????一句話:有點(diǎn)類似我們Redis里面的rdb和aof文件
·????????將docker容器內(nèi)的數(shù)據(jù)保存進(jìn)宿主機(jī)的磁盤中
·????????運(yùn)行一個(gè)帶有容器卷存儲(chǔ)功能的容器實(shí)例
·?????????docker run -it --privileged=true -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄????? 鏡像名
映射我們用“ :”,即冒號(hào)表示。
數(shù)據(jù)卷能干什么?
將運(yùn)用與運(yùn)行的環(huán)境打包鏡像,run后形成容器實(shí)例運(yùn)行 ,但是我們對(duì)數(shù)據(jù)的要求希望是久化的。?
Docker容器產(chǎn)生的數(shù)據(jù),如果不備份,那么當(dāng)容器實(shí)例刪除后,容器內(nèi)的數(shù)據(jù)自然也就沒了。
為了能保存數(shù)據(jù)在docker中我們使用卷。?
特點(diǎn):
1:數(shù)據(jù)卷可在容器之間共享或重用數(shù)據(jù)。
2:卷中的更改可以直接實(shí)時(shí)生效,爽。
3:數(shù)據(jù)卷中的更改不會(huì)包含在鏡像的更新中。
4:數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止。
?容器和宿主機(jī)之間數(shù)據(jù)共享
docker:
host宿主機(jī)
查看數(shù)據(jù)卷是否掛載成功?
docker inspect 容器ID
1? docker修改,主機(jī)同步獲得?
2 主機(jī)修改,docker同步獲得
3 docker容器stop,主機(jī)修改,docker容器重啟數(shù)據(jù)依舊同步。
因此即使是docker容器停止了也能夠同步數(shù)據(jù)
??讀寫規(guī)則限制說明
只限制容器,沒有限制主機(jī)
?rw = read + write
·?????????docker run -it --privileged=true -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:rw????? 鏡像名
·????????默認(rèn)同上案例,默認(rèn)就是rw
·????????只讀
·????????容器實(shí)例內(nèi)部被限制,只能讀取不能寫
?/容器目錄:ro鏡像名??????????????就能完成功能,此時(shí)容器自己只能讀取不能寫??
ro = read only?
此時(shí)如果宿主機(jī)寫入內(nèi)容,可以同步給容器內(nèi),容器可以讀取到。
docker run -it --privileged=true -v /宿主機(jī)絕對(duì)路徑目錄:/容器內(nèi)目錄:ro????? 鏡像名
操作一下:
容器
宿主機(jī)
卷的繼承和共享
?容器1完成和宿主機(jī)的映射?
docker run -it? --privileged=true -v /mydocker/u:/tmp --name u1ubuntu
容器2繼承容器1的卷規(guī)則
·????????docker run -it? --privileged=true --volumes-from 父類? --name u2 ubuntu
繼承舉例
u3繼承u1
思考
u1stop掉了,u3和宿主機(jī)之間同步數(shù)據(jù),u1start之后會(huì)同步數(shù)據(jù)嗎?
會(huì)的!
總結(jié)一波當(dāng)前學(xué)的命令:
1.容器上拷貝到linux上?cp
2.講一個(gè)image啟動(dòng)成一個(gè)container容器?run
3.運(yùn)行了容器怎么停止?kill/stop
4.怎么啟動(dòng)容器?start 怎么暫停?pause
5.logs:查看日志 inspect是干什么的?查看源數(shù)據(jù)
6.attach 進(jìn)入已經(jīng)啟動(dòng)的重端,而exec是啟動(dòng)一個(gè)新的終端
7.^p^q是以運(yùn)行的方式退出
8.port 控制端口
9.ps可以看到當(dāng)前所有的進(jìn)程信息
10,top查看進(jìn)程信息
port # 查看映射端口對(duì)應(yīng)的容器內(nèi)部源端口
pause # 暫停容器
ps # 獵戶容器列表
pull # 從docker鏡像源服務(wù)器拉取指定鏡像或者庫鏡像
push # 推送指定鏡像或者庫鏡像至docker源服務(wù)器
restart # 重啟運(yùn)行的容器
rm # 移除一個(gè)或多個(gè)容器
rmi # 移除一個(gè)或多個(gè)鏡像 (無容器使用該鏡像才可刪除,否則需要?jiǎng)h除相關(guān)容器才可繼續(xù)或 -f 強(qiáng)制刪除)
run # 創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令
save # 保存一個(gè)鏡像為一個(gè) tar 包【對(duì)應(yīng) load】
search # 在 docker hub 中搜索鏡像
start # 啟動(dòng)容器
stop # 停止容器
tag # 給源中鏡像打標(biāo)簽
top # 查看容器中運(yùn)行的進(jìn)程信息
unpause # 取消暫停容器
version # 查看 docker版本號(hào)
wait # 截取容器停止時(shí)的退出狀態(tài)值
練習(xí):下載nginx
端口暴露
[root@ecs-287241 home]# docker run -d --name ngimx01 -p 3344:80 nginx 303bb4275798c811290a237bde71456194ed41fe82fdc9b03fb72df87edb6fbc [root@ecs-287241 home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 303bb4275798 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp ngimx01 [root@ecs-287241 home]# curl localhost:3344 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> [root@ecs-287241 home]#
查找ngnix的位置 whereis
root@303bb4275798:/# whereis ngnix
ngnix:地址
root@303bb4275798:/#
思考問題:我們每次改動(dòng)nginx配置文件.都需要進(jìn)入容器內(nèi)部?
十分的麻煩,我要是可以在容器外部提供一個(gè)映射路徑 ,達(dá)到在容器修改文件名,容器內(nèi)部就可以自動(dòng)修改? -v 數(shù)據(jù)卷
作業(yè): docker來裝一個(gè)tomcat
#官方的使用
docker run -it --rm tomcat:9.0
#我們之前的啟動(dòng)都是后臺(tái),停止了容器之后,容器還是可以查到
docker run -it --rm. 一般用來測(cè)試,用完就刪除
?感謝大家觀看!
總結(jié)
以上是生活随笔為你收集整理的docker基础篇——万字解读小鲸鱼的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度输入法皮肤工具提示 CSS,百度手机
- 下一篇: 快播(QvodPlayer)最新版 v5