docker基礎(chǔ)教程二(基礎(chǔ)命令&鏡像原理)

docker基礎(chǔ)命令&鏡像原理

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 原創(chuàng)者:文思

一、阿里云鏡像加速配置

鏡像放在github上,但由于一些原因,訪問國外站點很慢,好在有阿里。

https://dev.aliyun.com/search.html

注冊一個阿里云帳戶,登陸開發(fā)者中心,獲取加速器地址

二、Hello-World

1、開啟服務(wù)并運行hello-world:

Unable tofind image 'hello-world:latest' locally

latest:Pulling from hello-world

表示第一次沒有從本地獲取hello-world鏡像,準(zhǔn)備從GitHub上拉取一個hello-world鏡像并在容器內(nèi)運行。

b6d845cb453c:Pull complete

3535063d9957:Pull complete

Digest:sha256:135a30bd414bd8d23e386763e36f3dc4ee8ed25d2d6068082c0af796513d9d0d

Status: Downloadednewer image for hello-world:latest

拉取成功。

2、運行原理

Docker是一個cs結(jié)構(gòu)的系統(tǒng),Docker守護進行運行在主機上,然后通過Socket連接從客戶端訪問。

比較兩圖的差異,左圖虛擬機的Guest OS層和Hypervisor層在docker中被Docker Engine層所替代。

(1)docker有著比虛擬機更少的抽象層。由于docker不需要Hypervisor實現(xiàn)硬件資源虛擬化,運行在docker容器上的程序直接使用的都是實際物理機的硬件資源。因此在CPU、內(nèi)存利用率上docker將會在效率上有優(yōu)勢。

(2)docker利用的是宿主機的內(nèi)核,而不需要Guest OS。因此,當(dāng)新建一個容器時,docker不需要和虛擬機一樣重新加載一個操作系統(tǒng)內(nèi)核。我們知道,引導(dǎo)、加載操作系統(tǒng)內(nèi)核是一個比較費時費資源的過程,當(dāng)新建一個虛擬機時,虛擬機軟件需要加載Guest OS,這個新建過程是分鐘級別的。而docker由于直接利用宿主機的操作系統(tǒng),則省略了這個過程,因此新建一個docker容器只需要幾秒鐘。

3、Docker幫助命令

docker version

docker info

docker –help

三、常用命令

根據(jù)圖表可以理解為,鯨魚=docker,集裝箱=容器實例

1、鏡像命令

docker? images:列出本地主機上的鏡像

可用參數(shù)-a? -q? -qa

REPOSITORY:表示鏡像的倉庫源

TAG:鏡像標(biāo)簽

IMAGEID:鏡像ID

CREATED:鏡像創(chuàng)建時間

SIZE:鏡像大小

同一個倉庫源可以有多個TAG,代表這個倉庫源的不同版本,我們使用REPOSITORY:TAG來定義不同的鏡像。如果不指定鏡像的版本標(biāo)簽,將默認(rèn)使用latest。

docker? serarch:查找docker上鏡像

網(wǎng)站https://hub.docker.com

運行命令docker search tomcat:

圖中的stars代表的點贊數(shù),當(dāng)然點贊越多越受歡迎

docker search –s 30 tomcat:找點贊數(shù)超過30的tomcat

docker?pull鏡像名[:TAG]:拉取鏡像,TAG可不寫,默認(rèn)拉最新的latest

可以看到已經(jīng)把tomcat拉取到本地了。

docker? rmi鏡像名:刪除本地鏡像

docker rmi hello-world:因為hello-world鏡像在被使用,所以無法刪除。

使用-f參數(shù)強制刪除,docker rmi? –f?hello-world可以看到已強制刪除:

刪除多個鏡像,鏡像之間用空格:docker? rmi? –f鏡像1 鏡像2

刪除全部鏡像:docker? rmi? -f? $(docker?images? -qa)

2、容器命令

docker pull

centos 提前拉取centos鏡像做演示用。

docker?run?[OPTIONS]?IMAGE [COMMAND][ARG…]:docker的主流命令之一,新建并啟動容器。

OPTIONS說明(常用):有些是一個減號,有些是兩個減號

--name=”容器新名字”:為容器指定一個名稱

-d:后臺運行容器,并返回容器ID,即啟動守護線程式容器

-i:以交互模式運行容器,通常與-t同時使用。

-t:為容器重新分配一個偽輸入終端。

上圖表示以88ec626ba223為模板生成了一個cae36ac3a0a4這樣的容器。

ll命令可以看到這是一個標(biāo)準(zhǔn)的centos:

關(guān)閉并退出容器:exit

或者Ctrl+p+q只退出但并不關(guān)閉容器

docker? ps? [OPTIONS]列出當(dāng)前正在運行的容器

docker?start? 容器名:啟動容器

docker?stop? 容器名:停止容器

docker?kill?? 容器名:強制停止容器:

docker rm ID[name]:刪除已關(guān)閉的容器,加-f強制刪除

還記的刪除全部鏡像的命令嗎,舉一反三,刪除全部容器:

docker rm –f?${docker ps -a -q}

重要內(nèi)容:重要內(nèi)容:重要內(nèi)容:

很重要的一點說明:docker容器后臺運行,就必須有一個前臺進程。

容器運行的命令如果不是那些一直掛起的命令(比如top,tail),就會自動退出。

可以看到啟動后就立刻退出了。

這是docker的機制問題,比如web容器ngix為例,正常情況下配置啟動服務(wù)service ngix start,ngix作為后臺進行模式運行,這樣導(dǎo)致docker前臺沒有運行的應(yīng)用,docker認(rèn)為沒有前端交互,覺得沒什么事可做,所以就自動關(guān)閉了。

所以最佳解決方案是將要運行的程序以前臺進程的形式運行:docker run –d centos /bin/sh –c “whiletrue;do echo hello;sleep 2;done”

以上命令是以守護進程方式啟動docker并彈出交互偽終端,并在偽終端中進行腳本輸出”每2秒無線循環(huán)輸出hello”。這樣docker就感覺到一直存在前端交互,所以不會自動關(guān)閉。

docker logs -t -f 765eefae47d8查看docker的日志可以看到每2秒就輸出

查看容器內(nèi)進程:docker?top容器id

查看容器內(nèi)部細(xì)節(jié):docker? inspect?容器id

重新進入已啟動的容器:docker attach 容器ID

啟動容器后,Ctrl+p+q退出不關(guān)閉容器,再docker attach ez6d44eb3e11:

已重新進入容器(沒有啟動新的進程)。

docker exec 在docker外的宿主機上進行docker內(nèi)部操作(啟動了新的進程),

示例:docker exec -t ea6d44eb3e11 ls -l /tmp

docker exec -it ea6d44eb3e11 /bin/bash

可以看到exec可以外部直接操作docker內(nèi)部,也可以進入docker后再操作,由此可見功能比attach強大。

容器內(nèi)文件拷貝到主機:docker? cp容器ID:容器內(nèi)路徑 目的主機路徑

其它命令自行學(xué)習(xí)擴展。

四、鏡像原理

1、鏡像原理

鏡像:聯(lián)合文件系統(tǒng)(UnionFS)是鏡像的基礎(chǔ),聯(lián)合文件系統(tǒng)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加。同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下。

Docker鏡像的加載原理:

Docker的鏡像由一層一層的文件系統(tǒng)組成(聯(lián)合文件系統(tǒng)),bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引導(dǎo)加載kernel,Linux剛啟動時會加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs,這一層與典型的linux系統(tǒng)一樣,包含boot加載器和內(nèi)核。rootfs(root file system)在bootfs之上,包含的就是典型的linux系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件。換句話說rootfs就是不同的操作系統(tǒng)的發(fā)行版本,比如Ubntu,Centos等。

可以看到docker中CentOS為什么還不到200M,一般我們用的都是好幾個G。

因為對于一個精簡的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序庫就可以了,因為底層直接用Host的kernel,自己只需提供rootfs就可以了。

但為什么tomcat那么大?需要理解docker的聯(lián)合文件系統(tǒng)的分層理念

這樣的好處就是每層的資源可以進行共享。

Docker鏡像都是只讀的,當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部,這一層通常被稱作“容器層”,容器層之下的都叫鏡像層。

2、鏡像commit

docker commit:提交容器副本使之成為一個新的鏡像

到這了,感覺有了一點實戰(zhàn)的味道了。

案例演示:

docker run -it -p 8080:8080 tomcat

可以看到tomcat啟動啦。命令中的8080:8080就表示將tomcat的8080端口影射到docker的8080端口(docker端口:tomcat端口)

訪問122服務(wù)器上的docker的8080端口,可以看到tomcat及文檔的頁面。

刪除tomcat鏡像中的文檔,模擬tomcat的自定義配置操作:

然后再訪問122服務(wù)器上的docker的8080端口,查看tomcat文檔的頁面:

可以看到這里已經(jīng)沒有文檔頁面了。將此配置好的tomcat作為新鏡像提交,鏡像名叫t1/appTomcat1(t1是自定義的包路徑):

可以看到已經(jīng)提交到本地了一個新鏡像。然后把正在運行的容器刪除以驗證:

啟動新鏡像tomcat,這次用docker7777端口來映射tomcat的8080:

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

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

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