柚子快報(bào)激活碼778899分享:容器 docker入門教程
柚子快報(bào)激活碼778899分享:容器 docker入門教程
1.docker基礎(chǔ)命令
在我們學(xué)習(xí)具體的命令之前,我們先要注冊一個(gè)docker的賬號
https://www.docker.com/(進(jìn)入網(wǎng)址即可注冊)
鏡像倉庫命令
下面是使用實(shí)戰(zhàn)
docker login
關(guān)鍵參數(shù)
?
-u :
登陸的用戶名
?
-p :
登陸的密碼
docker pull
關(guān)鍵參數(shù)
?
-a :
拉取所有
tagged
鏡像
?
--disable-content-trust :
忽略鏡像的校驗(yàn)
,
默認(rèn)開啟
?
可以直接拉取對應(yīng)的名字+標(biāo)簽或者對應(yīng)的digest也可以。
docker push
?
-a :
推送所有
tagged
鏡像
?
--disable-content-trust :
忽略鏡像的校驗(yàn)
,
默認(rèn)開啟
(不過由于中國ip被墻了,暫時(shí)無法推送到docker的倉庫,后期可以改成阿里云或者私人倉庫)
docker search
關(guān)鍵參數(shù)
?
--no-trunc :
顯示完整的鏡像描述;
?
-f <
過濾條件
>:
列出收藏?cái)?shù)不小于指定值的鏡像。
#
從
Docker Hub
查找所有鏡像名包含
nginx
,并且
star
數(shù)大于
10
的鏡像
docker search -f stars=10 nginx
docker logout
docker logout即可登出倉庫
2.Docker Image(鏡像)
1.Docker 鏡像是什么
?
Docker image 本質(zhì)上是一個(gè)
read-only
只讀文件, 這個(gè)文件包含了文件系統(tǒng)、
源碼、庫文件、依賴、工具等一些運(yùn)行
application
所必須的文件。
?
我們可以把 Docker image
理解成一個(gè)模板, 可以通過這個(gè)模板實(shí)例化出來很多
容器。
?
image 里面是一層層文件系統(tǒng)
Union FS
。聯(lián)合文件系統(tǒng),可以將幾層目錄掛載到
一起,形成一個(gè)虛擬文件系統(tǒng)。
每一層文件系統(tǒng)我們叫做一層
layer
,聯(lián)合文件系統(tǒng)可以對每一層文件系統(tǒng)設(shè)置三
種權(quán)限,只讀(
readonly
)、讀寫(
readwrite
)和寫出(
whiteout-able
),但是
docker
鏡像中每一層文件系統(tǒng)都是只讀的。
構(gòu)建鏡像的時(shí)候,從一個(gè)最基本的操作系統(tǒng)開始,每個(gè)構(gòu)建的操作都相當(dāng)于做一層
的修改,增加了一層文件系統(tǒng)。一層層往上疊加,上層的修改會(huì)覆蓋底層該位置的可
見性,這也很容易理解,就像上層把底層遮住了一樣。當(dāng)你使用的時(shí)候,你只會(huì)看到
一個(gè)完全的整體,你不知道里面有幾層,也不清楚每一層所做的修改是什么。
2.為什么需要鏡像
在部署應(yīng)用時(shí),通過手工或?qū)懸恍┠_本的方式進(jìn)行部署。這樣部署面臨問題就是云端
和本地環(huán)境一致問題。用戶為每個(gè)應(yīng)用打包過程比較繁瑣,需要配置和給中修改等操
作,非常費(fèi)勁。
然而,
Docker
鏡像就是為了解決這個(gè)小小的
打包
功能,突然一夜之間成名。那么,你
可能說
Docker
鏡像就是個(gè)壓縮包,是的,你猜對了,它就像一個(gè)壓縮包文件。它是如
何解決
Paas
時(shí)代所面臨的云端和本地一致性問題?很簡單,它是把一個(gè)鏡像制作成
一個(gè)完整的操作系統(tǒng)所有文件和對應(yīng)的目錄結(jié)構(gòu),這樣的壓縮包是跟你本地和測試環(huán)
境用的操作系統(tǒng)一摸一樣。
docker
最大的貢獻(xiàn)就是定義了容器鏡像的分層的存儲(chǔ)格式
,
docker
鏡像技術(shù)的基礎(chǔ)
是聯(lián)合文件系統(tǒng)
(UnionFS)
,其文件系統(tǒng)是分層的。這樣既可以充分利用共享層,又可
以減少存儲(chǔ)空間占用。
docker
鏡像提供了一種打包應(yīng)用程序和預(yù)配置服務(wù)器環(huán)境的便捷方式,可以很方便的
將其用于個(gè)人用途或與其他
Docker
用戶公開
共享
。
刪除本地鏡像
鏡像命令[部分]
1.docker images
關(guān)鍵參數(shù)
?
-a :
列出本地所有的鏡像(含中間映像層,默認(rèn)情況下,過濾掉中間映像層);
?
--digests :
顯示鏡像的摘要信息;
?
-f :
顯示滿足條件的鏡像;
?
--format :
指定返回值的模板文件;
?
--no-trunc :
顯示完整的鏡像信息;
?
-q :
只顯示鏡像
ID
。
2.docker image inspect
查看鏡像詳細(xì)信息
3. docker tag
4.docker rmi
?
-f :
強(qiáng)制刪除;
?
--no-prune :
不移除該鏡像的過程鏡像,默認(rèn)移除;
5.docker save
?
-o :
輸出到的文件。
6.docker load
?
--input , -i :
指定導(dǎo)入的文件,代替
STDIN
。
?
--quiet , -q :
精簡輸出信息
7.docker history
?
-H , --human :
大小和日期采用人容易讀的格式展現(xiàn)
?
--no-trunc :
顯示全部信息,不要隔斷;
?
-q, --quiet:
只顯示鏡像
id
信息;
8.docker image prune
刪除不使用的鏡像。
?
-a , --all :
刪除全部不使用的鏡像;
?
--filter filter:
指定過濾條件;
?
-f, --force :
不提示是否刪除;
3.容器
什么是容器?
通俗地講,容器是鏡像的運(yùn)行實(shí)體。鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時(shí)需要
的可寫文件層,并且容器中的進(jìn)程屬于運(yùn)行狀態(tài)。即容器運(yùn)行著真正的應(yīng)用進(jìn)程。容
器有初建、運(yùn)行、停止、暫停和刪除五種狀態(tài)。
雖然容器的本質(zhì)是主機(jī)上運(yùn)行的一個(gè)進(jìn)程,但是容器有自己獨(dú)立的命名空間隔離和資
源限制。也就是說,在容器內(nèi)部,無法看到主機(jī)上的進(jìn)程、環(huán)境變量、網(wǎng)絡(luò)等信息,
這是容器與直接運(yùn)行在主機(jī)上進(jìn)程的本質(zhì)區(qū)別。
容器是基于鏡像創(chuàng)建的可運(yùn)行實(shí)例,并且單獨(dú)存在,一個(gè)鏡像可以創(chuàng)建出多個(gè)容器。
運(yùn)行容器化環(huán)境時(shí),實(shí)際上是在容器內(nèi)部創(chuàng)建該文件系統(tǒng)的讀寫副本。 這將添加一個(gè)
容器層,該層允許修改鏡像的整個(gè)副本
為什么需要容器?
鏡像是靜態(tài)的文件,并不能提供服務(wù),就像我拿了個(gè)
Linux
或者
Windows
的光盤一樣,
只有安裝到主機(jī)里面運(yùn)行起來才能對外提供服務(wù),我們才能使用。
容器帶來哪些收益呢,參考我們之前講解的為什么要虛擬化、容器化。
容器的生命周期
容器的生命周期是容器可能處于的狀態(tài)。
1.
created
:初建狀態(tài)
2.
running
:運(yùn)行狀態(tài)
3.
stopped
:停止?fàn)顟B(tài)
4.
paused
: 暫停狀態(tài)
5.
deleted
:刪除狀態(tài)
各生命周期之間的轉(zhuǎn)換關(guān)系如圖所示:
容器 OOM
Docker
在處理
OOM
事件時(shí)分為三種情況
1
)如果容器中的應(yīng)用耗盡了主機(jī)系統(tǒng)分配給容器的內(nèi)存限額,就會(huì)觸發(fā)
OOM
事件。
例如,在容器當(dāng)中,部署了一個(gè)
web
服務(wù)。假設(shè)主機(jī)分配給此容器的內(nèi)存上限為
1G
,
當(dāng)腳本申請的內(nèi)存大于
1G
時(shí),此容器就會(huì)觸發(fā)
OOM
事件。而在這種情況下,此容
器將會(huì)被強(qiáng)制關(guān)閉。
但需要注意的是,此時(shí)關(guān)閉容器的并非是
Docker Daemon
,而是宿主機(jī)操作系統(tǒng)。因
為一個(gè)容器其實(shí)就是一組運(yùn)行在宿主機(jī)操作系統(tǒng)當(dāng)中的進(jìn)程,宿主機(jī)操作系統(tǒng)通過
cgroups
對這組進(jìn)程設(shè)定資源上限,當(dāng)這些進(jìn)程申請的資源到達(dá)上限時(shí),觸發(fā)的是宿
主機(jī)操作系統(tǒng)的內(nèi)核
OOM
事件,因此最終是由宿主機(jī)內(nèi)核來關(guān)閉這些進(jìn)程
.
(2)
如果用戶不想關(guān)閉這個(gè)容器,那么可以選擇
--oom-kill-disable
來禁用
OOM-Killer
。
使用此參數(shù)時(shí),仍需要注意,如果使用
-m
設(shè)置了此容器內(nèi)存上限,那么當(dāng)容器到達(dá)內(nèi)
存資源上限時(shí),主機(jī)不會(huì)關(guān)閉容器,但也不會(huì)繼續(xù)向此容器繼續(xù)分配資源,此時(shí)容器
將處于
hung
狀態(tài)。只需要將最壞的情況封閉在一定范圍之內(nèi),而不至于蔓延出去。
(3)
如果用戶使用了
--oom-kill-disable
,但也沒有使用
-m
來設(shè)定上限,因而此時(shí)此容器
將會(huì)盡可能多地使用主機(jī)內(nèi)存資源。換言之,主機(jī)內(nèi)存有多大,它就將用多大。
容器異常退出
每個(gè)容器內(nèi)部都存在一個(gè)
Init
進(jìn)程,容器中其他所有進(jìn)程都是此進(jìn)程的子進(jìn)程。運(yùn)行
的容器是因?yàn)?/p>
Init
進(jìn)程在運(yùn)行,如果一個(gè)子進(jìn)程因?yàn)槟撤N原因造成了退出,那么其父
進(jìn)程也會(huì)同步退出,直至
Init
進(jìn)程也退出。當(dāng)
Init
進(jìn)程退出時(shí),也就代表著此容器被關(guān)
閉。
ocker
目前沒有辦法知道此時(shí)的進(jìn)程退出屬于正常退出還是異常退出。當(dāng)出現(xiàn)容器
關(guān)閉情況時(shí),
Docker Daemon
會(huì)嘗試再次重新將此容器由
Stopped
狀態(tài)轉(zhuǎn)為
Running
狀態(tài)。只有設(shè)置了
--restart
參數(shù)的容器,
Docker Daemon
才會(huì)去嘗試啟動(dòng),否則容器
會(huì)保持停止?fàn)顟B(tài)。
容器暫停
Docker“
剝奪
”
了此容器的
CPU
資源。而其他資源,如
Memory
資源、
Network
資源
等還保留未動(dòng)。如此一來,失去了
CPU
資源的進(jìn)程,是不會(huì)被主機(jī)內(nèi)核系統(tǒng)所調(diào)度的,
所以此容器就處于
“
冰封
”
狀態(tài)。
容器命令[部分]
1. docker run
功能
創(chuàng)建一個(gè)新的容器并運(yùn)行一個(gè)命令
關(guān)鍵參數(shù)
?
-d:
后臺(tái)運(yùn)行容器,并返回容器
ID
;
?
-i:
以交互模式運(yùn)行容器,通常與
-t
同時(shí)使用;
?
-P:
隨機(jī)端口映射,容器內(nèi)部端口
隨機(jī)
映射到主機(jī)的端口
?
-p:
指定端口映射,格式為:
主機(jī)
(
宿主
)
端口
:
容器端口
?
-t:
為容器重新分配一個(gè)偽輸入終端,通常與
-i
同時(shí)使用;
?
--name="nginx-lb":
為容器指定一個(gè)名稱;
?
-h "mars":
指定容器的
hostname
;
?
-e username="ritchie":
設(shè)置環(huán)境變量;
?
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2":
綁定容器到指定
CPU
運(yùn)行;
?
-m :
設(shè)置容器使用內(nèi)存最大值;
?
--network="bridge":
指定容器的網(wǎng)絡(luò)連接類型;
?
--link=[]:
添加鏈接到另一個(gè)容器;
?
--volume , -v:
綁定一個(gè)卷
?
--rm
:shell
退出的時(shí)候自動(dòng)刪除容器
我們先先拉一個(gè)centos:7下來,然后運(yùn)行這個(gè)容器。
映射端口的使用
其余的大家可以自己嘗試,不過多贅述
2.docker ps
關(guān)鍵參數(shù)
?
-a :
顯示所有的容器,包括未運(yùn)行的。
?
-f :
根據(jù)條件過濾顯示的內(nèi)容。
?
--format :
指定返回值的模板文件。如
json
或者
table
?
-l :
顯示
latest
的容器。
?
-n :
列出最近創(chuàng)建的
n
個(gè)容器。
?
--no-trunc :
不截?cái)噍敵觥?/p>
?
-q :
靜默模式,只顯示容器編號。
?
-s :
顯示總的文件大小。
3.docker create?
創(chuàng)建一個(gè)新的容器但不啟動(dòng)它
? -i: 以交互模式運(yùn)行容器,通常與 -t 同時(shí)使用;
?
-P:
隨機(jī)端口映射,容器內(nèi)部端口
隨機(jī)
映射到主機(jī)的端口
?
-p:
指定端口映射,格式為:
主機(jī)
(
宿主
)
端口
:
容器端口
?
-t:
為容器重新分配一個(gè)偽輸入終端,通常與
-i
同時(shí)使用;
?
--name="nginx-lb":
為容器指定一個(gè)名稱;
?
-h "mars":
指定容器的
hostname
;
?
-e username="ritchie":
設(shè)置環(huán)境變量;
?
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2":
綁定容器到指定
CPU
運(yùn)行;
?
-m :
設(shè)置容器使用內(nèi)存最大值;
?
--network="bridge":
指定容器的網(wǎng)絡(luò)連接類型;
?
--link=[]:
添加鏈接到另一個(gè)容器;
?
--volume , -v:
綁定一個(gè)卷
?
--rm
:shell
退出的時(shí)候自動(dòng)刪除容器
?
--restart
:
自動(dòng)重啟
與docker run幾乎一樣,只是少一個(gè)-d選項(xiàng)。
4.docker logs
?
-f ,--follow:
跟蹤日志輸出
?
--since :
顯示某個(gè)開始時(shí)間的所有日志
?
-t,--timestamps :
顯示時(shí)間戳
?
-n
,
--tail :
僅列出最新
N
條容器日志
.
5. docker attach
連接到正在運(yùn)行中的容器
? --sig-proxy:是否將所有信號代理,默認(rèn)是 true,如果設(shè)置為 false,退出的 話不會(huì)影響容器,否則退出會(huì)導(dǎo)致容器退出。
6. docker exec
在容器中執(zhí)行命令
?
-d :
分離模式
:
在后臺(tái)運(yùn)行
?
-i :
即使沒有附加也保持
STDIN
打開
?
-t :
分配一個(gè)偽終端
?
-e :
設(shè)置環(huán)境變量
?
-u,--user :
指定用戶
"
?
-w,--workdir:
指定工作目錄
(通常使用-it配合bash命令,進(jìn)入容器進(jìn)行操作)
7. docker start
8. docker stop
-s 發(fā)送SIGTERM信號
9.?docker kill
-s發(fā)送SIGKILL信號
Docker stop 發(fā)送的是 SIGTERM 信號,docker kill 發(fā)送的是 SIGKILL 信號
10. docker restart
11. docker top
容器運(yùn)行時(shí)不一定有
/bin/bash
終端來交互執(zhí)行
top
命令,而且容器還不一定有
top
命令,可以使用
docker top
來實(shí)現(xiàn)查看
container
中正在運(yùn)行的進(jìn)程。
12. docker stats
?
--all , -a :
顯示所有的容器,包括未運(yùn)行的。
?
--format :
指定返回值的模板文件。如
table,json
?
--no-stream :
展示當(dāng)前狀態(tài)就直接退出了,不再實(shí)時(shí)更新。
?
--no-trunc :
不截?cái)噍敵觥?/p>
返回報(bào)文
CONTAINER ID
與
NAME:
容器
ID
與名稱。
CPU %
與
MEM %:
容器使用的
CPU
和內(nèi)存的百分比。
MEM USAGE / LIMIT:
容器正在使用的總內(nèi)存,以及允許使用的內(nèi)存總量。
NET I/O:
容器通過其網(wǎng)絡(luò)接口發(fā)送和接收的數(shù)據(jù)量。
BLOCK I/O:
容器從主機(jī)上的塊設(shè)備讀取和寫入的數(shù)據(jù)量。
PIDs:
容器創(chuàng)建的進(jìn)程或線程數(shù)。
13. docker container inspect
?
-f :
指定返回值的模板文件。如
table
、
json
?
-s :
顯示總的文件大小。
14. docker port
用于列出指定的容器的端口映射,或者查找將
PRIVATE_PORT NAT
到面向公眾
的端口。
15. docker cp
在容器和宿主機(jī)之間拷貝文件
16. docker diff
檢查容器里文件結(jié)構(gòu)的更改
17. docker commit
從容器創(chuàng)建一個(gè)新的鏡像。
?
-a :
提交的鏡像作者;
?
-c :
使用
Dockerfile
指令來創(chuàng)建鏡像;可以修改啟動(dòng)指令
?
-m :
提交時(shí)的說明文字;
?
-p :
在
commit
時(shí),將容器暫停。
18.docker pause
暫停容器中所有的進(jìn)程。
19. docker unpause
恢復(fù)容器中所有的進(jìn)程。
20. docker rm
? -f :通過 SIGKILL 信號強(qiáng)制刪除一個(gè)運(yùn)行中的容器。
21. docker export/import
? -o:寫入到文件。
?
-c :
應(yīng)用
docker
指令創(chuàng)建鏡像;
?
-m :
提交時(shí)的說明文字
22. docker wait
阻塞運(yùn)行直到容器停止,然后打印出它的退出代碼。
23. docker rename
重命名容器
24. docker container prune
? -f, --force:不提示是否進(jìn)行確認(rèn)
25. docker update.
更新容器配置
? --cpus:cpu 數(shù)量
?
--cpuset-cpus :
使用哪些
cpu
?
--memory :
內(nèi)存限制
?
--memory-swap
:交換內(nèi)存
?
--cpu-period
:
是用來指定容器對
CPU
的使用要在多長時(shí)間內(nèi)做一次重新分
配
?
--cpu-quota
:
是用來指定在這個(gè)周期內(nèi),最多可以有多少時(shí)間用來跑這個(gè)容
器
總結(jié)
常見問題
docker create
、
docker start
和
docker run
有什么區(qū)別?
docker create
命令從
Docker
映像創(chuàng)建一個(gè)全新的容器。但是,它不會(huì)立即運(yùn)行它。
docker start
命令將啟動(dòng)任何已停止的容器。如果使用
docker create
命令創(chuàng)建容器,
則可以使用此命令啟動(dòng)它。
docker run
命令是創(chuàng)建和啟動(dòng)的組合,因?yàn)樗鼊?chuàng)建了一個(gè)新容器并立即啟動(dòng)它。實(shí)際
上,如果
docker run
命令在您的系統(tǒng)上找不到上述映像,它可以從
Docker Hub
中提
取映像。
docker import
和
docker load
有什么區(qū)別?
想要了解
docker load
與
docker import
命令的區(qū)別,還必須知道
docker save
與
docker export
命令:
?
docker save images_name
:將一個(gè)鏡像導(dǎo)出為文件,再使用
docker load
命
令將文件導(dǎo)入為一個(gè)鏡像,會(huì)保存該鏡像的的所有歷史記錄。比
docker export
命令
導(dǎo)出的文件大,很好理解,因?yàn)闀?huì)保存鏡像的所有歷史記錄。
?
docker export container_id
:將一個(gè)容器導(dǎo)出為文件,再使用
docker
import
命令將容器導(dǎo)入成為一個(gè)新的鏡像,但是相比
docker save
命令,容器文件
會(huì)丟失所有元數(shù)據(jù)和歷史記錄,僅保存容器當(dāng)時(shí)的狀態(tài),相當(dāng)于虛擬機(jī)快照。
既可以使用
docker load
命令來導(dǎo)入鏡像庫存儲(chǔ)文件到本地鏡像庫,也可以使用
docker import
命令來導(dǎo)入一個(gè)容器快照到本地鏡像庫。
兩者的區(qū)別在于容器快照將會(huì)丟棄所有的歷史記錄和元數(shù)據(jù)信息,而鏡像存儲(chǔ)文件將
保存完整記錄,體積也會(huì)更大。
docker rm & docker rmi & docker prune
的差異?
docker rm
: 刪除一個(gè)或多個(gè)容器
docker rmi :
刪除一個(gè)或多個(gè)鏡像
docker prune
: 用來刪除不再使用的
docker
對象
Docker Volume(存儲(chǔ)卷)
什么是存儲(chǔ)卷?
存儲(chǔ)卷就是將宿主機(jī)的本地文件系統(tǒng)中存在的某個(gè)目錄直接與容器內(nèi)部的文件系統(tǒng)上
的某一目錄建立綁定關(guān)系。這就意味著,當(dāng)我們在容器中的這個(gè)目錄下寫入數(shù)據(jù)時(shí),
容器會(huì)將其內(nèi)容直接寫入到宿主機(jī)上與此容器建立了綁定關(guān)系的目錄。
在宿主機(jī)上的這個(gè)與容器形成綁定關(guān)系的目錄被稱作存儲(chǔ)卷。卷的本質(zhì)是文件或者目
錄,它可以繞過默認(rèn)的聯(lián)合文件系統(tǒng),直接以文件或目錄的形式存在于宿主機(jī)上。
宿主機(jī)的
/data/web
目錄與容器中的
/container/data/web
目錄綁定關(guān)系,然后容器中的
進(jìn)程向這個(gè)目錄中寫數(shù)據(jù)時(shí),是直接寫在宿主機(jī)的目錄上的,繞過容器文件系統(tǒng)與宿
主機(jī)的文件系統(tǒng)建立關(guān)聯(lián)關(guān)系,使得
可以在宿主機(jī)和容器內(nèi)共享數(shù)據(jù)庫內(nèi)容
,讓容器
直接訪問宿主機(jī)中的內(nèi)容,也可以宿主機(jī)向容器寫入內(nèi)容,
容器和宿主機(jī)的數(shù)據(jù)讀寫
是同步的
為什么需要存儲(chǔ)卷?
1.
數(shù)據(jù)丟失問題
容器按照業(yè)務(wù)類型,總體可以分為兩類:
?
無狀態(tài)的(數(shù)據(jù)不需要被持久化)
?
有狀態(tài)的(數(shù)據(jù)需要被持久化)
顯然,容器更擅長無狀態(tài)應(yīng)用。因?yàn)槲闯志没瘮?shù)據(jù)的容器根目錄的生命周期與容器的
生命周期一樣,容器文件系統(tǒng)的本質(zhì)是在鏡像層上面創(chuàng)建的讀寫層,運(yùn)行中的容器對
任何文件的修改都存在于該讀寫層,當(dāng)容器被刪除時(shí),容器中的讀寫層也會(huì)隨之消失。
雖然容器希望所有的業(yè)務(wù)都盡量保持無狀態(tài),這樣容器就可以開箱即用,并且可以任
意調(diào)度,但實(shí)際業(yè)務(wù)總是有各種需要數(shù)據(jù)持久化的場景,比如
MySQL
、
Kafka
等有狀
態(tài)的業(yè)務(wù)。因此為了解決有狀態(tài)業(yè)務(wù)的需求,
Docker
提出了卷(
Volume
)的概念。
2.
性能問題
UnionFS
對于修改刪除等,一般效率非常低,如果對一于
I/O
要求比較高的應(yīng)用,如
redis
在實(shí)現(xiàn)持化存儲(chǔ)時(shí),是在底層存儲(chǔ)時(shí)的性能要求比較高。
3.
宿主機(jī)和容器互訪不方便
宿主機(jī)訪問容器,或者容器訪問要通過
docker cp
來完成,應(yīng)用很難操作
4.
容器和容器共享不方便
存儲(chǔ)卷分類
目前
Docker
提供了三種方式將數(shù)據(jù)從宿主機(jī)掛載到容器中
?
volume docker
管理卷
,默認(rèn)映射到宿主機(jī)的
/var/lib/docker/volumes
目錄
下,
只需要在容器內(nèi)指定容器的掛載點(diǎn)
是什么,而被綁定宿主機(jī)下的那個(gè)目錄,是
由
容器引擎
daemon
自行創(chuàng)建一個(gè)空的目錄
,或者使用一個(gè)已經(jīng)存在的目錄,與存儲(chǔ)卷
建立存儲(chǔ)關(guān)系,這種方式極大解脫用戶在使用卷時(shí)的耦合關(guān)系,缺陷是用戶無法指定
那些使用目錄,臨時(shí)存儲(chǔ)比較適合
;
?
bind mount 綁定數(shù)據(jù)卷
,映射到宿主機(jī)指定路徑下,在
宿主機(jī)上
的路徑要人工的
指定一個(gè)特定的路徑
,
在容器中也需要指定一個(gè)特定的路徑
,
兩個(gè)已知的路徑建立關(guān)
聯(lián)關(guān)系
?
tmpfs mount 臨時(shí)數(shù)據(jù)卷
,映射到于宿主機(jī)內(nèi)存中,一旦容器停止運(yùn)行,
tmpfs
mounts
會(huì)被移除,數(shù)據(jù)就會(huì)丟失,用于高性能的臨時(shí)數(shù)據(jù)存儲(chǔ)。
管理卷 Volume
創(chuàng)建卷
存儲(chǔ)卷可以通過命令方式創(chuàng)建,也可以在創(chuàng)建容器的時(shí)候通過
-v
and
--mount
指定。
方式一:Volume 命令操作
docker volume create
?
功能
?
創(chuàng)建存儲(chǔ)卷
?
-d, --driver
:
指定驅(qū)動(dòng),默認(rèn)是
local
?
--label
:
指定元數(shù)據(jù)
創(chuàng)建匿名卷
創(chuàng)建命名卷
docker volume inspect
查看卷詳細(xì)信息
?
關(guān)鍵參數(shù)
?
-f
:
指定相應(yīng)個(gè)格式,如
json
docker volume ls
?
功能
?
列出卷
關(guān)鍵參數(shù)
?
--format
:
指定相應(yīng)個(gè)格式,如
json,table
?
--filter,-f:
過濾
?
-q:
僅顯示名稱
docker volume rm
?
功能
?
刪除卷,需要容器不使用。
?
關(guān)鍵參數(shù)
?
-f,--force:
強(qiáng)制刪除
docker volume prune
? 功能
?
刪除不使用的本地卷
?
關(guān)鍵參數(shù)
?
--filter:
過濾
?
-f, --force
:
不提示是否刪除
方式二:-v 或者--mount 指定
-v
和
-mount
都可以完成管理卷的創(chuàng)建
-v 參數(shù)
?
功能:
完成目錄映射
docker run
-v name:directory[:options]
?
參數(shù)
?
第一個(gè)參數(shù):卷名稱
?
第二個(gè)參數(shù):卷映射到容器的目錄
?
第三個(gè)參數(shù):選項(xiàng),如
ro
表示
readonly
--mount 參數(shù)
?
功能:
完成目錄映射
?
關(guān)鍵參數(shù)
?
type
: 類型表示
bind
,
volume
, or
tmpfs
?
source
,
src
:對于命名卷,這是卷的名稱。對于匿名卷,省略此字段。
?
destination
,
dst,target
:文件或目錄掛載在容器中的路徑
?
ro,readonly:
只讀方式掛載
方式三:Dockerfile 匿名卷
通過
Dockerfile
的
VOLUME
可以創(chuàng)建
docker
管理卷。這個(gè)我們后續(xù)在
Dockerfile
中詳細(xì)講解。
我們也可以通過
dockerfile
的
VOLUME
指令在鏡像中創(chuàng)建
Data Volume
,這樣只要
通過該鏡像創(chuàng)建的容器都會(huì)存在掛載點(diǎn),但值得注意的是通過
VOLUME
指令創(chuàng)建的掛
載點(diǎn),無法指定主機(jī)上對應(yīng)的目錄,而是由
docker
隨機(jī)生成的
綁定卷 bind mount
-v
和
-mount
都可以完成綁定卷的創(chuàng)建
創(chuàng)建卷
-v 參數(shù)創(chuàng)建卷
?
功能:
完成卷映射
參數(shù)
?
第一個(gè)參數(shù):
宿主機(jī)目錄,這個(gè)和管理卷是不一樣的
?
第二個(gè)參數(shù):卷映射到容器的目錄
?
第三個(gè)參數(shù):選項(xiàng),如
ro
表示
readonly
--mount 參數(shù)創(chuàng)建綁定卷
?
關(guān)鍵參數(shù)
?
type
: 類型表示
bind
,
volume
, or
tmpfs
?
source
,
src
:
宿主機(jī)目錄,這個(gè)和管理卷是不一樣的
。
?
destination
,
dst,target
:文件或目錄掛載在容器中的路徑
?
ro,readonly:
只讀方式掛載
臨時(shí)卷 tmpfs
臨時(shí)卷數(shù)據(jù)位于內(nèi)存中,在容器和宿主機(jī)之外。
tmpfs 局限性
?
不同于卷和綁定掛載,不能在容器之間共享 tmpfs
掛載。
?
這個(gè)功能只有在 Linux
上運(yùn)行
Docker
時(shí)才可用
創(chuàng)建卷
方式一:指定--tmpfs 創(chuàng)建
?
功能:
完成臨時(shí)卷映射
方式二:--mount 指定參數(shù)創(chuàng)建
?
功能
完成目錄映射
?
關(guān)鍵參數(shù)
?
type
: 類型表示
bind
,
volume
, or
tmpfs
?
destination
,
dst,target
:掛載在容器中的路徑
?
tmpfs-size
:
tmpfs
掛載的大?。ㄒ宰止?jié)為單位)。默認(rèn)無限制。
?
tmpfs-mode
:
tmpfs
的八進(jìn)制文件模式。例如,
700
或
0770
。默認(rèn)為
1777
或全局可寫。
總結(jié)
常見問題
1.
什么時(shí)候用
Volume
,什么時(shí)候用
bind
、
tmpfs
?
volume
:
volume
是
docker
的宿主機(jī)文件系統(tǒng)一部分,用于不需要規(guī)劃具體目錄的場
景
bind
:
bind mount
完全是依賴于主機(jī)的目錄結(jié)構(gòu)和操作系統(tǒng),用于目錄需要提前規(guī)劃,
比如
mysql
的目錄需要個(gè)空間大的,其他服務(wù)有不占用的時(shí)候,用
volume
就不太合
適了
tmpfs
:用于敏感文件存儲(chǔ),文件不想存儲(chǔ)的宿主機(jī)和容器的可寫層之中
擴(kuò)展思考:存儲(chǔ)卷在實(shí)際研發(fā)中帶來了哪些問題
1.
跨主機(jī)使用
docker
存儲(chǔ)卷是使用其所在的宿主機(jī)上的本地文件系統(tǒng)目錄,也就是宿主機(jī)有一塊磁
盤,這塊磁盤并沒有共享給其他的
docker
主機(jī),容器在這宿主機(jī)上停止或刪除,是可
以重新再創(chuàng)建的,但是不能調(diào)度到其他的主機(jī)上,這也是
docker
本身沒有解決的問題,
所以
docker
存儲(chǔ)卷默認(rèn)就是
docker
所在主機(jī)的本地,但是自己搭建一個(gè)共享的
NFS
來存儲(chǔ)
docker
存儲(chǔ)的數(shù)據(jù),也可以實(shí)現(xiàn),
但是這個(gè)過程強(qiáng)依賴于運(yùn)維人員的能力
。
所以未來應(yīng)用的存儲(chǔ)和數(shù)據(jù)往往分離,越來越多的分布式存儲(chǔ)方案出現(xiàn),如
s3
系列,
nfs
等。
2.
啟動(dòng)參數(shù)未知
容器有一個(gè)問題,一般與進(jìn)程的啟動(dòng)不太一樣,就是容器啟動(dòng)時(shí)選項(xiàng)比較多,如果下
次再啟動(dòng)時(shí),很容器會(huì)忘記它啟動(dòng)時(shí)的選項(xiàng),所以最好有一個(gè)文件來保存容器的啟動(dòng),
這就是容器編排工具的作用。
一般情況下,是使用命令來啟動(dòng)操作
docker,
但是可以通過文件來讀,也就讀文件來啟
動(dòng),讀所需要的存儲(chǔ)卷等,但是它也只是操作一個(gè)容器,如果要幾十上百個(gè)容器操作,
就需要
專業(yè)的容器編排工具
這種一般像開源的
k8s
,各個(gè)云廠商也有自己的企業(yè)版編排軟件。
3.
復(fù)雜場景仍然需要運(yùn)維
對于有狀態(tài)要持久的集群化組件,如
mysql
的主從。部署維護(hù)一個(gè)
Mysql
主從需要運(yùn)
維知識(shí)、經(jīng)驗(yàn)整合進(jìn)去才能實(shí)現(xiàn)所謂的部署,擴(kuò)展或縮容,出現(xiàn)問題后修復(fù),必須要
了解集群的規(guī)模有多大,有多少個(gè)主節(jié)點(diǎn),有多少個(gè)從節(jié)點(diǎn),主節(jié)點(diǎn)上有多少個(gè)庫,
這些都要一清二楚,才能修復(fù)故障,這些就
強(qiáng)依賴于運(yùn)維經(jīng)驗(yàn)
這種復(fù)雜的場景往往還是需要人力,很難有完美的工具出現(xiàn)。
Docker Network(網(wǎng)絡(luò))
Docker 為什么需要網(wǎng)絡(luò)管理
容器的網(wǎng)絡(luò)默認(rèn)與宿主機(jī)及其他容器都是相互隔離, 但同時(shí)我們也要考慮下面的一些
問題, 比如
?
多個(gè)容器之間是如何通信的
?
容器和宿主機(jī)是如何通信的
?
容器和外界主機(jī)是如何通信的
?
容器中要運(yùn)行一些網(wǎng)絡(luò)應(yīng)用(
如
nginx
、
web
應(yīng)用、數(shù)據(jù)庫等
)
,如果要讓外部也可
以訪問這些容器內(nèi)運(yùn)行的網(wǎng)絡(luò)應(yīng)用應(yīng)該如何實(shí)現(xiàn)
?
容器不想讓它的網(wǎng)絡(luò)與宿主機(jī)、與其他容器隔離應(yīng)該如何實(shí)現(xiàn)
?
容器根本不需要網(wǎng)絡(luò)的時(shí)候應(yīng)該如何實(shí)現(xiàn)
?
容器需要更高的定制化網(wǎng)絡(luò)(如定制特殊的集群網(wǎng)絡(luò)、定制容器間的局域網(wǎng))應(yīng)
該如何實(shí)現(xiàn)
?
上述的這些問題都需要我們對容器的網(wǎng)絡(luò)進(jìn)行合理的管理才能解決,這就體現(xiàn)出了容
器網(wǎng)絡(luò)管理的重要性。
Docker 網(wǎng)絡(luò)架構(gòu)簡介
Docker
容器網(wǎng)絡(luò)是為應(yīng)用程序所創(chuàng)造的虛擬環(huán)境的一部分,它能讓應(yīng)用從宿主機(jī)操作
系統(tǒng)的網(wǎng)絡(luò)環(huán)境中獨(dú)立出來,形成容器自有的網(wǎng)絡(luò)設(shè)備、
IP
協(xié)議棧、端口套接字、
IP
路由表、防火墻等等與網(wǎng)絡(luò)相關(guān)的模塊。
Docker
為實(shí)現(xiàn)容器網(wǎng)絡(luò),主要采用的架構(gòu)由三部分組成:
CNM
、
Libnetwork
和驅(qū)動(dòng)。
CNM
Docker
網(wǎng)絡(luò)架構(gòu)采用的設(shè)計(jì)規(guī)范是
CNM
(
Container Network Model
)。
CNM
中規(guī)定
了
Docker
網(wǎng)絡(luò)的基礎(chǔ)組成要素:
Sandbox
、
Endpoint
、
Network
。
?
Sandbox:提供了容器的虛擬網(wǎng)絡(luò)棧,也即端口、套接字、
IP
路由表、防火墻、
DNS
配置等內(nèi)容。主要用于隔離容器網(wǎng)絡(luò)與宿主機(jī)網(wǎng)絡(luò),形成了完全獨(dú)立的容器網(wǎng)絡(luò)
環(huán)境。
?
Network:
Docker
內(nèi)部的虛擬子網(wǎng),使得網(wǎng)絡(luò)內(nèi)的參與者能夠進(jìn)行通訊。
?
Endpoint:就是虛擬網(wǎng)絡(luò)的接口,就像普通網(wǎng)絡(luò)接口一樣,
Endpoint
的主要職責(zé)
是負(fù)責(zé)創(chuàng)建連接。
Endpoint
類似于常見的網(wǎng)絡(luò)適配器,那也就意味著一個(gè)
Endpoint
只
能接入某一個(gè)網(wǎng)絡(luò), 當(dāng)容器需要接入到多個(gè)網(wǎng)絡(luò),就需要多個(gè)
Endpoint
。
如上圖所示,容器
B
有兩個(gè)
Endpoint
并且分別接入
Networkd A
和
Network B
。那么
容器
A
和容器
B
之間是可以實(shí)現(xiàn)通信的,因?yàn)槎冀尤肓?/p>
NetworkA
。但是容器
A
和容
器
C
不可以通過容器
B
的兩個(gè)
Endpoint
通信。
Libnetwork
Libnetwork
是
CNM
的一個(gè)標(biāo)準(zhǔn)實(shí)現(xiàn)。
Libnetwork
是開源庫,采用
Go
語言編寫(跨
平臺(tái)的),也是
Docker
所使用的庫,
Docker
網(wǎng)絡(luò)架構(gòu)的核心代碼都在這個(gè)庫中。
Libnetwork
實(shí)現(xiàn)了
CNM
中定義的全部三個(gè)組件,此外它還實(shí)現(xiàn)了本地服務(wù)發(fā)現(xiàn)、基
于
Ingress
的容器負(fù)載均衡,以及網(wǎng)絡(luò)控制層和管理層等功能。
驅(qū)動(dòng)
驅(qū)動(dòng)主要負(fù)責(zé)實(shí)現(xiàn)數(shù)據(jù)層相關(guān)內(nèi)容,例如網(wǎng)絡(luò)的連通性和隔離性是由驅(qū)動(dòng)來處理的。
驅(qū)動(dòng)通過實(shí)現(xiàn)特定網(wǎng)絡(luò)類型的方式擴(kuò)展了
Docker
網(wǎng)絡(luò)棧,例如橋接網(wǎng)絡(luò)和覆蓋網(wǎng)絡(luò)。
Docker
內(nèi)置了若干驅(qū)動(dòng),通常被稱作原生驅(qū)動(dòng)或者本地驅(qū)動(dòng)。例如
Bridge Driver
、
Host Driver
、
Overlay Driver
、
MacVLan Driver
、
IPVLan Driver
、
None Driver
等
等。每個(gè)驅(qū)動(dòng)負(fù)責(zé)創(chuàng)建其上所有網(wǎng)絡(luò)資源的創(chuàng)建和管理。
常見網(wǎng)絡(luò)類型
1. bridge 網(wǎng)絡(luò)
bridge
驅(qū)動(dòng)會(huì)在
Docker
管理的主機(jī)上創(chuàng)建一個(gè)
Linux
網(wǎng)橋。默認(rèn)情況下,網(wǎng)橋上
的容器可以相互通信。也可以通過
bridge
驅(qū)動(dòng)程序配置,實(shí)現(xiàn)對外部容器的訪問。
Docker
容器的默認(rèn)網(wǎng)絡(luò)驅(qū)動(dòng)
.
當(dāng)我們需要多個(gè)容器在同一個(gè)
Docker
主機(jī)上通信時(shí),橋
接網(wǎng)絡(luò)是最佳選擇。
2. host 網(wǎng)絡(luò)
對于獨(dú)立容器,移除容器和
Docker
主機(jī)之間的網(wǎng)絡(luò)隔離,并直接使用主機(jī)的網(wǎng)絡(luò)。
當(dāng)網(wǎng)絡(luò)堆棧不應(yīng)該與
Docker
主機(jī)隔離,但是希望容器的其他資源被隔離時(shí),主機(jī)網(wǎng)絡(luò)
是最佳選擇。
3. container 網(wǎng)絡(luò)
這個(gè)模式指定新創(chuàng)建的容器和引進(jìn)存在的一個(gè)容器共享一個(gè)網(wǎng)絡(luò) ,而不是和宿主
機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的
ip
,而是和一個(gè)指定的容器
共享
ip
,端口等,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離
的。兩個(gè)容器的進(jìn)程可以通過
lo
網(wǎng)卡設(shè)備通信
4. none 網(wǎng)絡(luò)
Docker
容器擁有自己的
Network Namespace
,但是,并不為
Docker
容器進(jìn)行任
何網(wǎng)絡(luò)配置。也就是說,這個(gè)
Docker
容器沒有網(wǎng)卡、
IP
、路由等信息。容器完全網(wǎng)絡(luò)
隔離。
5. overlay 網(wǎng)絡(luò)
借助
Docker
集群模塊
Docker Swarm
搭建的跨
Docker Daemon
網(wǎng)絡(luò)。將多個(gè)
Docker
守護(hù)進(jìn)程連接在一起,使集群服務(wù)能夠相互通信。當(dāng)我們需要運(yùn)行在不同
Docker
主機(jī)上的容器進(jìn)行通信時(shí),或者當(dāng)多個(gè)應(yīng)用程序使用集群服務(wù)協(xié)同工作時(shí),覆
蓋網(wǎng)絡(luò)是最佳選擇。
另外,在 Docker 安裝時(shí),會(huì)自動(dòng)安裝一塊 Docker 網(wǎng)卡稱為 docker0,它是一個(gè)網(wǎng) 橋設(shè)備,主要用于 Docker 各容器及宿主機(jī)的網(wǎng)絡(luò)通信。
docker 網(wǎng)絡(luò)管理命令
docker network create
?
功能
?
創(chuàng)建自定義網(wǎng)絡(luò)
?
關(guān)鍵參數(shù)
?
-d, --driver
:
網(wǎng)絡(luò)驅(qū)動(dòng)
?
--gateway
:
網(wǎng)關(guān)地址
?
--subnet
:
表示網(wǎng)段的
CIDR
格式的子網(wǎng)
?
--ipv6
:
啟用
ipv6
?
樣例
Shell
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
docker network inspect
?
功能
?
查看網(wǎng)絡(luò)詳情.
?
關(guān)鍵參數(shù)
?
-f,--format:
指定格式
?
樣例
Shell
docker network inspect mynetwork
docker network connect
?
功能
?
于將容器連接到網(wǎng)絡(luò)。可以按名稱或
ID
連接容器。 一旦連接,容器可以與同
一網(wǎng)絡(luò)中的其他容器通信。
?
關(guān)鍵參數(shù)
?
--ip
:
指定
IP
地址
?
--ip6
:
指定
IPv6
地址
?
樣例
Shell
將正在運(yùn)行的容器連接到網(wǎng)絡(luò)
$ docker network connect multi-host-network my_container1
啟動(dòng)時(shí)將容器連接到網(wǎng)絡(luò)
還可以使用
docker run --network=
選項(xiàng)啟動(dòng)容器并立即將其連
接到網(wǎng)絡(luò)。
$ docker run -itd --network=multi-host-network busybox-container
指定容器的
IP
地址
可以指定要分配給容器網(wǎng)絡(luò)接口的
IP
地址。
$ docker network connect --ip 10.10.36.122 multi-host-network container2
docker network disconnect
?
功能
?
斷開網(wǎng)絡(luò)
?
語法
Shell
docker network disconnect [OPTIONS] NETWORK CONTAINER
?
關(guān)鍵參數(shù)
?
-f:
強(qiáng)制退出
?
樣例
Shell
$ docker network disconnect multi-host-network my_container1
docker network prune
?
功能
?
刪除不使用的網(wǎng)絡(luò)
?
語法
Shell
docker network prune [OPTIONS]
?
關(guān)鍵參數(shù)
?
-f, --force
:
不提示
Shell
docker network prune
docker network rm
?
功能
?
刪除
1
個(gè)或者多個(gè)網(wǎng)絡(luò)
?
語法
Shell
docker network rm NETWORK [NETWORK...]
?
關(guān)鍵參數(shù)
?
-f:
強(qiáng)制退出
docker network rm br0
docker network ls
?
功能
?
列出網(wǎng)絡(luò)
?
語法
Shell
docker network ls [OPTIONS]
?
別名
Shell
docker network list
?
關(guān)鍵參數(shù)
?
-f, --filter:
指定過濾條件
?
--format:
指定格式
?
--no-trunc:
不截?cái)?/p>
?
-q, --quiet :
僅僅顯示
id
?
樣例
Shell
docker network list
網(wǎng)絡(luò)詳解
docker Bridge 網(wǎng)絡(luò)
網(wǎng)絡(luò)介紹
Docker Bridge
網(wǎng)絡(luò)采用內(nèi)置的
bridge
驅(qū)動(dòng),
bridge
驅(qū)動(dòng)底層采用的是
Linux
內(nèi)核中
Linux bridge
技術(shù)。就網(wǎng)絡(luò)而言,
bridge
網(wǎng)絡(luò)是在網(wǎng)絡(luò)段之間轉(zhuǎn)發(fā)流量的鏈路層設(shè)備,
而網(wǎng)橋可以是在主機(jī)內(nèi)核中運(yùn)行的硬件設(shè)備或軟件設(shè)備;就
Docker
而言,橋接網(wǎng)絡(luò)使
用軟件網(wǎng)橋
docker0
,它允許連接到同一網(wǎng)橋網(wǎng)絡(luò)的容器進(jìn)行通信,同時(shí)提供與未連
接到該網(wǎng)橋網(wǎng)絡(luò)容器的隔離。
默認(rèn)情況下,創(chuàng)建的容器在沒有使用
--network
參數(shù)指定要加入的
docker
網(wǎng)絡(luò)時(shí),
默認(rèn)都是加入
Docker
默認(rèn)的單機(jī)橋接網(wǎng)絡(luò),即下面的
name
為
bridge
的網(wǎng)絡(luò)。
默認(rèn)的
bridge
網(wǎng)絡(luò)會(huì)被映射到內(nèi)核中為
docker0
的網(wǎng)橋上。
Docker
默認(rèn)的
bridge
網(wǎng)絡(luò)和
Linux
內(nèi)核中的
docker0
網(wǎng)橋是一一對應(yīng)的關(guān)系。
bridge
是
Docker
對網(wǎng)絡(luò)的命名,而
docker0
是內(nèi)核中網(wǎng)橋的名字。
docker Host 網(wǎng)絡(luò)
網(wǎng)絡(luò)介紹
Docker
容器運(yùn)行默認(rèn)都會(huì)分配獨(dú)立的
Network Namespace
隔離子系統(tǒng), 但是如果基
于
host
網(wǎng)絡(luò)模式,容器將不會(huì)獲得一個(gè)獨(dú)立的
Network Namespace
,而是和宿主機(jī)
共用同一個(gè)
Network Namespace
,容器將不會(huì)虛擬出自己的網(wǎng)卡,
IP
等,而是直接使
用宿主機(jī)的
IP
和端口。
連接到
host
網(wǎng)絡(luò)的容器共享宿主機(jī)的網(wǎng)絡(luò)棧,容器的網(wǎng)絡(luò)配置與宿主機(jī)完全一樣。我
們可以通過
--network=host
指定使用
host
網(wǎng)絡(luò)。
使用場景
?
之前我們提到 bridge
網(wǎng)絡(luò)在通信的時(shí)候需要進(jìn)行端口轉(zhuǎn)發(fā)以及
NAT
地址轉(zhuǎn)換,
這勢必會(huì)消耗掉一些資源以及性能。
?
那么直接使用 host
網(wǎng)絡(luò)最大的好處就是性能好,如果容器對網(wǎng)絡(luò)傳輸效率有較高
的要求,建議選擇
host
網(wǎng)絡(luò)。當(dāng)然也會(huì)犧牲一些東西,比如要考慮端口沖突問題,其
他服務(wù)已經(jīng)被占用的端口就不能再使用了
docker Container 網(wǎng)絡(luò)
網(wǎng)絡(luò)介紹
Docker Container
的
other container
網(wǎng)絡(luò)模式是
Docker
中一種較為特別的網(wǎng)絡(luò)的模
式。之所以稱為
“other container
模式
”
,是因?yàn)檫@個(gè)模式下的
Docker Container
,會(huì)使
用其他容器的網(wǎng)絡(luò)環(huán)境。之所以稱為
“
特別
”
,是因?yàn)檫@個(gè)模式下容器的網(wǎng)絡(luò)隔離性會(huì)處
于
bridge
橋接模式與
host
模式之間。
Docker Container
共享其他容器的網(wǎng)絡(luò)環(huán)境,則
至少這兩個(gè)容器之間不存在網(wǎng)絡(luò)隔離,而這兩個(gè)容器又與宿主機(jī)以及除此之外其他的
容器存在網(wǎng)絡(luò)隔離。
使用場景
在這種模式下的
Docker Container
可以通過
localhost
來訪問
namespace
下的其他容
器,傳輸效率較高。但是兩個(gè)容器之間存在依賴,如果依賴容器重啟了,會(huì)導(dǎo)致另外
一個(gè)服務(wù)的網(wǎng)絡(luò)不可用。
docker none 網(wǎng)絡(luò)
網(wǎng)絡(luò)介紹
none
網(wǎng)絡(luò)就是指沒有網(wǎng)絡(luò)。掛在這個(gè)網(wǎng)絡(luò)下的容器除了
lo
(
本地回環(huán)
)
,沒有其他任何
網(wǎng)卡。
使用場景
?
針對一些對安全性要求比較高并且不需要聯(lián)網(wǎng)的應(yīng)用, 可以使用 none
網(wǎng)絡(luò), 比
如生成隨機(jī)密碼, 避免生成密碼被第三方獲取。
?
一些第三方的應(yīng)用可能需要 docker
幫忙創(chuàng)建一個(gè)沒有網(wǎng)絡(luò)的容器, 網(wǎng)絡(luò)由第三
方自己來配置。
Docker Compose(容器編排)
什么是 Docker Compose
docker-compose
是
Docker
官方的開源項(xiàng)目,使用
python
編寫,實(shí)現(xiàn)上調(diào)用了
Docker
服務(wù)的
API
進(jìn)行容器管理及編排,其官方定義為定義和運(yùn)行多個(gè)
Docker 容器
的應(yīng)用。
docker-compose
中有兩個(gè)非常重要的概念
:
?
服務(wù)
( service )
:一個(gè)應(yīng)用的容器,實(shí)際上可以包括若干運(yùn)行相同鏡像的容器實(shí)例。
?
項(xiàng)目
( project )
:由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元,在
docker
compose.yml
文件中定義
,
整個(gè)
docker-compose.yml
定義一個(gè)項(xiàng)目。
Compose
的默認(rèn)管理對象是項(xiàng)目,通過子命令對項(xiàng)目中的一組容器進(jìn)行便捷地生命周
期管理。 通過 compose
可以方便的管理多個(gè)服務(wù)。
為什么要 Docker Compose
?
Docker 是一個(gè)輕量化的應(yīng)用程序,
Docker
官方推薦每個(gè)
Docker
容器中只運(yùn)行一
個(gè)進(jìn)程
。
?
如果一個(gè)應(yīng)用需要涉及到 MySQL
、
nginx
等環(huán)境, 那么我們需要分別為應(yīng)用、數(shù)
據(jù)庫和
nginx
創(chuàng)建單獨(dú)的
docker
容器,然后分別啟動(dòng)容器。
?
想象一下,當(dāng)我們構(gòu)建好 Docker
之后,每次啟動(dòng)應(yīng)用,都至少需要
docker run
三次, 或者寫一些腳本來實(shí)現(xiàn), 這樣會(huì)比較繁瑣。
?
另外,這些 docker
容器都是分散獨(dú)立的,也不方便鏡像管理。那既然這些
docker
容器 都是為了同一個(gè)應(yīng)用服務(wù),我們就應(yīng)該把它們放到一起,這就引出了
docker
compose
來解決這類型的問題
Docker Compose 的功能
1.
使用步驟
Compose
使用的步驟:
?
使用 docker-compose.yml
定義構(gòu)成應(yīng)用程序的服務(wù),這樣它們可以在隔離環(huán)境中
一起運(yùn)行。
?
最后,執(zhí)行 docker compose up
命令來啟動(dòng)并運(yùn)行整個(gè)應(yīng)用程序。
2.
核心功能
Compose
具有管理應(yīng)用程序整個(gè)生命周期的命令:
?
啟動(dòng),停止和重建服務(wù)
?
查看正在運(yùn)行的服務(wù)的狀態(tài)
?
流式傳輸運(yùn)行服務(wù)的日志輸出
?
在服務(wù)上運(yùn)行一次性命令
文件基本結(jié)構(gòu)及常見指令
YAML
version: "3.8" # 定義版本, 表示當(dāng)前使用的 docker-compose 語法的版本
services: # 服務(wù),可以存在多個(gè)
servicename: # 服務(wù)名字,它也是內(nèi)部 bridge 網(wǎng)絡(luò)可以使用的 DNS name,
如果不是集群模式相當(dāng)于 docker run 的時(shí)候指定的一個(gè)名稱,
#集群(Swarm)模式是多個(gè)容器的邏輯抽象
image: # 必選,鏡像的名字
command: # 可選,如果設(shè)置,則會(huì)覆蓋默認(rèn)鏡像里的 CMD 命令
environment: # 可選,等價(jià)于 docker container run 里的 --env 選項(xiàng)
設(shè)置環(huán)境變量
volumes: # 可選,等價(jià)于 docker container run 里的 -v 選項(xiàng) 綁定數(shù)據(jù)
卷
networks: # 可選,等價(jià)于 docker container run 里的 --network 選項(xiàng)
指定網(wǎng)絡(luò)
ports: # 可選,等價(jià)于 docker container run 里的 -p 選項(xiàng)指定端口映
射
expose: # 可選,指定容器暴露的端口
build: #構(gòu)建目錄
depends_on: #服務(wù)依賴配置
env_file: #環(huán)境變量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可選,等價(jià)于 docker volume create
networks: # 可選,等價(jià)于 docker network create
常見字段格式語法
image
指定容器運(yùn)行的鏡像。以下格式都可以:
command
覆蓋容器啟動(dòng)的默認(rèn)命令。
entrypoint
覆蓋容器默認(rèn)的
entrypoint
。
?
也可以是以下格式:
Shell
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
environment
添加環(huán)境變量。您可以使用數(shù)組或字典、任何布爾值,布爾值需要用引號引起來,以
確保
YML
解析器不會(huì)將其轉(zhuǎn)換為
True
或
False
。
networks
指定容器運(yùn)行的網(wǎng)絡(luò):
配置容器網(wǎng)絡(luò)
如果要配置更多的信息,例如下圖配置ipv4地址的信息
volumes
將主機(jī)的數(shù)據(jù)卷或者文件掛載到容器里。
ports
指定端口映射。以下格式都可以:
expose
暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問。
僅可以指定內(nèi)部端口為參數(shù):
build
指定為構(gòu)建鏡像上下文路徑:
例如
webapp
服務(wù),指定為從上下文路徑
./dir/Dockerfile
所構(gòu)建的鏡像:
?
context:上下文路徑。
?
dockerfile:指定構(gòu)建鏡像的
Dockerfile
文件名。
?
args:添加構(gòu)建參數(shù),這是只能在構(gòu)建過程中訪問的環(huán)境變量。
?
labels:設(shè)置構(gòu)建鏡像的標(biāo)簽。
depends_on
設(shè)置依賴關(guān)系。
?
docker compose up :以依賴性順序啟動(dòng)服務(wù)。在以下示例中,先啟動(dòng)
db
和
redis
,才會(huì)啟動(dòng)
web
。
?
docker compose up SERVICE :自動(dòng)包含
SERVICE
的依賴項(xiàng)。在以下示例中,
docker compose up web
還將創(chuàng)建并啟動(dòng)
db
和
redis
。
?
docker compose stop :按依賴關(guān)系順序停止服務(wù)。在以下示例中,
web
在
db
和
redis
之前停止。
env_file
從文件添加環(huán)境變量??梢允菃蝹€(gè)值或列表的多個(gè)值。
Docker Compose 命令清單
官網(wǎng)參考地址:https://docs.docker.com/compose/reference/
命令格式
對于
Compose
來說,大部分命令的對象既可以是項(xiàng)目本身,也可以指定為項(xiàng)目中的
服務(wù)或者容器。如果沒有特別的說明,命令對象將是項(xiàng)目,這意味著項(xiàng)目中所有的服
務(wù)都會(huì)受到命令影響。
docker-compose
命令的基本的使用格式為
常見選項(xiàng)說明
?
-f, --file 指定使用的
Compose
模板文件,默認(rèn)為
docker-compose.yml
,可
以多次指定
?
-p, --project-name 指定項(xiàng)目名稱,默認(rèn)將使用所在目錄名稱作為項(xiàng)目名
常見命令說明
up
該命令的作用十分強(qiáng)大,它會(huì)嘗試自動(dòng)完成包括構(gòu)建鏡像、(重新)創(chuàng)建服務(wù)、啟動(dòng)服
務(wù)并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作,可以直接通過該命令來啟動(dòng)一個(gè)項(xiàng)目。
?
-d 在后臺(tái)運(yùn)行服務(wù)容器, 推薦在生產(chǎn)環(huán)境下使用該選項(xiàng)
?
--force-recreate 強(qiáng)制重新創(chuàng)建容器,不能與
--no-recreate
同時(shí)使用
?
--no-recreate 如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與
--force
recreate
同時(shí)使用
down
停止所有容器,并刪除容器和網(wǎng)絡(luò)
?
-v, --volumes 刪除容器同時(shí)刪除目錄映射
run
該命令可以在指定服務(wù)容器上執(zhí)行相關(guān)的命令
?
-d 后臺(tái)運(yùn)行容器
?
--name NAME 為容器指定一個(gè)名字
?
--entrypoint CMD 覆蓋默認(rèn)的容器啟動(dòng)指令
?
-e KEY=VAL 設(shè)置環(huán)境變量值,可多次使用選項(xiàng)來設(shè)置多個(gè)環(huán)境變量
?
-u, --user="" 指定運(yùn)行容器的用戶名或者
uid
?
--rm 運(yùn)行命令后自動(dòng)刪除容器
?
-p, --publish=[] 映射容器端口到本地主機(jī)
至此,學(xué)完這些就已經(jīng)可以基本使用好docker了,本文到此結(jié)束,感謝觀看。
柚子快報(bào)激活碼778899分享:容器 docker入門教程
參考閱讀
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。