国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
docker入門,這一篇就夠了。
userphoto

2023.06.08 浙江

關(guān)注

Docker入門,這一篇就夠了。

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背景介紹。

1、什么是docker。

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/

2、Docker容器技術(shù)與虛擬機(jī)的區(qū)別。

相同點(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ǔ)交給別人。

3、通過docker架構(gòu)圖初步了解docker。


等了解了docker之后,這張圖所代表的的內(nèi)容就很清晰明了,希望大家學(xué)完docker之后還能回來(lái)看看這張圖。這里簡(jiǎn)單給大家介紹一下docker的工作流程。
工作流程:
1、啟動(dòng)docker
2、下載鏡像到本地
3、啟動(dòng)docker容器實(shí)例
提示:大家可以去注冊(cè)一個(gè)dockerhub,之后會(huì)詳細(xì)給大家講解它的作用(非常重要!連docker hub賬號(hào)都沒有,玩什么docker!)。

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)存大小等。

4、Docker特性。

文件系統(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。

二、Docker的安裝。

1、docker安裝背景。

首先我問大家一個(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/


2017年初,docker公司將原先的docker開源項(xiàng)目改名為moby。
moby是集成了原先的docker項(xiàng)目,是社區(qū)維護(hù)的開源項(xiàng)目,誰(shuí)都可以在moby的基礎(chǔ)打造自己的容器產(chǎn)品。
docker-ce 是docker公司維護(hù)的開源項(xiàng)目,是一個(gè)基于moby項(xiàng)目的免費(fèi)容器產(chǎn)品。
docker-ee 是docker公司維護(hù)的閉源產(chǎn)品,是docker公司的商業(yè)昌平。
注:moby是源代碼,docker-ce 和docker-ee 是產(chǎn)品容器,rpm包。
所以,目前我們經(jīng)常使用的版本當(dāng)然是docker-ce啦!

2、部署docker容器虛擬化平臺(tái)并且配置docker鏡像加速地址。

實(shí)驗(yàn)環(huán)境:centos7.6 64位。網(wǎng)絡(luò)要求能上外網(wǎng)。

3、安裝docker依賴環(huán)境。

yum install -y yum-utils device-mapper-persistent-data lvm2


這里作者已經(jīng)安裝過了,所以提示Nothing to do。

4、配置國(guó)內(nèi)docker-ce的yum源(這里采用的是阿里云)

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


看到上圖中的框框里的內(nèi)容就代表配置成功了。

5、安裝docker。

yum -y install docker-ce doker-ce-cli containerd.io

安裝速度可能會(huì)比較慢,請(qǐng)耐心等待。
docker-ce:docker程序
docker-ce-cli:
如果不知道包名的作用,可以使用yum info 程序 命令查看

6、開啟網(wǎng)絡(luò)轉(zhuǎn)發(fā)功能。

默認(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

7、啟動(dòng)服務(wù)。

systemctl start docker && systemctl enable docker

啟動(dòng)完成后會(huì)該網(wǎng)絡(luò)參數(shù),這個(gè)是ip轉(zhuǎn)發(fā)會(huì)改成1。默認(rèn)0


這里簡(jiǎn)單教大家第一個(gè)docker命令,docker version查看docker版本。

docker version #查看docker版本


這里我們很清晰的可以看到docker是一個(gè)C/S架構(gòu)的模式??蛻舳耸俏覀兊拿钚胁僮?,服務(wù)端是一個(gè)守護(hù)進(jìn)程。

docker info  #查看docker基本信息

我們可以通過docker info看到機(jī)器存放docker鏡像得地址,也可以看到docker倉(cāng)庫(kù)的地址。

三、docker入門命令。

1、搜索鏡像

docker search

docker search centos #從docker hub中搜索docker名為centos的鏡像


大家可以看到搜索出來(lái)的最上一行有幾個(gè)表頭,這里給大家介紹一下
name:代表此鏡像的名稱

description:此鏡像的描述

stars:下載次數(shù)

official:是否由官方提供(官方提供可放心下載,可以基于此鏡像做自己的鏡像)

2、拉取鏡像。

docker pull== ,默認(rèn)是拉去docker hub上搜索到的最新版本(第一個(gè))。

docker pull centos


注意,如果這里報(bào)錯(cuò),TLS handshake timeout,那就是網(wǎng)絡(luò)原因?qū)е鲁瑫r(shí),嘗試多pull幾次。下面介紹配置鏡像加速。

使用阿里云docker鏡像加速器。
地址:https://cr.console.aliyun.com的控制臺(tái),使用支付寶賬號(hào)登錄,左側(cè)加速器幫助頁(yè)面會(huì)為你顯示獨(dú)立的加速地址,這個(gè)加速地址每個(gè)人的都不同。


可以通過修改daemon配置文件/etc/docker/daemon.json來(lái)使用加速器。
把自己的專屬加速地址放到下面的地址改一下,寫入文件就可以了。

{ '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鏡像演示)

3、查看鏡像。

拉去之后我們要如何看到我們下載下來(lái)的鏡像呢,這里我們就需要學(xué)習(xí)一個(gè)新命令。docker images,查看已下載鏡像。

docker images  #查看已下載鏡像。


好了,這樣就拉取下來(lái)了。

4、使用U盤的方式導(dǎo)入鏡像。

比如把docker-centos-httpd.tar鏡像上傳到linux上,就需要用到==docker load -i ==命令。(記得帶上路徑,這里作者沒有錢買U盤,就不演示了)

docker load -i /root/docker-centos-httpd.tar

導(dǎo)入之后可以使用docker images查看。


注意上圖,tag代表標(biāo)簽,image id代表鏡像ID。這是我們區(qū)別鏡像的方式。
另外提一下,還有一種直接下載其他站點(diǎn)鏡像的方法,命令如下:

docker pull hub.c.163.com/library/tomcat:latest

注:docker鏡像相當(dāng)于,對(duì)程序+程序依賴的庫(kù)直接打包(后期詳細(xì)解釋)。

四、Docker平臺(tái)的基本使用方法。

很開心大家耐心的看到了這里,接下來(lái)我就會(huì)詳細(xì)講解docker的使用方法。

1、幫助命令。

docker version #顯示docker詳細(xì)信息 docker info #顯示docker的系統(tǒng)信息,包括鏡像和容器的數(shù)量 docker --help #docker幫助命令手冊(cè)

2、鏡像命令。

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包

3、容器命令。

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)行

五、實(shí)戰(zhàn)測(cè)試:部署Nginx。

1、搜索鏡像。

docker search nginx
搜索到的這些鏡像代表什么意思之前已經(jīng)講過了,這里我們直接選用最新版本的。

2、下載鏡像。

docker pull nginx
未指定nginx則直接下載最新版本

3、查看鏡像。

docker images
這里有作者下載的其他鏡像。第一個(gè)就是我們剛剛下載的鏡像。

4、啟動(dòng)容器。

docker run -d --name nginx01 -p 80:80 nginx
e56開頭那個(gè)就是容器ID

5、查看容器。

docker ps

6、測(cè)試訪問。

curl 127.0.0.1:80
127.0.0.1是本地回環(huán)ip,就是本機(jī)啦,可以用localhost代替。

7、進(jìn)入容器修改頁(yè)面。

docker exec -it 容器ID /bin/bash
whereis是一個(gè)搜索文件的小命令,不如find好用但是簡(jiǎn)潔。

8、外網(wǎng)訪問。

用公網(wǎng)IP,這里作者有域名(順便給自己的網(wǎng)站打個(gè)廣告,作者喜歡寫東西,如果有投稿之類的可以留言,我會(huì)篩選之后放到我的博客網(wǎng)站,當(dāng)然也歡迎大家加入我,一起創(chuàng)建文字社區(qū)。
地址http://xiaodengzhp.xyz/wordpress/),所以用域名代替了。(注意,外網(wǎng)IP需要在云平臺(tái)打開端口,由于作者偷懶映射的80,所以沒有去打開,如果是其他端口,就要去打開。)


另外,像docker top 、docker cp、 docker stop等等命令這里就不再演示了,大家有興趣的可以自行測(cè)試。
到了這里,相信你已經(jīng)對(duì)docker有了一定的理解,應(yīng)該能嘗試著自己?jiǎn)?dòng)容器了吧。

9、實(shí)戰(zhàn)總結(jié)。

有的小伙伴不理解為什么要加/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)退出了。

六、鏡像原理。

1、鏡像是什么?

鏡像是一種輕量級(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)境變量和配置文件。

2、Docker鏡像加載原理。

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等。

如下圖:


對(duì)于一個(gè)精簡(jiǎn)的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序即可,因?yàn)榈讓又苯佑肏ost的kernel,自己只需要提供rootfs即可。由此可見不同的Linux發(fā)行版本,bootfs基本上是一致的,rootfs會(huì)有差別,所以不同的發(fā)行版可以公用bootfs,這也是一個(gè)鏡像僅有幾百M(fèi)B的原因。

3、分層理解。

這里我用docker pull nginx命令,下載來(lái)一個(gè)鏡像給大家看看,框起來(lái)的是不是一層一層下載的。


那么docker為什么會(huì)使用這種方法呢?最大的好處,就是資源共享。比如有多個(gè)鏡像都從相同的Base鏡像構(gòu)建而來(lái),那么宿主機(jī)只需要在磁盤上保留一份base鏡像,同時(shí)內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有容器提供服務(wù)了,而且鏡像的每一層都可以被共享。

我們通過docker image inspect ngixn:latest查看一下。


這里給大家舉個(gè)栗子:
所有的docker鏡像都起始于一個(gè)基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改或者增加新的內(nèi)容時(shí),就會(huì)在當(dāng)前鏡像層之上,創(chuàng)建新的鏡像層。假如基于Ubuntu Linux 16.04創(chuàng)建一個(gè)新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會(huì)在基礎(chǔ)鏡像之上創(chuàng)建第二個(gè)鏡像層;如果繼續(xù)添加安全補(bǔ)丁,就會(huì)創(chuàng)建第三個(gè)鏡像層。如下圖:

在添加額外的鏡像的同時(shí),鏡像始終是當(dāng)前所有鏡像的組合。比如我們?cè)谔砑拥谌龑影踩a(bǔ)丁的時(shí)候,Ubuntu和Python視為一個(gè)鏡像層,在此基礎(chǔ)上再添加安全補(bǔ)丁鏡像層。
docker鏡像都是只讀的,當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層被加載到鏡像的頂部。這一層就是我們所說(shuō)的容器層,容器之下都叫鏡像層。

4、提交鏡像。

這里大家看一下

1、命令。

docker commit 提交容器成為一個(gè)新的副本
docker commit -m='提交的描述信息'  -a='作者'  容器id  目標(biāo)鏡像名:[TAG]

2、實(shí)驗(yàn)。

1、下載一個(gè)默認(rèn)的tomcat,這里作者已經(jīng)下載好了,就不用再下載了。


2、啟動(dòng)tomcat。
docker run -itd -p 8080:8080 tomcat:latest /bin/bash
然后進(jìn)入此容器
docker exiec -it [容器ID] /bin/bash

3、默認(rèn)tomcat鏡像的webapp網(wǎng)頁(yè)文件里是沒有東西的,我們要從webapps.dist中把它拷貝出來(lái)。

4、打開8080端口,在瀏覽器訪問tomcat docker。

5、提交鏡像。
docker commit -a=“This my create tomcat” -m=“add webapps app” 81 tomcat02:1.0

這里我們就制作了我們的第一個(gè)鏡像,之后我還會(huì)教大家怎么將鏡像發(fā)布到docker hub上。

七、Docker容器數(shù)據(jù)卷。

1、容器數(shù)據(jù)卷介紹。

docker容器在產(chǎn)生數(shù)據(jù)的時(shí)候,如果不通過docker commit生成新的鏡像,使得數(shù)據(jù)作為鏡像的一部分保存下來(lái),那么當(dāng)容器刪除之后,數(shù)據(jù)自然而然的也會(huì)消失。為了能保存數(shù)據(jù),容器中引用了數(shù)據(jù)卷的概念。

2、作用以及特點(diǎn)。

卷就是目錄或者文件,存在一個(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)]有容器使用它為止。

3、使用數(shù)據(jù)卷。

方式一:直接使用命令來(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è)終端,cd /home目錄,這下我們發(fā)現(xiàn)多出來(lái)了一個(gè)test01目錄,這個(gè)test01目錄,就是我們剛剛啟動(dòng)的容器內(nèi)部的home目錄,并且,此時(shí)這兩個(gè)目錄是同步的狀態(tài),我們?cè)趆ome目錄中寫入任何新的文件,都會(huì)同步到主機(jī)home目錄下的test01目錄。


我們?cè)谶@里測(cè)試一下,echo進(jìn)去一個(gè)a.txt文件。

然后來(lái)到宿主機(jī)上,看一眼是不是test01目錄下也出現(xiàn)了a.txt。(雙向綁定)

當(dāng)然,我們可以使用更簡(jiǎn)單的方法查看是否掛載成功,大家還記得是那條命令嗎?沒錯(cuò),是docker inspect 容器ID。我們找到這個(gè)Mounts,它代表著掛載,type是類型(綁定),source是源(/home/test01),也就是把什么掛載到哪里。destination(home)就是掛載的目標(biāo)路徑了。

這里作者只演示了修改容器內(nèi)文件同步到宿主機(jī)掛載文件。其實(shí)反過來(lái)也是一樣的,這里就不再贅述了。之后如果要修容器內(nèi)掛載文件,只需在我們本地掛載點(diǎn)修改就好了,它會(huì)自動(dòng)同步到docker。

4、具名掛載與匿名掛載。

這里先教給大家一個(gè)新武器。
docker volum ls#查看所有卷的情況。

1、匿名掛載

我們首先使用匿名掛載的命令啟動(dòng)一個(gè)容器。

docker run -d -P --name=nginxt01 -v /etc/nginx nginx

然后使用剛剛教給大家的新武器查看卷。


這里84開頭的那一長(zhǎng)串就是掛載到宿主機(jī)的名字。
我們繼續(xù)追查下去。這里教給大家一個(gè)很簡(jiǎn)單的命令,less。如果輸出的信息太多了,我們找不到,就可以這樣使用
cmd | less 栗子: docker inspect 84(容器ID) | less
然后輸入/name, name是你想查到的內(nèi)容,就可以很輕松的找到啦。
大家仔細(xì)看一下,是不是/etc/nginx就是叫84開頭的那一長(zhǎng)串,掛載到了我/var/lib…路徑下,我們復(fù)制這個(gè)路徑繼續(xù)去查看。

怎么樣,是不是在我們的宿主機(jī)就發(fā)現(xiàn)了這樣的一個(gè)文件呢?這就是所謂的匿名掛載!是不是很簡(jiǎn)單。

2、具名掛載。

具名掛載就很簡(jiǎn)單了,跟我們之前演示的指定路徑掛載很相似,這里給大家簡(jiǎn)單地演示一下。

同樣,我們使用具名掛載的方式啟動(dòng)一個(gè)容器。

docker run -d -P --name=nginxt02 -v jumingguazai:/etc/nginx nginx

docker volume ls 查看卷


docker inspect ID | less 找到掛載點(diǎn)。

我們?cè)購(gòu)?fù)制一下路徑,找到nginx的配置文件。

這就是具名掛載。

如何確定是具名掛載還是匿名掛載: -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。

1、什么是Dockerfile?

Dockerfile是一個(gè)創(chuàng)建鏡像所有命令的文本文件,包含了一條條指令和說(shuō)明, 每條指令構(gòu)建一層,,通過docker build命令,根據(jù)Dockerfile的內(nèi)容構(gòu)建鏡像,因此每一條指令的內(nèi)容, 就是描述該層如何構(gòu)建。有了Dockefile,,就可以制定自己的docker鏡像規(guī)則,只需要在Dockerfile上添加或者修改指令,,就可生成docker 鏡像。

2、Dockerfile構(gòu)建過程。

dockerfile的關(guān)鍵字建議使用大寫,它是從上往下按照循序執(zhí)行的,在dockerfile中,#代表注釋。我們可以通過這個(gè)腳本來(lái)生成鏡像,腳本中的每一個(gè)命令,都是一層鏡像。

我們先通過下面這張圖片來(lái)理解一下鏡像的構(gòu)成以及運(yùn)行過程。


在這里我們來(lái)整理一下docker容器、dockerfile、docker鏡像的關(guā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ù)的。

3、Dockerfile 指令選項(xiàng)。

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制作屬于自己的鏡像了。


通過這個(gè)命令,我們就能看到dockerfile制作鏡像所執(zhí)行的步驟,也就可以知道這個(gè)鏡像是怎么制作的了。

九、實(shí)戰(zhàn)測(cè)試:制作鏡像并且發(fā)布外網(wǎng)。

1、注冊(cè)docker hub 賬號(hào)。

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

2、服務(wù)器上使用命令行登陸。

命令

docker login -u [賬號(hào)名字]   #登陸命令
docker out                  #退出命令
docker push 賬號(hào)/容器名字:版本號(hào)


看到Lgin Succeeded,就表示我們登陸成功了。

3、構(gòu)建鏡像。

1、創(chuàng)建工作目錄。

mkdir dockerfile cd dockerfile ls

2、編寫dockerfile。

首先,我們知道官方默認(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

3、構(gòu)建dockerfile。

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)簽。


同時(shí),我們可以用docker history命令來(lái)進(jìn)一步驗(yàn)證dockerfile的構(gòu)建過程。

4、推送鏡像至docker hub。

官方文檔要求,我們推送的鏡像名字必須是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)呢!

十、Docker網(wǎng)絡(luò)。

1、本機(jī)網(wǎng)絡(luò)理解。

我們使用ifconfig可以看到三組網(wǎng)絡(luò)。
首先是docker0,這是我們本節(jié)的重點(diǎn),docker的網(wǎng)絡(luò)。之后是eth0,本機(jī)的外網(wǎng)地址。lo口,本地環(huán)回地址,可以代表localhost。


關(guān)于docker0呢,其實(shí)就是一個(gè)叫docker0的虛擬網(wǎng)橋。我們使用brctl命令來(lái)查看一下。(沒有這個(gè)命令的下載yum -y install bridge-utils

brctl show

2、清空本機(jī)docker環(huán)境。

docker rm -f $(docker ps -aq)docker rmi -f $(docker images -aq)

3、veth-pair技術(shù)。

什么是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


理解:我們每啟動(dòng)一個(gè)docker容器,docker就會(huì)給docker容器分配一個(gè)ip,安裝docker之后,會(huì)產(chǎn)生一個(gè)叫docker0的網(wǎng)卡,這里使用的就是veth-pair技術(shù)

使用ip addr命令,查看我們的網(wǎng)卡。


我們發(fā)現(xiàn)多出來(lái)了兩個(gè)網(wǎng)卡,到了這里,你已經(jīng)知道這兩張網(wǎng)卡是那里來(lái)的了吧。沒錯(cuò),是啟動(dòng)容器之后產(chǎn)生的!我們回過頭來(lái)查看我們?cè)趩?dòng)的容器IP,就會(huì)很清晰的發(fā)現(xiàn),這個(gè)網(wǎng)卡是成對(duì)存在的!容器內(nèi)的64對(duì)應(yīng)著宿主機(jī)的65,容器內(nèi)的66對(duì)應(yīng)宿主機(jī)的67。

什么是veth-pair?
veth-pair 就是一堆的虛擬設(shè)備接口,他們都是成對(duì)出現(xiàn)的,一端連接著協(xié)議,一端連接著彼此。使得它充當(dāng)了一個(gè)橋梁的作用。

4、docker網(wǎng)絡(luò)詳解。

我們來(lái)繪制一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)模型,這樣veth-pair的作用就清晰明了了。


不難看出,tomcat01和tomcat02是共用的同一個(gè)路由器,即docker0。所有的容器在不指定我網(wǎng)絡(luò)的情況下,都是docker0路由的,docekr會(huì)給我們的容器分配一個(gè)默認(rèn)IP。
docker網(wǎng)絡(luò)就是下面這個(gè)網(wǎng)絡(luò)模型所描述的。(docker所有的網(wǎng)絡(luò)接口都是虛擬的,虛擬的轉(zhuǎn)發(fā)效率高)

5、docker網(wǎng)絡(luò)模式。

1、docker網(wǎng)絡(luò)模式有以下幾種:

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)卡

2、創(chuàng)建自定義網(wǎng)絡(luò)的容器:

我們直接啟動(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ì)信息

3、發(fā)布兩個(gè)在自己創(chuàng)建的網(wǎng)絡(luò)里的容器。

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了。


還記得我們前面說(shuō)的docker0的缺點(diǎn)之一,不能通過域名訪問嗎?而我們自定義的網(wǎng)絡(luò),就修復(fù)了這個(gè)功能!

docker exec -it tomcat01-net ping -c 3 IP docker exec -it tomcat01-net ping -c 3 tomcat02-net 提示,ping -c可以自定義ping的次數(shù)

總結(jié)

到這里,我們學(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)注。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服