Docker容器虛擬化平臺(tái)。
接觸docker很長(zhǎng)時(shí)間了,但是工作中也沒有用到,所以總是學(xué)了忘,忘了學(xué)。不過這次,我打算跟大家分享一下我的學(xué)習(xí)歷程,也算是我的獨(dú)特的復(fù)習(xí)筆記,我會(huì)在這一篇中講清楚docker幾乎所有的功能。不過也是我第一次寫,而且是一篇兩萬(wàn)多字的長(zhǎng)文,花了我半個(gè)月里所有的休閑娛樂時(shí)間,所以寫的不好的地方請(qǐng)大家見諒,也請(qǐng)?jiān)谠u(píng)論區(qū)斧正,謝謝大家的理解。
Docker,翻譯過來(lái)就是碼頭工人
Docker是一個(gè)開源的應(yīng)用容器引擎,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可抑制的容器中,然后發(fā)布到任何流行的Linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化。容器完全使用沙盒機(jī)制,相互之間不會(huì)存在任何接口。幾乎沒有性能開銷,可以很容易的在機(jī)器和數(shù)據(jù)中心運(yùn)行。最重要的是,他們不依賴于任何語(yǔ)言、框架或者包裝系統(tǒng)。
小知識(shí):沙盒也叫沙箱(sandbox)。在計(jì)算機(jī)領(lǐng)域指一種虛擬技術(shù),而且多用于計(jì)算機(jī)安全技術(shù)。安全軟件可以讓它在沙盒中運(yùn)行,如果含有惡意行為,則禁止程序的進(jìn)一步運(yùn)行,而這不會(huì)對(duì)系統(tǒng)造成任何危害。
Docker是dotCloud公司開源的一個(gè)基于LXC的高級(jí)容器引擎,源碼托管在Github上,基于go語(yǔ)言并且遵從Apache2.0協(xié)議開源。
GitHub地址:https://github.com/moby/moby
小知識(shí):LXC為L(zhǎng)inux Container的簡(jiǎn)寫。Linux Container 容器是一種內(nèi)核虛擬化技術(shù),可以提供輕量級(jí)的虛擬化,以便隔離進(jìn)程和資源,而且不需要提供指令解釋機(jī)制以及全虛擬化的其他復(fù)雜性。
LXC主要通過Kernel的namespace實(shí)現(xiàn)每個(gè)用戶實(shí)例之間的項(xiàng)目隔離,通過cgroup實(shí)現(xiàn)對(duì)資源的配額和調(diào)度。
docker官網(wǎng):https://www.docker.com
docker中文庫(kù):https://www.docker.org.cn/
相同點(diǎn):docker和容器技術(shù)和虛擬機(jī)技術(shù),都是虛擬化技術(shù)。
不同點(diǎn):
虛擬機(jī)技術(shù):
容器技術(shù):
通過圖片,我們很明顯的看到容器少了一層Guest OS,也就是少了虛擬機(jī)操作系統(tǒng)這一層,所以docker效率比虛擬機(jī)效率高。達(dá)到了秒級(jí)啟動(dòng)的地步。
docker相較于VM的優(yōu)點(diǎn):
1、比VM小、快,Docker容器的尺寸減小相比于整個(gè)虛擬機(jī)大大簡(jiǎn)化了分布
到云和分發(fā)時(shí)間的開銷。Docker啟動(dòng)一個(gè)容器實(shí)例時(shí)間僅僅需要幾秒鐘。
2、Docker是一個(gè)開放的平臺(tái),構(gòu)建、發(fā)布和運(yùn)行分布式應(yīng)用程序。
3、開發(fā)人員不需要關(guān)系具體是哪個(gè)Linux操作系統(tǒng)
4、Google、微軟(azure)、亞馬遜、IBM等都支持docker。
5、Docker支持Unix/Linux操作系統(tǒng),也支持Windows和Mac。
Docker局限性:
Docker用于應(yīng)用程序時(shí)是最有用的,但并不包含數(shù)據(jù)。日志、數(shù)據(jù)庫(kù)等通常放在Docker容器外。一個(gè)容器的鏡像通常都很小,不用和存儲(chǔ)大量數(shù)據(jù),存儲(chǔ)可以通過外部掛載等方式使用,比如:NFS、ipsan、MFS等 ,或者docker命令 ,-v映射磁盤分區(qū)。
總之,docker只用于計(jì)算,存儲(chǔ)交給別人。
Docker核心技術(shù):
1、Namespace —> 實(shí)現(xiàn)Container的進(jìn)程、網(wǎng)絡(luò)、消息、文件系統(tǒng)和主機(jī)名的隔離。
2、Cgroup —> 實(shí)現(xiàn)對(duì)資源的配額和調(diào)度。
注意:Cgroup的配額,可以指定實(shí)例使用的CPU個(gè)數(shù),內(nèi)存大小等。
文件系統(tǒng)隔離:每個(gè)進(jìn)程容器運(yùn)行在一個(gè)完全獨(dú)立的根文件系統(tǒng)里。
資源隔離:系統(tǒng)資源,像CPU和內(nèi)存等可以分配到不同的容器中,使用cgroup。
網(wǎng)絡(luò)隔離:每個(gè)進(jìn)程容器運(yùn)行在自己的網(wǎng)路空間,虛擬接口和IP地址。
日志記錄:Docker將收集到和記錄的每個(gè)進(jìn)程容器的標(biāo)準(zhǔn)流(stdout/stderr/stdin),用于實(shí)時(shí)檢索或者批量檢索
變更管理:容器文件系統(tǒng)的變更可以提交到新的鏡像中,并可重復(fù)使用以創(chuàng)建更多的容器。無(wú)需使用模板或者手動(dòng)配置。
交互式shell:Docker可以分配一個(gè)虛擬終端并且關(guān)聯(lián)到任何容器的標(biāo)準(zhǔn)輸出上,例如運(yùn)行一個(gè)一次性交互shell。
首先我問大家一個(gè)問題,你們知道docker有幾種安裝方式嗎?
它們又有那些區(qū)別呢?
Docker安裝:
1、yum -y install docker2、yum -y install docker-engine3、yum -y install docker-ce
是的,有三種安裝方式,而且,它們都是正確的!
因?yàn)镈ocker最早的版本名是docker和docker-engin,現(xiàn)在的名字是docker-ce和docker-ee。有興趣的小伙伴可以通過下方鏈接去官網(wǎng)查看。
https://docs.docker.com/engine/install/centos/
實(shí)驗(yàn)環(huán)境:centos7.6 64位。網(wǎng)絡(luò)要求能上外網(wǎng)。
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager命令作用是添加yum源。
敲完命令之后大家執(zhí)行一下命令去看一下有沒有配置成功。
cd /etc/yum.repos.d ls
yum -y install docker-ce doker-ce-cli containerd.io
安裝速度可能會(huì)比較慢,請(qǐng)耐心等待。
docker-ce:docker程序
docker-ce-cli:
如果不知道包名的作用,可以使用yum info 程序 命令查看
默認(rèn)會(huì)自動(dòng)開啟。
路徑 :/proc/sys/net/ipv4/ip_forward
手動(dòng)開啟:
vim /etc/sysctl.conf #插入以下內(nèi)容 net.ipv4.forward =1-------------------------sysctl -p #生效 cat /proc/sys/net/ipv4/ip_forward #查看結(jié)果,為1開啟成功。
如果沒有開啟網(wǎng)絡(luò)轉(zhuǎn)發(fā),我們啟動(dòng)實(shí)例的時(shí)候就會(huì)報(bào)錯(cuò)?。。?/strong>
關(guān)閉防火墻:
iptables -nL #查看一下iptable規(guī)則,關(guān)閉防火墻后會(huì)自動(dòng)插入新規(guī)則
systemctl stop firewalld && systemctl disable firewalld #關(guān)閉防火墻
sysctlrem restart docker # 關(guān)閉防火墻要把docker重啟一下,不然docker
的ip包轉(zhuǎn)發(fā)功能無(wú)法使用。即便防火墻關(guān)閉了,docker依舊會(huì)調(diào)用內(nèi)核模塊netfilter增加規(guī)則,所以會(huì)新增iptables規(guī)則
iptables -nL #再查看一下iptable規(guī)則,會(huì)發(fā)現(xiàn)多出很多規(guī)則
iptables -nL
systemctl start docker && systemctl enable docker
啟動(dòng)完成后會(huì)該網(wǎng)絡(luò)參數(shù),這個(gè)是ip轉(zhuǎn)發(fā)會(huì)改成1。默認(rèn)0
docker version #查看docker版本
docker info #查看docker基本信息
我們可以通過docker info看到機(jī)器存放docker鏡像得地址,也可以看到docker倉(cāng)庫(kù)的地址。
docker search
docker search centos #從docker hub中搜索docker名為centos的鏡像
description:此鏡像的描述
stars:下載次數(shù)
official:是否由官方提供(官方提供可放心下載,可以基于此鏡像做自己的鏡像)
docker pull== ,默認(rèn)是拉去docker hub上搜索到的最新版本(第一個(gè))。
docker pull centos
使用阿里云docker鏡像加速器。
地址:https://cr.console.aliyun.com的控制臺(tái),使用支付寶賬號(hào)登錄,左側(cè)加速器幫助頁(yè)面會(huì)為你顯示獨(dú)立的加速地址,這個(gè)加速地址每個(gè)人的都不同。
{
'registry-mirrors': ['https://eu5rxjvf.mirror.aliyuncs.com']}systemctl daemon-reload #啟動(dòng)配置
systemctl restart docker #重啟docker服務(wù)
配置好了之后,我們使用之前學(xué)的命令,docker info查看一下是否新增了阿里云的地址。
然后繼續(xù)使用docker pull centos,下載速度會(huì)很快。(由于作者已經(jīng)下載了centos,這里使用tomcat鏡像演示)
拉去之后我們要如何看到我們下載下來(lái)的鏡像呢,這里我們就需要學(xué)習(xí)一個(gè)新命令。docker images,查看已下載鏡像。
docker images #查看已下載鏡像。
比如把docker-centos-httpd.tar鏡像上傳到linux上,就需要用到==docker load -i ==命令。(記得帶上路徑,這里作者沒有錢買U盤,就不演示了)
docker load -i /root/docker-centos-httpd.tar
導(dǎo)入之后可以使用docker images查看。
docker pull hub.c.163.com/library/tomcat:latest
注:docker鏡像相當(dāng)于,對(duì)程序+程序依賴的庫(kù)直接打包(后期詳細(xì)解釋)。
很開心大家耐心的看到了這里,接下來(lái)我就會(huì)詳細(xì)講解docker的使用方法。
docker version #顯示docker詳細(xì)信息
docker info #顯示docker的系統(tǒng)信息,包括鏡像和容器的數(shù)量
docker --help #docker幫助命令手冊(cè)
docker images #查看所有本地主機(jī)的鏡像 docker search 鏡像名 #搜索鏡像 docker pull 鏡像名 [標(biāo)簽] #下載鏡像(如果不寫tag,默認(rèn)是latest) docker rmi 鏡像名 [標(biāo)簽] #刪除鏡像 docker rmi -f $(docker images -aq) 刪除全部鏡像 docker tag 鏡像名:版本 新鏡像名:版本 #復(fù)制鏡像并且修改名稱 docker commit -a 'xxx' -c 'xxx' 鏡像ID 名字:版本 #提交鏡像 -a :提交的鏡像作者;-c :使用Dockerfile指令來(lái)創(chuàng)建鏡像;-m :提交時(shí)的說(shuō)明文字; docker load -i /xxx/xxx.tar #導(dǎo)入鏡像 docker save -o /xxx/xxx.tar #保存一個(gè)鏡像為一個(gè)tar包
docker run [可選參數(shù)] image 命令 #啟動(dòng)容器(無(wú)鏡像會(huì)先下載鏡像)
#參數(shù)說(shuō)明--name = 'Name' 容器名字-c 后面跟待完成的命令-d 以后臺(tái)方式運(yùn)行并且返回ID,啟動(dòng)守護(hù)進(jìn)程式容器-i 使用交互方式運(yùn)行容器,通常與t同時(shí)使用-t 為容器重新分配一個(gè)偽輸入終端。也即啟動(dòng)交互式容器-p 指定容器端口 -p 容器端口:物理機(jī)端口 映射端口-P 隨機(jī)指定端口-v 給容器掛載存儲(chǔ)卷
docker build #創(chuàng)建鏡像 -f:指定dockerfile文件路徑 -t:鏡像名字以及標(biāo)簽
docker logs 容器實(shí)例的ID #查看容器日志
docker rename 舊名字 新名字 # 給容器重新命名
docker top 容器實(shí)例的ID #查看容器內(nèi)進(jìn)程
docker ps -a #列出所有容器(不加-a就是在運(yùn)行的)
docker rm 容器實(shí)例的ID #刪除容器(正在運(yùn)行容器不能刪除,除非加-f選項(xiàng))
docker kill 容器實(shí)例的ID #殺掉容器
docker history 容器實(shí)例的ID #查看docker鏡像的變更歷史
docker start 容器實(shí)例的ID #啟動(dòng)容器
docker restart 容器實(shí)例的ID #重啟容器
docker stop 容器實(shí)例的ID #停止正在運(yùn)行的容器
docker attach /docker exec 容器實(shí)例的ID #同為進(jìn)入容器命令,不同的是attach連接終止會(huì)讓容器退出后臺(tái)運(yùn)行,而exec不會(huì)。并且,docker attach是進(jìn)入正在執(zhí)行的終端,不會(huì)情動(dòng)新的進(jìn)程,而docker exec則會(huì)開啟一個(gè)新的終端,可以在里面操作。
docker image inspect 容器名稱:容器標(biāo)簽 #查看容器內(nèi)源數(shù)據(jù)
docker cp 容器id:容器內(nèi)路徑 目的主機(jī)路徑 #從容器內(nèi)拷貝文件到主機(jī)(常用)或者從主機(jī)拷貝到容器(一般用掛載)
exit #直接退出容器
crlt + P + Q #退出容器但是不終止運(yùn)行
docker search nginx
搜索到的這些鏡像代表什么意思之前已經(jīng)講過了,這里我們直接選用最新版本的。
docker pull nginx
未指定nginx則直接下載最新版本
docker images
這里有作者下載的其他鏡像。第一個(gè)就是我們剛剛下載的鏡像。
docker run -d --name nginx01 -p 80:80 nginx
e56開頭那個(gè)就是容器ID
docker ps
curl 127.0.0.1:80
127.0.0.1是本地回環(huán)ip,就是本機(jī)啦,可以用localhost代替。
docker exec -it 容器ID /bin/bash
whereis是一個(gè)搜索文件的小命令,不如find好用但是簡(jiǎn)潔。
用公網(wǎng)IP,這里作者有域名(順便給自己的網(wǎng)站打個(gè)廣告,作者喜歡寫東西,如果有投稿之類的可以留言,我會(huì)篩選之后放到我的博客網(wǎng)站,當(dāng)然也歡迎大家加入我,一起創(chuàng)建文字社區(qū)。
地址http://xiaodengzhp.xyz/wordpress/),所以用域名代替了。(注意,外網(wǎng)IP需要在云平臺(tái)打開端口,由于作者偷懶映射的80,所以沒有去打開,如果是其他端口,就要去打開。)
有的小伙伴不理解為什么要加/bin/bash,或者什么時(shí)候該加什么時(shí)候不加,這里我給大家解釋一下。
我們先看docker run的命令參數(shù)。
docker run [可選參數(shù)] image 命令 #啟動(dòng)容器(無(wú)鏡像會(huì)先下載鏡像) #參數(shù)說(shuō)明--name = 'Name' 容器名字-c 后面跟待完成的命令-d 以后臺(tái)方式運(yùn)行并且返回ID,啟動(dòng)守護(hù)進(jìn)程式容器-i 使用交互方式運(yùn)行容器,通常與t同時(shí)使用-t 為容器重新分配一個(gè)偽輸入終端。也即啟動(dòng)交互式容器-p 指定容器端口 -p 容器端口:物理機(jī)端口 映射端口-P 隨機(jī)指定端口-v 給容器掛載存儲(chǔ)卷
大家注意-i 、 -t 、 -d這幾個(gè)參數(shù)。一般it連用表示給我一個(gè)可以操作的前臺(tái)終端。第二個(gè)呢就是id,以后臺(tái)守護(hù)進(jìn)程的方式運(yùn)行容器。這樣,我們就可以總結(jié)出兩種運(yùn)行容器的命令模式。
第一種:交互方式創(chuàng)建容器,退出后容器關(guān)閉。
docker run -it 鏡像名稱:標(biāo)簽 /bin/bash
第二種:守護(hù)進(jìn)程方式創(chuàng)建容器。
docker run -id 鏡像名稱:標(biāo)簽
通過這種方式創(chuàng)建的容器,我們不會(huì)直接進(jìn)入到容器界面,而是在后臺(tái)運(yùn)行了容器,
如果我們需要進(jìn)去,則還需要一個(gè)命令。
docker exec -it 鏡像名稱:標(biāo)簽 /bin/bash
通過這種方式運(yùn)行的容器,就不會(huì)自動(dòng)退出了。
鏡像是一種輕量級(jí)的、可執(zhí)行的獨(dú)立軟件包。用來(lái)打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境的開發(fā)軟件,它包含運(yùn)行某個(gè)軟件所需要的內(nèi)容,包括代碼、運(yùn)行時(shí)、庫(kù)、環(huán)境變量和配置文件。
UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):UnionFS文件系統(tǒng)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層一層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。Union文件系統(tǒng)是Docker鏡像的基礎(chǔ)。鏡像可以通過分層來(lái)進(jìn)行繼承,基于基礎(chǔ)鏡像,可以制作各種各樣的應(yīng)用鏡像。
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但是從外面開起來(lái),只能看一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來(lái),最終的文件系統(tǒng)會(huì)包含所有的底層文件和目錄。
Docker鏡像加載原理
docker的鏡像實(shí)際上是由一層一層的文件系統(tǒng)組成,這種層級(jí)關(guān)系就叫UnionFS。
bootfs(boot file system)主要包括bootloader和kernel,bootloader主要是引導(dǎo)加載kernel,Linux剛啟動(dòng)時(shí)會(huì)加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當(dāng)boot加載完成之后整個(gè)內(nèi)核就在內(nèi)存中了,此時(shí)內(nèi)存的使用權(quán)由bootfs轉(zhuǎn)交給內(nèi)核,此時(shí)系統(tǒng)會(huì)卸載bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型Linux系統(tǒng)的/dev, /proc, /bin, /etc等等標(biāo)準(zhǔn)文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版本,比如Ubuntu、CentOS等。
如下圖:
這里我用docker pull nginx命令,下載來(lái)一個(gè)鏡像給大家看看,框起來(lái)的是不是一層一層下載的。
我們通過docker image inspect ngixn:latest查看一下。
這里大家看一下
docker commit 提交容器成為一個(gè)新的副本 docker commit -m='提交的描述信息' -a='作者' 容器id 目標(biāo)鏡像名:[TAG]
1、下載一個(gè)默認(rèn)的tomcat,這里作者已經(jīng)下載好了,就不用再下載了。
docker容器在產(chǎn)生數(shù)據(jù)的時(shí)候,如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)作為鏡像的一部分保存下來(lái),那么當(dāng)容器刪除之后,數(shù)據(jù)自然而然的也會(huì)消失。為了能保存數(shù)據(jù),容器中引用了數(shù)據(jù)卷的概念。
卷就是目錄或者文件,存在一個(gè)或者多個(gè)容器之中,由docker掛載到容器,但是不屬于聯(lián)合文件系統(tǒng),因此能夠繞過Union File System提供一些用于持續(xù)存儲(chǔ)或者共享數(shù)據(jù)的特性。
卷的設(shè)計(jì)目的就是數(shù)據(jù)的持久化,完全獨(dú)立于容器的生存周期,因此docker不會(huì)再容器刪除時(shí)刪除其掛載的數(shù)據(jù)卷。
它還存在以下幾種特點(diǎn):
1、數(shù)據(jù)卷可在容器之間共享或者重用數(shù)據(jù)。
2、卷中的更改可以直接生效。
3、數(shù)據(jù)卷中的更改不會(huì)包含在鏡像的更新中。
4、數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止。
方式一:直接使用命令來(lái)掛載 , -v
docker run -it -v 主機(jī)目錄:容器目錄 /bin/bash
我們?cè)趧?chuàng)建容器之前,先看看掛載路徑上有沒有test01這個(gè)目錄,可以看到,是沒有的。執(zhí)行命令之后進(jìn)入到容器內(nèi),我們ls看一下容器的home目錄,是空的。
docker run -it -v /home/test01:/home centos /bin/bash
這里先教給大家一個(gè)新武器。
docker volum ls#查看所有卷的情況。
我們首先使用匿名掛載的命令啟動(dòng)一個(gè)容器。
docker run -d -P --name=nginxt01 -v /etc/nginx nginx
然后使用剛剛教給大家的新武器查看卷。
具名掛載就很簡(jiǎn)單了,跟我們之前演示的指定路徑掛載很相似,這里給大家簡(jiǎn)單地演示一下。
同樣,我們使用具名掛載的方式啟動(dòng)一個(gè)容器。
docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx
docker volume ls 查看卷
這就是具名掛載。
如何確定是具名掛載還是匿名掛載:
-v 容器內(nèi)路徑 #匿名掛在
-v 卷名:容器內(nèi)路徑 #具名掛在
-v /宿主機(jī)路徑:容器內(nèi)路徑 # 指定路徑掛載
tips:
通過 -v 容器內(nèi)路徑 :ro rw 可以改變讀寫權(quán)限 ro readonly #只讀 rw readwrite #可寫可讀 例: docker run -d --name nginx01 -v test01:/etc/nginx:ro nginx docker run -d --name nginx01 -v test01:/etc/nginx:rw nginx
Dockerfile是一個(gè)創(chuàng)建鏡像所有命令的文本文件,包含了一條條指令和說(shuō)明, 每條指令構(gòu)建一層,,通過docker build命令,根據(jù)Dockerfile的內(nèi)容構(gòu)建鏡像,因此每一條指令的內(nèi)容, 就是描述該層如何構(gòu)建。有了Dockefile,,就可以制定自己的docker鏡像規(guī)則,只需要在Dockerfile上添加或者修改指令,,就可生成docker 鏡像。
dockerfile的關(guān)鍵字建議使用大寫,它是從上往下按照循序執(zhí)行的,在dockerfile中,#代表注釋。我們可以通過這個(gè)腳本來(lái)生成鏡像,腳本中的每一個(gè)命令,都是一層鏡像。
我們先通過下面這張圖片來(lái)理解一下鏡像的構(gòu)成以及運(yùn)行過程。
dockerfile是面向開發(fā)的,發(fā)布項(xiàng)目做鏡像的時(shí)候就要編寫dockerfile文件。
dockerfile:構(gòu)建文件,定義了一切的步驟,源代碼。
dockerImanges:通過dockerfile構(gòu)建生成的鏡像,最終發(fā)布和運(yùn)行的產(chǎn)品。
docker容器:容器就是鏡像運(yùn)行起來(lái)提供服務(wù)的。
Dockerfile 指令選項(xiàng):
FROM #基礎(chǔ)鏡像 。 (centos)
MAINTAINER #鏡像的作者和郵箱。(已被棄用,結(jié)尾介紹代替詞)
RUN #鏡像構(gòu)建的時(shí)候需要執(zhí)行的命令。
CMD #類似于 RUN 指令,用于運(yùn)行程序(只有最后一個(gè)會(huì)生效,可被替代)
EXPOSE #對(duì)外開放的端口。
ENV #設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。
ADD # 步驟:tomcat鏡像,這個(gè)tomcat壓縮包。添加內(nèi)容。
COPY #復(fù)制指令,將文件拷貝到鏡像中。
VOLUME #設(shè)置卷,掛載的主機(jī)目錄。
USER #用于指定執(zhí)行后續(xù)命令的用戶和用戶組,
這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。
WORKDIR #工作目錄(類似CD命令)。
ENTRYPOINT #類似于 CMD 指令,但其不會(huì)被 docker run
的命令行參數(shù)指定的指令所覆蓋,會(huì)追加命令。
ONBUILD #當(dāng)構(gòu)建一個(gè)被繼承Dokcerfile,就會(huì)運(yùn)行ONBUILD的指令。出發(fā)執(zhí)行。
注意:CMD類似于 RUN 指令,用于運(yùn)行程序,但二者運(yùn)行的時(shí)間點(diǎn)不同:
CMD 在docker run 時(shí)運(yùn)行。
RUN 是在 docker build。
作用:為啟動(dòng)的容器指定默認(rèn)要運(yùn)行的程序,程序運(yùn)行結(jié)束,容器也就結(jié)束。
CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運(yùn)行的程序所覆蓋。
如果 Dockerfile 中如果存在多個(gè) CMD 指令,僅最后一個(gè)生效。
LABEL(MAINTALNER已經(jīng)被棄用了,目前是使用LABEL代替)
LABEL 指令用來(lái)給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對(duì)的形式,語(yǔ)法格式如下:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
比如我們可以添加鏡像的作者:
LABEL org.opencontainers.image.authors='runoob'
Tips:構(gòu)建鏡像99%都是從scratch開始的,但是這個(gè)鏡像是個(gè)虛擬的概念,并不實(shí)際存在,表示一個(gè)空白的鏡像。
這里帶大家回顧一下docker history命令。接下來(lái)我們就要用dockfile制作屬于自己的鏡像了。
網(wǎng)址:https://hub.docker.com/
命令
docker login -u [賬號(hào)名字] #登陸命令 docker out #退出命令 docker push 賬號(hào)/容器名字:版本號(hào)
mkdir dockerfile
cd dockerfile
ls
首先,我們知道官方默認(rèn)的鏡像,比如centos鏡像里面,沒有vim、ipconfig等命令,我們就基于此,創(chuàng)建此鏡像。
vim mydockerfile
FORM centos
MAINTAINER ydk<123@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim-enhanced
RUN yum -y install net-tools
EXPOSE 80
CMD echo #MYPATH
CMD echo '------------END-------------'
CMD /bin/bash
docker build 命令:
docker build -f mydockerfile-t mycentos:1.0 .
到這里,我們就制作好了我們自己的鏡像,雖然它并沒有什么用。
這里我們?cè)賳?dòng)我們自己制作的鏡像,進(jìn)去看看我們寫的dockerfile都生效了沒有。
注:不加標(biāo)簽默認(rèn)是latest,所以docker run的時(shí)候要帶上鏡像標(biāo)簽。
官方文檔要求,我們推送的鏡像名字必須是YOUR_DOCKER_HUB_ID/XXXX,所以我們需要給鏡像換一個(gè)名字
docker tag mycentos/1.0 自己的賬號(hào)名字/mytomcat
docker push 自己的賬號(hào)名字/mytomcat
鏡像有點(diǎn)大,所以請(qǐng)耐心等待一下。等了幾分鐘之后,我們登陸docker hub就可以看到我們剛剛推送上去的鏡像啦,這個(gè)鏡像可是全世界人民都看得到的哦,是不是有點(diǎn)小激動(dòng)呢!
我們使用ifconfig可以看到三組網(wǎng)絡(luò)。
首先是docker0,這是我們本節(jié)的重點(diǎn),docker的網(wǎng)絡(luò)。之后是eth0,本機(jī)的外網(wǎng)地址。lo口,本地環(huán)回地址,可以代表localhost。
brctl show
docker rm -f $(docker ps -aq)docker rmi -f $(docker images -aq)
什么是veth-pair技術(shù)?要理解它,我們首先來(lái)啟動(dòng)兩個(gè)tomcat容器。
docker run -d -P --name=tomcat01 tomcat:7docker run -d -P --name=tomcat02 tomcat:7提示:選擇tomcat7是因?yàn)檫@個(gè)鏡像包含了ip addr 等常用命令!
啟動(dòng)機(jī)器之后,我們查看容器ip,通過容器的ip 去ping宿主機(jī)ip,發(fā)現(xiàn)是通的。
docker exec -it tomcat01 ip addr
ping 172.17.0.3
使用ip addr命令,查看我們的網(wǎng)卡。
什么是veth-pair?
veth-pair 就是一堆的虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一端連接著協(xié)議,一端連接著彼此。使得它充當(dāng)了一個(gè)橋梁的作用。
我們來(lái)繪制一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)模型,這樣veth-pair的作用就清晰明了了。
Host:容器不會(huì)虛擬出自己的網(wǎng)卡,配置主機(jī)的IP等,而是使用宿主機(jī)的IP和端口
Container: 創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP。(一般不用)
None: 該模式關(guān)閉了容器的網(wǎng)絡(luò)功能。(一般不用)
Bridge:默認(rèn)為該模式(橋接,自己創(chuàng)建也是用它),此模式會(huì)為每一個(gè)容器分配,設(shè)置IP等,并將容器連接到一個(gè)docker0 的虛擬網(wǎng)橋,通過docker 0 網(wǎng)橋以及iptables nat 表配置與宿主機(jī)通信。
docker network ls #列出docker網(wǎng)卡
我們直接啟動(dòng)命令, --net bridge,就是docker0(默認(rèn))
docker run -d -P --name=tomcat01 --net bridge tomcat
docker0特點(diǎn):默認(rèn),域名不能訪問,--link不建議使用
下面我們自己來(lái)創(chuàng)建一個(gè)bridge。
docker network create --driver bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 testnet docekr network ls
只需要兩條命令,你就創(chuàng)建完了自己的網(wǎng)絡(luò)!
docker network inspect 網(wǎng)卡名字 #查看網(wǎng)卡詳細(xì)信息
docker run -d -P --name=tomcat01-net --net=testnet tomcat:7docker run -d -P --name=tomcat02-net --net testnet tomcat:7
然后使用docker network inspect testnet,就可以看到剛才創(chuàng)建的這兩個(gè)容器的IP了。
docker exec -it tomcat01-net ping -c 3 IP
docker exec -it tomcat01-net ping -c 3 tomcat02-net
提示,ping -c可以自定義ping的次數(shù)
到這里,我們學(xué)習(xí)docker的腳步就告一段落了。陸陸續(xù)續(xù)寫了大半個(gè)月,我也終于寫完了我在CSDN的第一篇文章。希望我的付出,能帶給大家學(xué)習(xí)的動(dòng)力,容器其實(shí)并不難掌握,大家可能在剛剛接觸的時(shí)候很迷茫,不知道這是個(gè)啥。其實(shí)沒有關(guān)系,在你用著用著之后,容器的概念就會(huì)在你的腦子里漸漸形象起來(lái)。很感謝你看了這里,我也很希望能讓你對(duì)容器,有一定的認(rèn)識(shí),哈哈哈,就先寫到這兒吧,以后我還會(huì)更新其他內(nèi)容的,歡迎大家的關(guān)注。
聯(lián)系客服