什么是Docker?(概念篇)

此文為Docker概念篇,是自己學(xué)習(xí)Docker的小筆記。隨后會(huì)更新一篇部署篇,包含Docker部署MySQL/Tomcat/NGINX/Redis,創(chuàng)建自己的私有Docker hub,鏡像上傳私有倉(cāng)庫(kù)以及鏡像的使用。

快速理解docker

本地做好項(xiàng)目之后,在本地打一個(gè)鏡像放到遠(yuǎn)程自己的private hub上,這樣就可以在服務(wù)器上拉遠(yuǎn)程的鏡像到服務(wù)器本地,通過(guò)docker進(jìn)行創(chuàng)建一個(gè)以鏡像為依據(jù)的的容器。然后在容器中執(zhí)行項(xiàng)目啟動(dòng)的指令。在這個(gè)容器中包含了你的項(xiàng)目以及項(xiàng)目的依賴(lài)包和相關(guān)的運(yùn)行環(huán)境。比虛擬機(jī)更省資源,項(xiàng)目容錯(cuò)率也會(huì)更高。

Docker概念

Docker可以讓開(kāi)發(fā)者打包他們的應(yīng)用以及依賴(lài)包到一個(gè)輕量級(jí),可移植的容器中。然后發(fā)布到任何流行的Linux機(jī)器上。有CE(社區(qū)版)和EE(企業(yè)版),是一種容器技術(shù),解決項(xiàng)目遷移問(wèn)題;

優(yōu)點(diǎn):

  • 容易完全沙箱機(jī)制,相互隔離

  • 性能開(kāi)銷(xiāo)極低

Docker架構(gòu)

鏡像(image):Docker鏡像 就相當(dāng)于是一個(gè)root文件系統(tǒng)。比如官方鏡像ubuntu就包含了完整的一套u(yù)buntu16.04最小系統(tǒng)的root文件系統(tǒng)

容器(container): 鏡像和容器的關(guān)系,就像是面向兌現(xiàn)程序設(shè)計(jì)中的類(lèi)和對(duì)象一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建,啟動(dòng),停止,刪除,暫停等。

倉(cāng)庫(kù)(Registries):倉(cāng)庫(kù)可看成一個(gè)代碼控制中心,用來(lái)保存鏡像的

image-20200317005004682.png

配置Docker鏡像加速器

默認(rèn)情況下,將來(lái)從docker hub上下載docker鏡像,太慢。一般我們都用阿里云進(jìn)行鏡像加速器,阿里云的控制臺(tái)進(jìn)行配置docker。具體的配置流程可以Google一下~

Docker命令

Docker服務(wù)相關(guān)命令:

啟動(dòng) 停止 重啟 開(kāi)啟啟動(dòng)等(Linux Docker可以通過(guò)指令在進(jìn)程中查看是否有Docker進(jìn)程運(yùn)行)

Docker鏡像相關(guān)命令:

查看鏡像:

# 列出本地主機(jī)上的鏡像
docker images 
#顯示的選項(xiàng)說(shuō)明:
#REPOSITORY:表示鏡像的倉(cāng)庫(kù)源
#TAG:鏡像的標(biāo)簽
#IMAGE ID:鏡像ID
#CREATED:鏡像創(chuàng)建時(shí)間
#SIZE:鏡像大小

docker images -q 查看所有鏡像的ID

搜索鏡像(遠(yuǎn)程):

docker search redis

拉取鏡像(遠(yuǎn)程):

docker pull redis

刪除鏡像:

docker rmi [images ID]  ---刪除某個(gè)id
docker rmi 'docker images -q'  #刪除所有本地鏡像

Docker 容器相關(guān)命令(構(gòu)建好的鏡像實(shí)例)類(lèi)似于對(duì)一個(gè)應(yīng)用程序的操作:

docker run 命令在一個(gè)容器內(nèi)運(yùn)行一個(gè)程序

docker run ubuntu:15.10 /bin/echo "hello world"

查看容器指令

# 查看當(dāng)前運(yùn)行的容器
docker ps

# 查看所有容器,包括停止
docker ps -a

# 查看最新創(chuàng)建的容器,只列出最后創(chuàng)建的
docker ps -l

# 查看網(wǎng)絡(luò)端口
docker port [容器ID|容器名]

# 查看容器內(nèi)部的標(biāo)準(zhǔn)輸出
docker logs [容器ID|容器名]

# 查看容器內(nèi)部運(yùn)行的進(jìn)程
docker top [容器ID|容器名]

# 查看 Docker 的底層信息。它會(huì)返回一個(gè) JSON 文件記錄著 Docker 容器的配置和狀態(tài)信息
docker inspect [容器ID|容器名]

創(chuàng)建容器:

docker run -it --name=c1 centos:7 /bin/bash
#centos 鏡像名 7 是版本號(hào)
docker run -id --name=c2 centos:7
#--name 容器名字
-i #保持容器運(yùn)行,通常于-t同時(shí)使用。加入it這兩個(gè)參數(shù)之后,容器創(chuàng)建后會(huì)自動(dòng)進(jìn)入容器中,退出容器后,容器會(huì)自動(dòng)關(guān)閉。
-t #為容器重新分配一個(gè)偽輸入終端,通常與-i同時(shí)使用;
-d #以守護(hù)(后臺(tái))模式運(yùn)行容器。創(chuàng)建一個(gè)容器在后臺(tái)運(yùn)行,需要使用docker exec 進(jìn)入容器。退出后,容器不會(huì)關(guān)閉。
-it #創(chuàng)建的容器一般稱(chēng)為交互式容器,-id創(chuàng)建的為守護(hù)示容器;
--name #為創(chuàng)建的容器命名;

進(jìn)入容器:

docker exec -it c2 /bin/bash
#通過(guò)--id 方式創(chuàng)建的容器 當(dāng)你exit退出之后,容器的運(yùn)行是不會(huì)停止的

停止容器:

docker stop [容器|容器名]

啟動(dòng)容器:

docker start [容器ID|容器名]
docker restart [容器ID | 容器名]

刪除容器:

# 刪除容器,刪除容器時(shí),容器必須是停止?fàn)顟B(tài)
docker rm [容器ID|容器名]
# 刪除所有的容器
docker rm $(docker ps -aq)

查看容器信息:

docker inspect [容器名]

所有的指令中,docker容器的指令由為重要?。?! 因?yàn)槿萜鞑攀菍?shí)例

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

數(shù)據(jù)卷是什么和作用?思考為什么需要數(shù)據(jù)卷?

1,Docker容器刪除后,在容器中產(chǎn)生的數(shù)據(jù)還在嗎?不在

2,docker容器和外部機(jī)器可以直接交換文件嗎? 不能

3,容器之間想要進(jìn)行數(shù)據(jù)交互?就用到了數(shù)據(jù)卷

數(shù)據(jù)卷的概念:

宿主機(jī)中的一個(gè)目錄或文件,在react中相當(dāng)于context,當(dāng)容器和數(shù)據(jù)卷目錄綁定后,對(duì)方的修改會(huì)立即同步,一個(gè)數(shù)據(jù)卷可以被多個(gè)數(shù)據(jù)卷同事掛載,一個(gè)容器中也可以被掛載多個(gè)數(shù)據(jù)卷。

數(shù)據(jù)卷的作用:

  • 容器數(shù)據(jù)的持久化;

  • 外部機(jī)器和容器間接通信;

  • 容器之間數(shù)據(jù)交換;

如何配置數(shù)據(jù)卷

創(chuàng)建啟動(dòng)容器時(shí),使用-v參數(shù)設(shè)置數(shù)據(jù)卷;

docker run ... -v [宿主機(jī)目錄(文件):容器內(nèi)目錄(文件)] ...
docker run -it -v ~/Desktop/data:/root/data_container --name=c3 centos:7 /bin/bash  #適合mac電腦

參數(shù)一定要注意:目錄必須是絕對(duì)路徑;如果目錄不存在,會(huì)自動(dòng)進(jìn)行創(chuàng)建;可以?huà)燧d多個(gè)數(shù)據(jù)卷;

一個(gè)容器掛載多個(gè)數(shù)據(jù)卷:

docker run -it --name=c4 \
-v ~/Desktop/data1:/root/data1 \
-v ~/Desktop/data2:/root/data2 \
centos:7 /bin/bash

兩個(gè)容器鏈接同一個(gè)數(shù)據(jù)卷:

#創(chuàng)建連個(gè)容器
docker run -it --name:c5 -v ~/Desktop/data:/root/data centos:7
docker run -it --name:c6 -v ~/Desktop/data:/root/data centos:7
#這樣c5和c6中的data就都和宿主機(jī)的data數(shù)據(jù)卷相同。這樣就可以共享一份數(shù)據(jù)卷了
數(shù)據(jù)卷容器

如果想多容器進(jìn)行數(shù)據(jù)交換:

方案1:多個(gè)容器掛載在同一個(gè)數(shù)據(jù)卷;

方案2: 數(shù)據(jù)卷容器;

容器卷容器和宿主機(jī)直接進(jìn)行數(shù)據(jù)通信,專(zhuān)門(mén)的數(shù)據(jù)容器

#1 創(chuàng)建啟動(dòng)c3數(shù)據(jù)卷容器,使用-v參數(shù)數(shù)據(jù)卷 c3就是一個(gè)數(shù)據(jù)卷容器了 此刻的目錄是容器目錄 沒(méi)有容器卷的目錄 docker會(huì)在宿主機(jī)上自動(dòng)分配一個(gè)目錄進(jìn)行同步
docker run -it --name=c3 -v /volume centos:7 /bin/bash
#2 創(chuàng)建啟動(dòng)c1 c2 容器,使用--volumes-from參數(shù)設(shè)置數(shù)據(jù)卷
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c3 --volumes-from c3 centos:7 /bin/bash

問(wèn)題:這里為什么要用專(zhuān)門(mén)一個(gè)容器去存放數(shù)據(jù)呢,而不是一個(gè)個(gè)容器去配置同一個(gè)外部數(shù)據(jù)卷呢?

一般docker管理的Linux服務(wù)器上面,可以通過(guò)創(chuàng)建一個(gè)數(shù)據(jù)卷容器來(lái)專(zhuān)門(mén)保管數(shù)據(jù)和進(jìn)行數(shù)據(jù)通信,宿主機(jī)此刻的作用就是一個(gè)備份數(shù)據(jù)的作用。這樣所有的操作都變成了容器化操作,更加統(tǒng)一。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容