一文带你认识Docker
Docker是一個(gè)容器技術(shù)的應(yīng)用,而底層是由于Linux容器實(shí)現(xiàn)的,Docker只是實(shí)現(xiàn)層。
一、Linux容器
1、隔離與共享
一臺(tái)服務(wù)器運(yùn)行著多個(gè)邏輯隔離的服務(wù)器進(jìn)程,誰的運(yùn)行環(huán)境都不希望影響到誰,也就是一個(gè)物理機(jī)需要虛擬出多個(gè)環(huán)境或容器,Linux提供一種創(chuàng)建和進(jìn)入容器的方式,操作系統(tǒng)讓應(yīng)用程序就像在獨(dú)立的機(jī)器上運(yùn)行一樣,但又能共享很多底層的資源。
2、實(shí)現(xiàn)基礎(chǔ)
Linux容器功能是基于cgroups和Namespace實(shí)現(xiàn)的。
(1)cgroups(control groups 控制組)
cgroups是將進(jìn)程分組管理的內(nèi)核功能,通過cgroups可以隔離進(jìn)程,同時(shí)還可以隔離進(jìn)程的資源占用(cpu,內(nèi)存等)情況,在操作系統(tǒng)底層限制物理資源,起到container的作用,進(jìn)程可用的cpu資源由cpuset指定。
(2)Namespace
Namespace讓每個(gè)進(jìn)程擁有獨(dú)立的PID、IPC和網(wǎng)絡(luò)空間。Namespace是通過clone系統(tǒng)調(diào)用來實(shí)現(xiàn)的。clone系統(tǒng)調(diào)用的第三個(gè)參數(shù)flags就是通過設(shè)置Namespace來劃分資源的。
Linux一共構(gòu)建了6種不同的Namespace,用于不同場(chǎng)景下的隔離
- Mount - 隔離文件系統(tǒng)掛載點(diǎn)
- UTS - 隔離主機(jī)名和域名
- IPC - 隔離進(jìn)程間通信資源
- PID - 隔離PID空間
- Network - 隔離網(wǎng)絡(luò)接口
- User - 隔離用戶/用戶組空間
二、Docker簡(jiǎn)介
1、是什么
Docker是一個(gè)開源的應(yīng)用容器引擎,可以輕松的為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的、可移植的、自給自足的容器。開發(fā)者在本地編譯通過的容器可以批量的在生產(chǎn)環(huán)境上部署。
Docker類似于集裝箱,各式各樣的貨物,經(jīng)過集裝箱的標(biāo)準(zhǔn)化進(jìn)行托管,而集裝箱與集裝箱之前沒有影響。Docker是一個(gè)開放平臺(tái),使開發(fā)人員和管理員可以在稱為容器的松散隔離的環(huán)境中構(gòu)建鏡像、交互和運(yùn)行分布式應(yīng)用程序,以便在開發(fā)、QA和生產(chǎn)環(huán)境之間進(jìn)行高效的應(yīng)用程序生命周期管理。
2、Docker三個(gè)重要組件
(1)鏡像(images)
一個(gè)特殊的文件系統(tǒng)。操作系統(tǒng)分為內(nèi)核和用戶空間,對(duì)于Linux來說,內(nèi)核啟動(dòng)后會(huì)掛載root文件系統(tǒng)為其提供用戶控件的支持。而Docker鏡像,就相當(dāng)于是一個(gè)root文件系統(tǒng)。
除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含一些為運(yùn)行時(shí)準(zhǔn)備的配置參數(shù)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
鏡像實(shí)際是由多層文件系統(tǒng)聯(lián)合組成。鏡像構(gòu)建時(shí),會(huì)一層一層構(gòu)建,前一層是后一層的基礎(chǔ)。每一層構(gòu)建完就不會(huì)再改變,后一層上的任何改變只發(fā)生在當(dāng)前層。比如:刪除前一層文件的操作,實(shí)際不是真的刪除前一層的文件,而是僅把當(dāng)前層標(biāo)記為該文件已刪除。
分層存儲(chǔ)的特征還使得鏡像的復(fù)用、定制變的更為容易。甚至可以用之前構(gòu)建好的鏡像作為基礎(chǔ)層,然后進(jìn)一步添加新的層,以定制自己所需的內(nèi)容,構(gòu)建新的鏡像。
(2)容器(Container)
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的類和實(shí)例,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、暫停、停止、刪除等。
容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行與屬于自己獨(dú)立的命名空間,容器也是分層存儲(chǔ)。
容器存儲(chǔ)層的生命周期跟容器一樣,容器消亡時(shí),容器存儲(chǔ)層也會(huì)消亡,任何保存于容器存儲(chǔ)層的信息都會(huì)丟失。
容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫入任何數(shù)據(jù),容器存儲(chǔ)層也要保持無狀態(tài)化。所有的文件寫入操作,都應(yīng)該使用數(shù)據(jù)卷、或者綁定宿主目錄,在這些位置的讀寫會(huì)跳過存儲(chǔ)層,直接對(duì)宿主發(fā)生讀寫,其性能和穩(wěn)定性更高。容器消亡后數(shù)據(jù)卷的數(shù)據(jù)不會(huì)丟失。
容器在整個(gè)應(yīng)用程序生命周期工作流中提供以下優(yōu)點(diǎn):隔離性、可移植性、靈活性、可伸縮性和可控性。 最重要的優(yōu)點(diǎn)是可在開發(fā)和運(yùn)營(yíng)之間提供隔離。
(3)倉(cāng)庫(kù)(Registry)
Docker Registry是一個(gè)集中存儲(chǔ)、分發(fā)鏡像的服務(wù)。
一個(gè)Registry可以包含多個(gè)倉(cāng)庫(kù)(Repository),每個(gè)倉(cāng)庫(kù)只包含一種軟件,但可以包含多個(gè)標(biāo)簽(tag,也就是版本),每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。
這三個(gè)組件的關(guān)系如下圖,比如有兩個(gè)倉(cāng)庫(kù),分別是Redis和MySQL
3、docker持續(xù)開發(fā)工作流
二、Docker安裝、卸載
環(huán)境:Centos7
1、安裝
Centos有配置docker社區(qū)版的yum包,所以安裝比較方便。
1、先更新yum安裝包
sudo yum update
2、安裝docker
yum install docker-ce
3、安裝之后查看docker版本,也可以用docker info
docker version
4、如果出現(xiàn)Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
啟動(dòng)docker
service docker start
5、配置開機(jī)啟動(dòng)
sudo systemctl enable docker
docker默認(rèn)是docker官方的下載源,下載速度會(huì)比較慢,所以一般是配置國(guó)內(nèi)的下載源,這里介紹阿里的下載源。
1、登陸阿里云獲取鏡像加速器地址
https://cr.console.aliyun.com/undefined/instances/mirrors
上圖中就有針對(duì)各種服務(wù)器的配置詳情。
2、卸載
(1)首先查看安裝的Docker yum包
yum list installed | grep docker
(2)依次卸載yum包
yum -y remove 包名
(3)卸載掉之后,依次刪除目錄
rm -rf /etc/docker
rm -rf /run/docker
rm -rf /var/lib/dockershim
rm -rf /var/lib/docker
如果出現(xiàn)如下錯(cuò)誤:
rm: cannot remove ‘/var/lib/docker/containers’: Device or resource busy
執(zhí)行如下命令:
cat /proc/mounts|grep containers
umount /var/lib/docker/containers/
===============================
我是Liusy,一個(gè)喜歡健身的程序員。
獲取更多干貨以及最新消息,請(qǐng)關(guān)注公眾號(hào):上古偽神
如果對(duì)您有幫助,點(diǎn)個(gè)關(guān)注就是對(duì)我最大的支持!!!
總結(jié)
以上是生活随笔為你收集整理的一文带你认识Docker的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: objc语言的运行时处理
- 下一篇: python制作定时发送信息脚本