小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

docker入門,這一篇就夠了。

 mjhtt 2023-06-08 發(fā)布于浙江

Docker入門,這一篇就夠了。

Docker容器虛擬化平臺。

前言

接觸docker很長時間了,但是工作中也沒有用到,所以總是學了忘,忘了學。不過這次,我打算跟大家分享一下我的學習歷程,也算是我的獨特的復習筆記,我會在這一篇中講清楚docker幾乎所有的功能。不過也是我第一次寫,而且是一篇兩萬多字的長文,花了我半個月里所有的休閑娛樂時間,所以寫的不好的地方請大家見諒,也請在評論區(qū)斧正,謝謝大家的理解。

一、Docker背景介紹。

1、什么是docker。

在這里插入圖片描述

Docker,翻譯過來就是碼頭工人

Docker是一個開源的應用容器引擎,讓開發(fā)者可以打包他們的應用以及依賴包到一個可抑制的容器中,然后發(fā)布到任何流行的Linux機器上,也可以實現(xiàn)虛擬化。容器完全使用沙盒機制,相互之間不會存在任何接口。幾乎沒有性能開銷,可以很容易的在機器和數(shù)據(jù)中心運行。最重要的是,他們不依賴于任何語言、框架或者包裝系統(tǒng)。

小知識:沙盒也叫沙箱(sandbox)。在計算機領域指一種虛擬技術,而且多用于計算機安全技術。安全軟件可以讓它在沙盒中運行,如果含有惡意行為,則禁止程序的進一步運行,而這不會對系統(tǒng)造成任何危害。

Docker是dotCloud公司開源的一個基于LXC的高級容器引擎,源碼托管在Github上,基于go語言并且遵從Apache2.0協(xié)議開源。
GitHub地址:https://github.com/moby/moby

小知識:LXC為Linux Container的簡寫。Linux Container 容器是一種內(nèi)核虛擬化技術,可以提供輕量級的虛擬化,以便隔離進程和資源,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性。
LXC主要通過Kernel的namespace實現(xiàn)每個用戶實例之間的項目隔離,通過cgroup實現(xiàn)對資源的配額和調(diào)度。

docker官網(wǎng):https://www.
docker中文庫:https://www./

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

相同點:docker和容器技術和虛擬機技術,都是虛擬化技術。

不同點
虛擬機技術:
在這里插入圖片描述

容器技術:
在這里插入圖片描述

通過圖片,我們很明顯的看到容器少了一層Guest OS,也就是少了虛擬機操作系統(tǒng)這一層,所以docker效率比虛擬機效率高。達到了秒級啟動的地步。

docker相較于VM的優(yōu)點
1、比VM小、快,Docker容器的尺寸減小相比于整個虛擬機大大簡化了分布
到云和分發(fā)時間的開銷。Docker啟動一個容器實例時間僅僅需要幾秒鐘。

2、Docker是一個開放的平臺,構建、發(fā)布和運行分布式應用程序。

3、開發(fā)人員不需要關系具體是哪個Linux操作系統(tǒng)

4、Google、微軟(azure)、亞馬遜、IBM等都支持docker。

5、Docker支持Unix/Linux操作系統(tǒng),也支持Windows和Mac。

Docker局限性:
Docker用于應用程序時是最有用的,但并不包含數(shù)據(jù)。日志、數(shù)據(jù)庫等通常放在Docker容器外。一個容器的鏡像通常都很小,不用和存儲大量數(shù)據(jù),存儲可以通過外部掛載等方式使用,比如:NFS、ipsan、MFS等 ,或者docker命令 ,-v映射磁盤分區(qū)。
總之,docker只用于計算,存儲交給別人。

3、通過docker架構圖初步了解docker。

在這里插入圖片描述
等了解了docker之后,這張圖所代表的的內(nèi)容就很清晰明了,希望大家學完docker之后還能回來看看這張圖。這里簡單給大家介紹一下docker的工作流程。
工作流程:
1、啟動docker
2、下載鏡像到本地
3、啟動docker容器實例
提示:大家可以去注冊一個dockerhub,之后會詳細給大家講解它的作用(非常重要!連docker hub賬號都沒有,玩什么docker?。?。

Docker核心技術:
1、Namespace —> 實現(xiàn)Container的進程、網(wǎng)絡、消息、文件系統(tǒng)和主機名的隔離。
2、Cgroup —> 實現(xiàn)對資源的配額和調(diào)度。
注意:Cgroup的配額,可以指定實例使用的CPU個數(shù),內(nèi)存大小等。

4、Docker特性。

文件系統(tǒng)隔離:每個進程容器運行在一個完全獨立的根文件系統(tǒng)里。

資源隔離:系統(tǒng)資源,像CPU和內(nèi)存等可以分配到不同的容器中,使用cgroup。
網(wǎng)絡隔離:每個進程容器運行在自己的網(wǎng)路空間,虛擬接口和IP地址。

日志記錄:Docker將收集到和記錄的每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或者批量檢索

變更管理:容器文件系統(tǒng)的變更可以提交到新的鏡像中,并可重復使用以創(chuàng)建更多的容器。無需使用模板或者手動配置。

交互式shell:Docker可以分配一個虛擬終端并且關聯(lián)到任何容器的標準輸出上,例如運行一個一次性交互shell。

二、Docker的安裝。

1、docker安裝背景。

首先我問大家一個問題,你們知道docker有幾種安裝方式嗎?
它們又有那些區(qū)別呢?
Docker安裝:

1、yum -y install docker2、yum -y install docker-engine3、yum -y install docker-ce

是的,有三種安裝方式,而且,它們都是正確的!
因為Docker最早的版本名是docker和docker-engin,現(xiàn)在的名字是docker-ce和docker-ee。有興趣的小伙伴可以通過下方鏈接去官網(wǎng)查看。

https://docs./engine/install/centos/
在這里插入圖片描述
2017年初,docker公司將原先的docker開源項目改名為moby。
moby是集成了原先的docker項目,是社區(qū)維護的開源項目,誰都可以在moby的基礎打造自己的容器產(chǎn)品。
docker-ce 是docker公司維護的開源項目,是一個基于moby項目的免費容器產(chǎn)品。
docker-ee 是docker公司維護的閉源產(chǎn)品,是docker公司的商業(yè)昌平。
注:moby是源代碼,docker-ce 和docker-ee 是產(chǎn)品容器,rpm包。
所以,目前我們經(jīng)常使用的版本當然是docker-ce啦!

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

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

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

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

在這里插入圖片描述
這里作者已經(jīng)安裝過了,所以提示Nothing to do。

4、配置國內(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

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

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

默認會自動開啟。
路徑 :/proc/sys/net/ipv4/ip_forward
手動開啟:

vim /etc/sysctl.conf   #插入以下內(nèi)容
net.ipv4.forward =1-------------------------sysctl -p   #生效
cat /proc/sys/net/ipv4/ip_forward  #查看結果,為1開啟成功。

如果沒有開啟網(wǎng)絡轉(zhuǎn)發(fā),我們啟動實例的時候就會報錯?。?!

關閉防火墻:

iptables -nL #查看一下iptable規(guī)則,關閉防火墻后會自動插入新規(guī)則 systemctl stop firewalld && systemctl disable firewalld #關閉防火墻 sysctlrem restart docker # 關閉防火墻要把docker重啟一下,不然docker 的ip包轉(zhuǎn)發(fā)功能無法使用。即便防火墻關閉了,docker依舊會調(diào)用內(nèi)核模塊netfilter增加規(guī)則,所以會新增iptables規(guī)則 iptables -nL #再查看一下iptable規(guī)則,會發(fā)現(xiàn)多出很多規(guī)則

iptables -nL
在這里插入圖片描述

7、啟動服務。

systemctl start docker && systemctl enable docker

啟動完成后會該網(wǎng)絡參數(shù),這個是ip轉(zhuǎn)發(fā)會改成1。默認0
在這里插入圖片描述
這里簡單教大家第一個docker命令,docker version查看docker版本。

docker version #查看docker版本

在這里插入圖片描述
這里我們很清晰的可以看到docker是一個C/S架構的模式。客戶端是我們的命令行操作,服務端是一個守護進程。

docker info  #查看docker基本信息

我們可以通過docker info看到機器存放docker鏡像得地址,也可以看到docker倉庫的地址。
在這里插入圖片描述

三、docker入門命令。

1、搜索鏡像

docker search

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

在這里插入圖片描述
大家可以看到搜索出來的最上一行有幾個表頭,這里給大家介紹一下
name:代表此鏡像的名稱

description:此鏡像的描述

stars:下載次數(shù)

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

2、拉取鏡像。

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

docker pull centos

在這里插入圖片描述
注意,如果這里報錯,TLS handshake timeout,那就是網(wǎng)絡原因?qū)е鲁瑫r,嘗試多pull幾次。下面介紹配置鏡像加速。

使用阿里云docker鏡像加速器。
地址:https://cr.console.aliyun.com的控制臺,使用支付寶賬號登錄,左側加速器幫助頁面會為你顯示獨立的加速地址,這個加速地址每個人的都不同。
在這里插入圖片描述
可以通過修改daemon配置文件/etc/docker/daemon.json來使用加速器。
把自己的專屬加速地址放到下面的地址改一下,寫入文件就可以了。

{ 'registry-mirrors': ['https://eu5rxjvf.mirror.']}systemctl daemon-reload #啟動配置 systemctl restart docker #重啟docker服務

配置好了之后,我們使用之前學的命令,docker info查看一下是否新增了阿里云的地址。
在這里插入圖片描述
可以看到此地址,代表配置成功。

然后繼續(xù)使用docker pull centos,下載速度會很快。(由于作者已經(jīng)下載了centos,這里使用tomcat鏡像演示)

3、查看鏡像。

拉去之后我們要如何看到我們下載下來的鏡像呢,這里我們就需要學習一個新命令。docker images,查看已下載鏡像。

docker images  #查看已下載鏡像。

在這里插入圖片描述
好了,這樣就拉取下來了。

4、使用U盤的方式導入鏡像。

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

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

導入之后可以使用docker images查看。
在這里插入圖片描述
注意上圖,tag代表標簽,image id代表鏡像ID。這是我們區(qū)別鏡像的方式。
另外提一下,還有一種直接下載其他站點鏡像的方法,命令如下:

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

注:docker鏡像相當于,對程序+程序依賴的庫直接打包(后期詳細解釋)。

四、Docker平臺的基本使用方法。

很開心大家耐心的看到了這里,接下來我就會詳細講解docker的使用方法。

1、幫助命令。

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

2、鏡像命令。

docker images  #查看所有本地主機的鏡像
docker search 鏡像名           #搜索鏡像
docker pull 鏡像名 [標簽]      #下載鏡像(如果不寫tag,默認是latest)
docker rmi 鏡像名 [標簽]       #刪除鏡像    docker rmi -f $(docker images -aq)  刪除全部鏡像
docker tag  鏡像名:版本   新鏡像名:版本    #復制鏡像并且修改名稱
docker commit  -a 'xxx'  -c 'xxx' 鏡像ID 名字:版本   #提交鏡像 
-a :提交的鏡像作者;-c :使用Dockerfile指令來創(chuàng)建鏡像;-m :提交時的說明文字;

docker load -i    /xxx/xxx.tar         #導入鏡像
docker save -o   /xxx/xxx.tar          #保存一個鏡像為一個tar包

3、容器命令。

docker run [可選參數(shù)] image 命令 #啟動容器(無鏡像會先下載鏡像) #參數(shù)說明--name = 'Name' 容器名字-c 后面跟待完成的命令-d 以后臺方式運行并且返回ID,啟動守護進程式容器-i 使用交互方式運行容器,通常與t同時使用-t 為容器重新分配一個偽輸入終端。也即啟動交互式容器-p 指定容器端口 -p 容器端口:物理機端口 映射端口-P 隨機指定端口-v 給容器掛載存儲卷 docker build #創(chuàng)建鏡像 -f:指定dockerfile文件路徑 -t:鏡像名字以及標簽 docker logs 容器實例的ID #查看容器日志 docker rename 舊名字 新名字 # 給容器重新命名 docker top 容器實例的ID #查看容器內(nèi)進程 docker ps -a #列出所有容器(不加-a就是在運行的) docker rm 容器實例的ID #刪除容器(正在運行容器不能刪除,除非加-f選項) docker kill 容器實例的ID #殺掉容器 docker history 容器實例的ID #查看docker鏡像的變更歷史 docker start 容器實例的ID #啟動容器 docker restart 容器實例的ID #重啟容器 docker stop 容器實例的ID #停止正在運行的容器 docker attach /docker exec 容器實例的ID #同為進入容器命令,不同的是attach連接終止會讓容器退出后臺運行,而exec不會。并且,docker attach是進入正在執(zhí)行的終端,不會情動新的進程,而docker exec則會開啟一個新的終端,可以在里面操作。 docker image inspect 容器名稱:容器標簽 #查看容器內(nèi)源數(shù)據(jù) docker cp 容器id:容器內(nèi)路徑 目的主機路徑 #從容器內(nèi)拷貝文件到主機(常用)或者從主機拷貝到容器(一般用掛載) exit #直接退出容器 crlt + P + Q #退出容器但是不終止運行

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

1、搜索鏡像。

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

2、下載鏡像。

docker pull nginx
未指定nginx則直接下載最新版本
在這里插入圖片描述

3、查看鏡像。

docker images
這里有作者下載的其他鏡像。第一個就是我們剛剛下載的鏡像。
在這里插入圖片描述

4、啟動容器。

docker run -d --name nginx01 -p 80:80 nginx
e56開頭那個就是容器ID
在這里插入圖片描述

5、查看容器。

docker ps
在這里插入圖片描述

6、測試訪問。

curl 127.0.0.1:80
127.0.0.1是本地回環(huán)ip,就是本機啦,可以用localhost代替。
在這里插入圖片描述

7、進入容器修改頁面。

docker exec -it 容器ID /bin/bash
whereis是一個搜索文件的小命令,不如find好用但是簡潔。
在這里插入圖片描述

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

用公網(wǎng)IP,這里作者有域名(順便給自己的網(wǎng)站打個廣告,作者喜歡寫東西,如果有投稿之類的可以留言,我會篩選之后放到我的博客網(wǎng)站,當然也歡迎大家加入我,一起創(chuàng)建文字社區(qū)。
地址http:///wordpress/),所以用域名代替了。(注意,外網(wǎng)IP需要在云平臺打開端口,由于作者偷懶映射的80,所以沒有去打開,如果是其他端口,就要去打開。)
在這里插入圖片描述
另外,像docker top 、docker cp、 docker stop等等命令這里就不再演示了,大家有興趣的可以自行測試。
到了這里,相信你已經(jīng)對docker有了一定的理解,應該能嘗試著自己啟動容器了吧。

9、實戰(zhàn)總結。

有的小伙伴不理解為什么要加/bin/bash,或者什么時候該加什么時候不加,這里我給大家解釋一下。
我們先看docker run的命令參數(shù)。

docker run [可選參數(shù)] image 命令 #啟動容器(無鏡像會先下載鏡像)
#參數(shù)說明--name = 'Name'   容器名字-c   后面跟待完成的命令-d   以后臺方式運行并且返回ID,啟動守護進程式容器-i   使用交互方式運行容器,通常與t同時使用-t   為容器重新分配一個偽輸入終端。也即啟動交互式容器-p   指定容器端口    -p 容器端口:物理機端口  映射端口-P   隨機指定端口-v   給容器掛載存儲卷

大家注意-i 、 -t 、 -d這幾個參數(shù)。一般it連用表示給我一個可以操作的前臺終端。第二個呢就是id,以后臺守護進程的方式運行容器。這樣,我們就可以總結出兩種運行容器的命令模式。

第一種:交互方式創(chuàng)建容器,退出后容器關閉。 docker run -it 鏡像名稱:標簽 /bin/bash 第二種:守護進程方式創(chuàng)建容器。 docker run -id 鏡像名稱:標簽 通過這種方式創(chuàng)建的容器,我們不會直接進入到容器界面,而是在后臺運行了容器, 如果我們需要進去,則還需要一個命令。 docker exec -it 鏡像名稱:標簽 /bin/bash 通過這種方式運行的容器,就不會自動退出了。

六、鏡像原理。

1、鏡像是什么?

鏡像是一種輕量級的、可執(zhí)行的獨立軟件包。用來打包軟件運行環(huán)境和基于運行環(huán)境的開發(fā)軟件,它包含運行某個軟件所需要的內(nèi)容,包括代碼、運行時、庫、環(huán)境變量和配置文件。

2、Docker鏡像加載原理。

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

特性:一次同時加載多個文件系統(tǒng),但是從外面開起來,只能看一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,最終的文件系統(tǒng)會包含所有的底層文件和目錄。

Docker鏡像加載原理
docker的鏡像實際上是由一層一層的文件系統(tǒng)組成,這種層級關系就叫UnionFS。
bootfs(boot file system)主要包括bootloader和kernel,bootloader主要是引導加載kernel,Linux剛啟動時會加載bootfs文件系統(tǒng),在Docker鏡像的最底層是bootfs。這一層與我們典型的Linux/Unix系統(tǒng)是一樣的,包含boot加載器和內(nèi)核。當boot加載完成之后整個內(nèi)核就在內(nèi)存中了,此時內(nèi)存的使用權由bootfs轉(zhuǎn)交給內(nèi)核,此時系統(tǒng)會卸載bootfs。

rootfs(root file system),在bootfs之上。包含的就是典型Linux系統(tǒng)的/dev, /proc, /bin, /etc等等標準文件。rootfs就是各種不同的操作系統(tǒng)發(fā)行版本,比如Ubuntu、CentOS等。

如下圖:
在這里插入圖片描述
對于一個精簡的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序即可,因為底層直接用Host的kernel,自己只需要提供rootfs即可。由此可見不同的Linux發(fā)行版本,bootfs基本上是一致的,rootfs會有差別,所以不同的發(fā)行版可以公用bootfs,這也是一個鏡像僅有幾百MB的原因。

3、分層理解。

這里我用docker pull nginx命令,下載來一個鏡像給大家看看,框起來的是不是一層一層下載的。
在這里插入圖片描述
那么docker為什么會使用這種方法呢?最大的好處,就是資源共享。比如有多個鏡像都從相同的Base鏡像構建而來,那么宿主機只需要在磁盤上保留一份base鏡像,同時內(nèi)存中也只需要加載一份base鏡像,這樣就可以為所有容器提供服務了,而且鏡像的每一層都可以被共享。

我們通過docker image inspect ngixn:latest查看一下。
在這里插入圖片描述
這里給大家舉個栗子:
所有的docker鏡像都起始于一個基礎鏡像層,當進行修改或者增加新的內(nèi)容時,就會在當前鏡像層之上,創(chuàng)建新的鏡像層。假如基于Ubuntu Linux 16.04創(chuàng)建一個新的鏡像,這就是新鏡像的第一層;如果在該鏡像中添加Python包,就會在基礎鏡像之上創(chuàng)建第二個鏡像層;如果繼續(xù)添加安全補丁,就會創(chuàng)建第三個鏡像層。如下圖:
在這里插入圖片描述
在添加額外的鏡像的同時,鏡像始終是當前所有鏡像的組合。比如我們在添加第三層安全補丁的時候,Ubuntu和Python視為一個鏡像層,在此基礎上再添加安全補丁鏡像層。
docker鏡像都是只讀的,當容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層就是我們所說的容器層,容器之下都叫鏡像層。

4、提交鏡像。

這里大家看一下

1、命令。

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

2、實驗。

1、下載一個默認的tomcat,這里作者已經(jīng)下載好了,就不用再下載了。
在這里插入圖片描述
2、啟動tomcat。
docker run -itd -p 8080:8080 tomcat:latest /bin/bash
然后進入此容器
docker exiec -it [容器ID] /bin/bash
在這里插入圖片描述
3、默認tomcat鏡像的webapp網(wǎng)頁文件里是沒有東西的,我們要從webapps.dist中把它拷貝出來。
在這里插入圖片描述
4、打開8080端口,在瀏覽器訪問tomcat docker。
tomcat
5、提交鏡像。
docker commit -a=“This my create tomcat” -m=“add webapps app” 81 tomcat02:1.0
在這里插入圖片描述
這里我們就制作了我們的第一個鏡像,之后我還會教大家怎么將鏡像發(fā)布到docker hub上。

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

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

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

2、作用以及特點。

卷就是目錄或者文件,存在一個或者多個容器之中,由docker掛載到容器,但是不屬于聯(lián)合文件系統(tǒng),因此能夠繞過Union File System提供一些用于持續(xù)存儲或者共享數(shù)據(jù)的特性。

卷的設計目的就是數(shù)據(jù)的持久化,完全獨立于容器的生存周期,因此docker不會再容器刪除時刪除其掛載的數(shù)據(jù)卷。

它還存在以下幾種特點

1、數(shù)據(jù)卷可在容器之間共享或者重用數(shù)據(jù)。
2、卷中的更改可以直接生效。
3、數(shù)據(jù)卷中的更改不會包含在鏡像的更新中。
4、數(shù)據(jù)卷的生命周期一直持續(xù)到?jīng)]有容器使用它為止。

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

方式一:直接使用命令來掛載 , -v

docker run -it -v 主機目錄:容器目錄 /bin/bash

我們在創(chuàng)建容器之前,先看看掛載路徑上有沒有test01這個目錄,可以看到,是沒有的。執(zhí)行命令之后進入到容器內(nèi),我們ls看一下容器的home目錄,是空的。

docker run -it -v /home/test01:/home centos /bin/bash

在這里插入圖片描述
另外打開一個終端,cd /home目錄,這下我們發(fā)現(xiàn)多出來了一個test01目錄,這個test01目錄,就是我們剛剛啟動的容器內(nèi)部的home目錄,并且,此時這兩個目錄是同步的狀態(tài),我們在home目錄中寫入任何新的文件,都會同步到主機home目錄下的test01目錄。

在這里插入圖片描述
我們在這里測試一下,echo進去一個a.txt文件。
在這里插入圖片描述
然后來到宿主機上,看一眼是不是test01目錄下也出現(xiàn)了a.txt。(雙向綁定)
在這里插入圖片描述
當然,我們可以使用更簡單的方法查看是否掛載成功,大家還記得是那條命令嗎?沒錯,是docker inspect 容器ID。我們找到這個Mounts,它代表著掛載,type是類型(綁定),source是源(/home/test01),也就是把什么掛載到哪里。destination(home)就是掛載的目標路徑了。
在這里插入圖片描述
這里作者只演示了修改容器內(nèi)文件同步到宿主機掛載文件。其實反過來也是一樣的,這里就不再贅述了。之后如果要修容器內(nèi)掛載文件,只需在我們本地掛載點修改就好了,它會自動同步到docker。

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

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

1、匿名掛載

我們首先使用匿名掛載的命令啟動一個容器。

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

然后使用剛剛教給大家的新武器查看卷。
在這里插入圖片描述
這里84開頭的那一長串就是掛載到宿主機的名字。
我們繼續(xù)追查下去。這里教給大家一個很簡單的命令,less。如果輸出的信息太多了,我們找不到,就可以這樣使用
cmd | less 栗子: docker inspect 84(容器ID) | less
然后輸入/name, name是你想查到的內(nèi)容,就可以很輕松的找到啦。
大家仔細看一下,是不是/etc/nginx就是叫84開頭的那一長串,掛載到了我/var/lib…路徑下,我們復制這個路徑繼續(xù)去查看。
在這里插入圖片描述
怎么樣,是不是在我們的宿主機就發(fā)現(xiàn)了這樣的一個文件呢?這就是所謂的匿名掛載!是不是很簡單。
在這里插入圖片描述

2、具名掛載。

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

同樣,我們使用具名掛載的方式啟動一個容器。

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

docker volume ls 查看卷
在這里插入圖片描述
docker inspect ID | less 找到掛載點。
在這里插入圖片描述
我們再復制一下路徑,找到nginx的配置文件。
在這里插入圖片描述

這就是具名掛載。

如何確定是具名掛載還是匿名掛載: -v 容器內(nèi)路徑 #匿名掛在 -v 卷名:容器內(nèi)路徑 #具名掛在 -v /宿主機路徑:容器內(nèi)路徑 # 指定路徑掛載

tips:

通過 -v 容器內(nèi)路徑  :ro   rw   可以改變讀寫權限
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是一個創(chuàng)建鏡像所有命令的文本文件,包含了一條條指令和說明, 每條指令構建一層,,通過docker build命令,根據(jù)Dockerfile的內(nèi)容構建鏡像,因此每一條指令的內(nèi)容, 就是描述該層如何構建。有了Dockefile,,就可以制定自己的docker鏡像規(guī)則,只需要在Dockerfile上添加或者修改指令,,就可生成docker 鏡像。

2、Dockerfile構建過程。

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

我們先通過下面這張圖片來理解一下鏡像的構成以及運行過程。
在這里插入圖片描述
在這里我們來整理一下docker容器、dockerfile、docker鏡像的關系:

dockerfile是面向開發(fā)的,發(fā)布項目做鏡像的時候就要編寫dockerfile文件。
dockerfile:構建文件,定義了一切的步驟,源代碼。
dockerImanges:通過dockerfile構建生成的鏡像,最終發(fā)布和運行的產(chǎn)品。
docker容器:容器就是鏡像運行起來提供服務的。

3、Dockerfile 指令選項。

Dockerfile 指令選項: FROM #基礎鏡像 。 (centos) MAINTAINER #鏡像的作者和郵箱。(已被棄用,結尾介紹代替詞) RUN #鏡像構建的時候需要執(zhí)行的命令。 CMD #類似于 RUN 指令,用于運行程序(只有最后一個會生效,可被替代) EXPOSE #對外開放的端口。 ENV #設置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個環(huán)境變量。 ADD # 步驟:tomcat鏡像,這個tomcat壓縮包。添加內(nèi)容。 COPY #復制指令,將文件拷貝到鏡像中。 VOLUME #設置卷,掛載的主機目錄。 USER #用于指定執(zhí)行后續(xù)命令的用戶和用戶組, 這邊只是切換后續(xù)命令執(zhí)行的用戶(用戶和用戶組必須提前已經(jīng)存在)。 WORKDIR #工作目錄(類似CD命令)。 ENTRYPOINT #類似于 CMD 指令,但其不會被 docker run 的命令行參數(shù)指定的指令所覆蓋,會追加命令。 ONBUILD #當構建一個被繼承Dokcerfile,就會運行ONBUILD的指令。出發(fā)執(zhí)行。 注意:CMD類似于 RUN 指令,用于運行程序,但二者運行的時間點不同: CMD 在docker run 時運行。 RUN 是在 docker build。 作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。 CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運行的程序所覆蓋。 如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。 LABEL(MAINTALNER已經(jīng)被棄用了,目前是使用LABEL代替) LABEL 指令用來給鏡像添加一些元數(shù)據(jù)(metadata),以鍵值對的形式,語法格式如下: LABEL <key>=<value> <key>=<value> <key>=<value> ... 比如我們可以添加鏡像的作者: LABEL org.opencontainers.image.authors='runoob'

Tips:構建鏡像99%都是從scratch開始的,但是這個鏡像是個虛擬的概念,并不實際存在,表示一個空白的鏡像。

這里帶大家回顧一下docker history命令。接下來我們就要用dockfile制作屬于自己的鏡像了。
在這里插入圖片描述
通過這個命令,我們就能看到dockerfile制作鏡像所執(zhí)行的步驟,也就可以知道這個鏡像是怎么制作的了。

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

1、注冊docker hub 賬號。

網(wǎng)址:https://hub./
在這里插入圖片描述

2、服務器上使用命令行登陸。

命令

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

在這里插入圖片描述
看到Lgin Succeeded,就表示我們登陸成功了。

3、構建鏡像。

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

mkdir dockerfile cd dockerfile ls

在這里插入圖片描述

2、編寫dockerfile。

首先,我們知道官方默認的鏡像,比如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、構建dockerfile。

docker build 命令:

docker build -f mydockerfile-t mycentos:1.0 .

在這里插入圖片描述
在這里插入圖片描述

到這里,我們就制作好了我們自己的鏡像,雖然它并沒有什么用。
這里我們再啟動我們自己制作的鏡像,進去看看我們寫的dockerfile都生效了沒有。
注:不加標簽默認是latest,所以docker run的時候要帶上鏡像標簽。
在這里插入圖片描述
同時,我們可以用docker history命令來進一步驗證dockerfile的構建過程。
在這里插入圖片描述

4、推送鏡像至docker hub。

官方文檔要求,我們推送的鏡像名字必須是YOUR_DOCKER_HUB_ID/XXXX,所以我們需要給鏡像換一個名字

docker tag mycentos/1.0 自己的賬號名字/mytomcat docker push 自己的賬號名字/mytomcat

鏡像有點大,所以請耐心等待一下。等了幾分鐘之后,我們登陸docker hub就可以看到我們剛剛推送上去的鏡像啦,這個鏡像可是全世界人民都看得到的哦,是不是有點小激動呢!
在這里插入圖片描述

十、Docker網(wǎng)絡。

1、本機網(wǎng)絡理解。

我們使用ifconfig可以看到三組網(wǎng)絡。
首先是docker0,這是我們本節(jié)的重點,docker的網(wǎng)絡。之后是eth0,本機的外網(wǎng)地址。lo口,本地環(huán)回地址,可以代表localhost。
在這里插入圖片描述
關于docker0呢,其實就是一個叫docker0的虛擬網(wǎng)橋。我們使用brctl命令來查看一下。(沒有這個命令的下載yum -y install bridge-utils

brctl show

在這里插入圖片描述

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

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

3、veth-pair技術。

什么是veth-pair技術?要理解它,我們首先來啟動兩個tomcat容器。

docker run -d -P --name=tomcat01 tomcat:7docker run -d -P --name=tomcat02 tomcat:7提示:選擇tomcat7是因為這個鏡像包含了ip addr 等常用命令!

啟動機器之后,我們查看容器ip,通過容器的ip 去ping宿主機ip,發(fā)現(xiàn)是通的。

docker exec -it tomcat01 ip addr

在這里插入圖片描述

ping 172.17.0.3

在這里插入圖片描述
理解:我們每啟動一個docker容器,docker就會給docker容器分配一個ip,安裝docker之后,會產(chǎn)生一個叫docker0的網(wǎng)卡,這里使用的就是veth-pair技術。

使用ip addr命令,查看我們的網(wǎng)卡。
在這里插入圖片描述
我們發(fā)現(xiàn)多出來了兩個網(wǎng)卡,到了這里,你已經(jīng)知道這兩張網(wǎng)卡是那里來的了吧。沒錯,是啟動容器之后產(chǎn)生的!我們回過頭來查看我們在啟動的容器IP,就會很清晰的發(fā)現(xiàn),這個網(wǎng)卡是成對存在的!容器內(nèi)的64對應著宿主機的65,容器內(nèi)的66對應宿主機的67。

什么是veth-pair?
veth-pair 就是一堆的虛擬設備接口,他們都是成對出現(xiàn)的,一端連接著協(xié)議,一端連接著彼此。使得它充當了一個橋梁的作用。
在這里插入圖片描述

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

我們來繪制一個簡單的網(wǎng)絡模型,這樣veth-pair的作用就清晰明了了。
在這里插入圖片描述
不難看出,tomcat01和tomcat02是共用的同一個路由器,即docker0。所有的容器在不指定我網(wǎng)絡的情況下,都是docker0路由的,docekr會給我們的容器分配一個默認IP。
docker網(wǎng)絡就是下面這個網(wǎng)絡模型所描述的。(docker所有的網(wǎng)絡接口都是虛擬的,虛擬的轉(zhuǎn)發(fā)效率高)
在這里插入圖片描述

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

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

Host:容器不會虛擬出自己的網(wǎng)卡,配置主機的IP等,而是使用宿主機的IP和端口 Container: 創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP。(一般不用) None: 該模式關閉了容器的網(wǎng)絡功能。(一般不用) Bridge:默認為該模式(橋接,自己創(chuàng)建也是用它),此模式會為每一個容器分配,設置IP等,并將容器連接到一個docker0 的虛擬網(wǎng)橋,通過docker 0 網(wǎng)橋以及iptables nat 表配置與宿主機通信。
docker network ls   #列出docker網(wǎng)卡

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

我們直接啟動命令, --net bridge,就是docker0(默認) docker run -d -P --name=tomcat01 --net bridge tomcat docker0特點:默認,域名不能訪問,--link不建議使用

下面我們自己來創(chuàng)建一個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)絡!
在這里插入圖片描述
這里在教大家一條命令:

docker network inspect 網(wǎng)卡名字 #查看網(wǎng)卡詳細信息

在這里插入圖片描述

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

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)建的這兩個容器的IP了。
在這里插入圖片描述
還記得我們前面說的docker0的缺點之一,不能通過域名訪問嗎?而我們自定義的網(wǎng)絡,就修復了這個功能!

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

在這里插入圖片描述

總結

到這里,我們學習docker的腳步就告一段落了。陸陸續(xù)續(xù)寫了大半個月,我也終于寫完了我在CSDN的第一篇文章。希望我的付出,能帶給大家學習的動力,容器其實并不難掌握,大家可能在剛剛接觸的時候很迷茫,不知道這是個啥。其實沒有關系,在你用著用著之后,容器的概念就會在你的腦子里漸漸形象起來。很感謝你看了這里,我也很希望能讓你對容器,有一定的認識,哈哈哈,就先寫到這兒吧,以后我還會更新其他內(nèi)容的,歡迎大家的關注。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多