欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報(bào)激活碼778899分享:容器 docker入門教程

柚子快報(bào)激活碼778899分享:容器 docker入門教程

http://yzkb.51969.com/

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入門教程

http://yzkb.51969.com/

參考閱讀

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19529063.html

發(fā)布評論

您暫未設(shè)置收款碼

請?jiān)谥黝}配置——文章設(shè)置里上傳

掃描二維碼手機(jī)訪問

文章目錄