目錄
一、對(duì) Docker? 的理解
1、Docker 基本概念
2、Docker 與 虛擬機(jī)的區(qū)別
3、何為鏡像和容器?
4、Docker 主要架構(gòu)
二、Docker 基本操作
1、Docker 鏡像操作
2、案例(鏡像):去 DockerHub 搜索并拉取一個(gè) Nginx 鏡像,打包后刪除鏡像,重新加載 .tar 文件
3、Docker 容器操作
1.docker run(啟動(dòng)容器)
2.docker logs(查看容器日志信息)
3.docker ps(查看容器狀態(tài))
4.docker exec(進(jìn)入容器)
5.docker rm(刪除容器)
4、案例:運(yùn)行?Redis 容器,支持?jǐn)?shù)據(jù)持久化,并緩存一個(gè)數(shù)據(jù)
1.去 docker hub 上搜索 redis 查看幫助文檔
2.進(jìn)入redis容器,并打開客戶端,存入數(shù)據(jù)
5、數(shù)據(jù)卷
1.數(shù)據(jù)卷基本概念
2.數(shù)據(jù)卷操作
3.案例(Nginx):創(chuàng)建一個(gè)數(shù)據(jù)卷,查看數(shù)據(jù)卷在宿主機(jī)的目錄位置,實(shí)現(xiàn)掛載數(shù)據(jù)卷,最后修改容器內(nèi)容
一、對(duì) Docker? 的理解
1、Docker 基本概念
我們平時(shí)開發(fā)大型項(xiàng)目組件較多,依賴關(guān)系復(fù)雜,環(huán)境差異大,通過 Docker 就可解決上述問題~
Docker 就是一個(gè)快速交付應(yīng)用、運(yùn)行應(yīng)用的技術(shù):
- 運(yùn)行前后:啟動(dòng)、移除都可以通過一行命令完成,方便快捷
- 運(yùn)行時(shí):運(yùn)行時(shí)利用沙箱機(jī)制形成隔離容器,各個(gè)應(yīng)用互不干擾
- 運(yùn)行環(huán)境:Docker鏡像中包含完整運(yùn)行環(huán)境,包括系統(tǒng)函數(shù)庫,僅依賴系統(tǒng)的Linux內(nèi)核,因此可以在任意Linux操作系統(tǒng)上運(yùn)行,通過內(nèi)核與硬件進(jìn)行交互
- 主要工作:可以將程序及其依賴、運(yùn)行環(huán)境一起打包為一個(gè)鏡像,可以遷移到任意Linux操作系統(tǒng)
2、Docker 與 虛擬機(jī)的區(qū)別
主要有以下區(qū)別:
- 底層:docker是一個(gè)系統(tǒng)進(jìn)程;虛擬機(jī)是在操作系統(tǒng)中的操作系統(tǒng)
- 性能:docker體積小、啟動(dòng)速度快、性能好;虛擬機(jī)體積大、啟動(dòng)速度慢、性能一般
?
特性 |
Docker |
虛擬機(jī) |
性能 |
接近原生 |
性能較差 |
硬盤占用 |
一般為 MB |
一般為GB |
啟動(dòng) |
秒級(jí) |
分鐘級(jí) |
3、何為鏡像和容器?
鏡像(Image):Docker將應(yīng)用程序及其所需的依賴、函數(shù)庫、環(huán)境、配置等文件打包在一起,稱為鏡像。
容器(Container):鏡像中的應(yīng)用程序運(yùn)行后形成的進(jìn)程就是容器,只是Docker會(huì)給容器做隔離,對(duì)外不可見。
4、Docker 主要架構(gòu)
Docker由兩部分組成:
- 服務(wù)端(server):Docker守護(hù)進(jìn)程,負(fù)責(zé)處理Docker指令,管理鏡像、容器等
- 客戶端(client):通過命令或RestAPI向Docker服務(wù)端發(fā)送指令??梢栽诒镜鼗蜻h(yuǎn)程向服務(wù)端發(fā)送指令。
二、Docker 基本操作
1、Docker 鏡像操作
鏡像名稱一般分兩部分組成:[repository]:[tag],在沒有指定tag時(shí),默認(rèn)是latest,代表最新版本的鏡像,如下 mysql 鏡像
常用的有以下命令(具體可以通過 --help 查看):
(1) docker images:查看鏡像
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Aliases:
docker image ls, docker image list, docker images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Format output using a custom template:
'table': Print output in table format with column headers (default)
'table TEMPLATE': Print output in table format using the given Go template
'json': Print in JSON format
'TEMPLATE': Print output using the given Go template.
Refer to https://docs.docker.com/go/formatting/ for more information about formatting output with templates
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
(2) docker rmi:刪除鏡像
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Remove one or more containers
Aliases:
docker container rm, docker container remove, docker rm
Options:
-f, --force Force the removal of a running container (uses SIGKILL)
-l, --link Remove the specified link
-v, --volumes Remove anonymous volumes associated with the container
docker pull:從服務(wù)器拉取鏡像
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Download an image from a registry
Aliases:
docker image pull, docker pull
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
docker push:推送鏡像到服務(wù)器
Usage: docker push [OPTIONS] NAME[:TAG]
Upload an image to a registry
Aliases:
docker image push, docker push
Options:
-a, --all-tags Push all tags of an image to the repository
--disable-content-trust Skip image signing (default true)
-q, --quiet Suppress verbose output
docker save:用于將Docker鏡像保存到tar文件中,以便在其他機(jī)器上使用。
Usage: docker save [OPTIONS] IMAGE [IMAGE...]
Save one or more images to a tar archive (streamed to STDOUT by default)
Aliases:
docker image save, docker save
Options:
-o, --output string Write to a file, instead of STDOUT
docker load:加載壓縮包為鏡像
Usage: docker load [OPTIONS]
Load an image from a tar archive or STDIN
Aliases:
docker image load, docker load
Options:
-i, --input string Read from tar archive file, instead of STDIN
-q, --quiet Suppress the load output
?
2、案例(鏡像):去 DockerHub 搜索并拉取一個(gè) Nginx 鏡像,打包后刪除鏡像,重新加載 .tar 文件
主要分為以下步驟:
a)去DockerHub搜索 Nginx 鏡像
b)查看 Nginx 鏡像的幫助文檔信息
c)利用docker pull命令拉取鏡像?
d)利用docker save命令將 Nginx:latest打包為一個(gè) Nginx.tar 包?
e)利用docker rmi 刪除本地的 Nginx:latest
f)利用docker load 重新加載 Nginx.tar文件?
3、Docker 容器操作
容器相關(guān)指令如下:
Ps:可以通過 docker ps 查看容器狀態(tài)
這里以下幾個(gè)命令需要重點(diǎn)說明一下:
1.docker run(啟動(dòng)容器)
例如如下命令
docker run --name mn?-p 80:80 -d nginx
意思是:后臺(tái)啟動(dòng)?nginx 容器并起名為 "mn" ,并將容器 80 端口映射到宿主機(jī)的 80 端口(上述命令中,第一個(gè)是宿主機(jī)端口,第二個(gè)是容器端口)。
詳細(xì)參數(shù):
docker?run :創(chuàng)建并運(yùn)行一個(gè)容器
--name : 給容器起一個(gè)名字,比如叫做mn
-p :將宿主機(jī)端口與容器端口映射,冒號(hào)左側(cè)是宿主機(jī)端口,右側(cè)是容器端口(配置映射是因?yàn)橛脩糁荒芡ㄟ^ http 請(qǐng)求訪問到服務(wù)器,不能直接訪問到對(duì)應(yīng)的容器,因此需要服務(wù)器端口與容器端口建立映射關(guān)系)
-d:后臺(tái)運(yùn)行容器
nginx:鏡像名稱,例如nginx
2.docker logs(查看容器日志信息)
如果需要持續(xù)查看日志信息可以添加 -f 參數(shù),例如:docker logs -f?mn ,這里 mn 是自定義容器名稱, ctrl + c 可以停止跟蹤。
3.docker ps(查看容器狀態(tài))
可以通過添加 -a 參數(shù)查看所有狀態(tài)的容器
4.docker exec(進(jìn)入容器)
例如如下命令
docker exec -it mn bash
意思是:進(jìn)入名字為 mn 容器中,打開 mn 的終端進(jìn)行交互
-it : 給當(dāng)前進(jìn)入的容器創(chuàng)建一個(gè)標(biāo)準(zhǔn)輸入、輸出終端,允許我們與容器交互
mn :要進(jìn)入的容器的名稱
bash:進(jìn)入容器后執(zhí)行的命令,bash是一個(gè)linux終端交互命令
例如進(jìn)入 mysql
docker exec -it mysql mysql -uroot -p
Ps:exec命令可以進(jìn)入容器修改文件,但是在容器內(nèi)修改文件是不推薦的
5.docker rm(刪除容器)
不能刪除運(yùn)行中的容器,但是可以通過 -f? 命令強(qiáng)制刪除
4、案例:運(yùn)行?Redis 容器,支持?jǐn)?shù)據(jù)持久化,并緩存一個(gè)數(shù)據(jù)
1.去 docker hub 上搜索 redis 查看幫助文檔
這里我們有兩種啟動(dòng) redis 的方式,第一種是直接啟動(dòng) redis ,第二種是以 AOF 持久化的方式啟動(dòng)容器(--appendonly yes),如下圖
這里我們選擇第二種啟動(dòng)方式,如下
2.進(jìn)入redis容器,并打開客戶端,存入數(shù)據(jù)
進(jìn)入 redis 容器有以下兩個(gè)命令
docker exec -it redis bash
docker exec -it redis?redis-cli
其中第一個(gè)命令是先進(jìn)入 redis ,然后還需再輸入命令 redis-cli 打開 redis 客戶端,而第二個(gè)命令則是一步到位~
這里我們使用第二個(gè)命令一步到位,然后存入 cyk = 666 的數(shù)據(jù),如下
打開 redis 客戶端即可查看到數(shù)據(jù)
5、數(shù)據(jù)卷
1.數(shù)據(jù)卷基本概念
以上我們對(duì)容器數(shù)據(jù)的操作都會(huì)發(fā)現(xiàn)一個(gè)嚴(yán)重的問題就是——容器與數(shù)據(jù)的耦合,主要體現(xiàn)在以下幾個(gè)方面:
- 難修改:例如當(dāng)我們要修改Nginx的html內(nèi)容時(shí),需要進(jìn)入容器內(nèi)部修改,很不方便。
- 數(shù)據(jù)不可復(fù)用:在容器內(nèi)的修改對(duì)外是不可見的。所有修改對(duì)新創(chuàng)建的容器是不可復(fù)用的。
- 升級(jí)維護(hù)困難:數(shù)據(jù)在容器內(nèi),如果要升級(jí)容器必然刪除舊容器,所有數(shù)據(jù)都跟著刪除了。
通過數(shù)據(jù)卷,就可以很完美的解決以上三個(gè)問題,接下來看一下什么是數(shù)據(jù)卷~
數(shù)據(jù)卷(volume)是一個(gè)虛擬目錄,指向宿主機(jī)文件系統(tǒng)中的某個(gè)目錄。
上圖中的 conf 和 html 就是兩個(gè)數(shù)據(jù)卷(虛擬目錄),以 conf 為例,conf 這個(gè)數(shù)據(jù)卷就將宿主機(jī)文件系統(tǒng)中的 conf 文件 和 容器(Container)中的 conf?文件關(guān)聯(lián)起來了,這樣,就達(dá)到了以下目的:
- 易修改:即使我們不進(jìn)入容器的內(nèi)部,也可以通過修改宿主機(jī)文件系統(tǒng)的 conf 文件,來修改容器中的 conf 文件;
- 數(shù)據(jù)可復(fù)用:當(dāng)創(chuàng)建了新的容器并且需要復(fù)用之前的 conf 文件時(shí),可以直接再創(chuàng)建一個(gè)數(shù)據(jù)卷或者修改之前數(shù)據(jù)卷對(duì)容器目錄的指向即可,來進(jìn)行關(guān)聯(lián),這樣就可以將之前的配置映射到新容器的配置中;
- 升級(jí)維護(hù)簡單:如果來了新的容器,需要?jiǎng)h除舊容器,也不用擔(dān)心數(shù)據(jù)會(huì)被刪除掉,因?yàn)閿?shù)據(jù)在宿主機(jī)上還保存了一份。
2.數(shù)據(jù)卷操作
數(shù)據(jù)卷操作的基本語法如下:
docker volume [COMMAND]
docker volume命令是數(shù)據(jù)卷操作,根據(jù)命令后跟隨的command來確定下一步的操作:
- ?create:創(chuàng)建一個(gè)volume
- ?inspect:顯示一個(gè)或多個(gè)volume的信息
- ?ls:列出所有的volume
- ?prune:刪除未使用的volume
- ?rm:刪除一個(gè)或多個(gè)指定的volume
?
3.案例(Nginx):創(chuàng)建一個(gè)數(shù)據(jù)卷,查看數(shù)據(jù)卷在宿主機(jī)的目錄位置,實(shí)現(xiàn)掛載數(shù)據(jù)卷,最后修改容器內(nèi)容
a)創(chuàng)建數(shù)據(jù)卷(自定義名為 html)并查看所有數(shù)據(jù)卷
b)查看數(shù)據(jù)卷詳細(xì)信息(主要是看在宿主機(jī)目錄的哪個(gè)位置)
c)接著在運(yùn)行容器的時(shí)候,可以通過 -v 參數(shù)來掛載一個(gè)數(shù)據(jù)卷到某個(gè)容器目錄
Ps:事實(shí)上,我們不需要進(jìn)行 a、b 兩個(gè)步驟,而是進(jìn)行?步驟c 即可,因?yàn)?步驟c 在運(yùn)行容器的時(shí)候,只要我們使用了 -v 參數(shù),就會(huì)先自動(dòng)創(chuàng)建數(shù)據(jù)卷,最后完成掛載(這也是最常使用的)
通過以下命令即可:
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
其中 -v 后面的?html 是我們剛剛創(chuàng)建的數(shù)據(jù)卷(如果沒創(chuàng)建會(huì)自動(dòng)創(chuàng)建),而后面的 /user/share/nginx/html 是對(duì)應(yīng)容器中的目錄地址
vim 打開后可以看到 index.html 數(shù)據(jù)如下
我修改了標(biāo)題數(shù)據(jù),如下
在網(wǎng)頁中輸入 ip 地址和端口號(hào)即可訪問如下
4.目錄掛載方式(另一種掛載方式)
目錄掛載與數(shù)據(jù)卷掛載的語法是類似的,docker run的命令中通過 -v 參數(shù)掛載(以下兩個(gè)都需要配置):
- -v [宿主機(jī)目錄]:[容器內(nèi)目錄]
- -v [宿主機(jī)文件]:[容器內(nèi)文件]
數(shù)據(jù)卷掛載與目錄直接掛載的區(qū)別
- 數(shù)據(jù)卷掛載耦合度低,由docker來管理目錄,但是目錄較深,不好找
- 目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看
Ps:所以兩種方式,都可以,根據(jù)實(shí)際情況選擇即可~文章來源:http://www.zghlxwxcb.cn/news/detail-850098.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-850098.html
到了這里,關(guān)于Docker - 基本概念、與虛擬機(jī)的區(qū)別、架構(gòu)、鏡像操作、容器操作、數(shù)據(jù)卷掛載的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!