一、Docker簡介
1、Docker簡述
Docker是一個(gè)go語言開發(fā)的應(yīng)用容器引擎,運(yùn)行容器里的應(yīng)用。docker是用來管理容器和鏡像的一種工具。
2、什么是容器
容器是在linux上本機(jī)運(yùn)行,并與其他容器共享主機(jī)的內(nèi)核,它運(yùn)行的是一個(gè)獨(dú)立的進(jìn)程,不占用其他任何可執(zhí)行文件的內(nèi)存,非常輕量。
虛擬機(jī)運(yùn)行的是一個(gè)完整的操作系統(tǒng),通過虛擬機(jī)管理程序?qū)χ鳈C(jī)資源進(jìn)行虛擬訪問,相比之下需要的資源更多。
3、容器的優(yōu)點(diǎn)
①靈活:即使是最復(fù)雜的應(yīng)用也可以集裝箱化。
②輕量級(jí):容器利用并共享主機(jī)內(nèi)核。
③可互換:可以即時(shí)部署更新和升級(jí)。
④便攜式:可以在本地構(gòu)建,部署到云,并在任何地方運(yùn)行。
⑤可擴(kuò)展:可以增加并自動(dòng)分發(fā)容器副本。
⑥可堆疊:可以垂直和即時(shí)堆疊服務(wù)。
4、Docker的logo及設(shè)計(jì)宗旨
Docker的Logo設(shè)計(jì)為藍(lán)色鯨魚,拖著許多集裝箱。
鯨魚可看作為宿主機(jī),集裝箱可理解為相互隔離的容器,每個(gè)集裝箱中都包含自己的應(yīng)用程序。Docker的設(shè)計(jì)宗旨:Build,Ship and Run Any App,Anywhere,
即通過對(duì)應(yīng)用組件的封裝、發(fā)布、部署、運(yùn)行等生命周期的管理,達(dá)到應(yīng)用組件級(jí)別的“一次封裝,到處運(yùn)行”的目的。這里的組件,既可以是一個(gè)應(yīng)用,也可以是一套服務(wù),甚至是一個(gè)完整的操作系統(tǒng)。
5、Docker與虛擬機(jī)的區(qū)別
6、Docker的2個(gè)重要技術(shù)
docker本質(zhì)就是宿主機(jī)的一個(gè)進(jìn)程,docker是通過namespace實(shí)現(xiàn)資源隔離,通過cgroup實(shí)現(xiàn)資源限制,通過寫時(shí)復(fù)制技術(shù)(copy-on-write)實(shí)現(xiàn)了高效的文件操作(類似虛擬機(jī)的磁盤比如分配500g并不是實(shí)際占用物理磁盤500g)
7、Docker三大核心概念
①鏡像:包含了各種環(huán)境或者服務(wù)的一個(gè)模板
②容器(container)–對(duì)象:鏡像運(yùn)行起來之后的一個(gè)實(shí)例即為容器,可以看做簡易版的linux環(huán)境
③倉庫:保存鏡像的地方,分為私有庫和公共庫最大的公有庫是docker公司提供的地址為:hub.docker.com
docker的三大核心以及日志等內(nèi)容默認(rèn)都存在/var/lib/docker下
二、Docker的安裝及管理
1、安裝Docker
yum install -y yum-utils device-mapper-persistent-data lvm2
#安裝docker的依賴包,yum-utils:提供了 yum-config-manager 工具。
#device mapper: 是Linux內(nèi)核中支持邏輯卷管理的通用設(shè)備映射機(jī)制,它為實(shí)現(xiàn)用于存儲(chǔ)資源管理的塊設(shè)備驅(qū)動(dòng)提供了一個(gè)高度模塊化的內(nèi)核架構(gòu)。
#evice mapper存儲(chǔ)驅(qū)動(dòng)程序需要 device-mapper-persistent-data 和 lvm2。
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#yum源配置為阿里云鏡像
yum install -y docker-ce docker-ce-cli
#安裝docker(ce表示社區(qū)版,若需安裝指定版本則--后跟版本)
2、配置Docker加速器
①打開阿里云官網(wǎng) 阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計(jì)算服務(wù)平臺(tái)官網(wǎng)進(jìn)行登陸。
②登陸后打開控制臺(tái)
③點(diǎn)擊左側(cè)菜單欄,搜索框輸入容器鏡像服務(wù)
④ 選擇鏡像工具—鏡像加速器–復(fù)制命令配置即可配置完畢重新加載daemon然后重啟docker。
3、Docker鏡像相關(guān)基礎(chǔ)命令
①搜索鏡像
格式:docker search 關(guān)鍵字
作用:搜索關(guān)鍵字的相關(guān)鏡像內(nèi)容
docker search nginx
②拉取鏡像
格式:docker pull 鏡像:[版本號(hào)]
作用:拉取鏡像,版本號(hào)可選,不填寫默認(rèn)為拉取最新鏡像
docker pull nginx
③查看鏡像
命令:docker images
作用:查看所有鏡像文件
docker images
④查看鏡像詳細(xì)信息
格式:docker inspect 鏡像唯一id號(hào)
作用:可以查看到鏡像的ip信息等
docker inspect f9c14fe76d50
⑤ 本地鏡像添加新標(biāo)簽
格式:docker tag 名稱:[標(biāo)簽] 名稱:[新標(biāo)簽]
作用:用于本地鏡像添加新的標(biāo)簽
⑥查看docker信息
命令:docker version
作用:查看docker版本信息
命令:docker info
作用:查看docker詳細(xì)信息
Containers: 0 #當(dāng)前容器數(shù)量
Running: 0 #多少容器在運(yùn)行中
Paused: 0 #多少容器在暫停中
Stopped: 0 #多少容器在停止中
Images: 1 #當(dāng)前有多少鏡像
Server Version: 24.0.2 #當(dāng)前版本號(hào)
Storage Driver: overlay2 #docker當(dāng)前使用的文件存儲(chǔ)驅(qū)動(dòng)
Backing Filesystem: xfs #底層使用的是xfs
Cgroup Driver: cgroupfs #docker使用cgroupfs做資源隔離
Docker Root Dir: /var/lib/docker #docker工作目錄,其鏡像、容器都存在這里
⑦刪除docker鏡像
格式:docker rmi 倉庫名:標(biāo)簽 /鏡像唯一id號(hào)
作用:刪除鏡像
docker rmi nginx:web
docker rmi f9c14fe76d50
⑧容器導(dǎo)出鏡像存儲(chǔ)
格式:docker save -o 保存目錄 導(dǎo)出的鏡像
作用:將docker容器中的鏡像導(dǎo)出保存到系統(tǒng)中
docker save -o /opt/nginx.bak nginx:latest
⑨導(dǎo)入鏡像到容器
格式: docker load -i 本地存儲(chǔ)鏡像位置
或者 docker load <本地存儲(chǔ)鏡像位置
作用:將鏡像導(dǎo)入docker容器中
docker load -i /opt/nginx.bak
4、Docker 容器操作
①創(chuàng)建docker容器
容器創(chuàng)建:就是將鏡像加載到容器的過程。
新創(chuàng)建的容器默認(rèn)處于停止?fàn)顟B(tài),不運(yùn)行任何程序,需要在其中發(fā)起一個(gè)進(jìn)程來啟動(dòng)容器。
格式:docker create [選項(xiàng)] 鏡像
常用選項(xiàng):
-i:讓容器開啟標(biāo)準(zhǔn)輸入接受用戶輸入命令
-t:讓 Docker 分配一個(gè)偽終端 tty
-it :合起來實(shí)現(xiàn)和容器交互的作用,運(yùn)行一個(gè)交互式會(huì)話 shell
示例:
docker create -it nginx:1.14
②查看docker容器進(jìn)程
命令:docker ps [選項(xiàng)]
-a 選項(xiàng)顯示所有狀態(tài)容器
作用:顯示up的進(jìn)程,加-a表示顯示所有狀態(tài)容器
單獨(dú) ps 只能顯示已經(jīng)運(yùn)行的容器
③管理docker容器
格式:docker start/stop 容器唯一id/容器名稱
作用:開啟或關(guān)閉容器
④登錄docker容器
格式:docker exec -it 容器唯一id bash/sh
作用:登錄容器
5、docker run的運(yùn)行過程
創(chuàng)建并啟動(dòng)docker容器
格式:docker run [選項(xiàng)] 鏡像名/鏡像唯一id /bin/bash
選項(xiàng):
-d 選項(xiàng)讓 Docker 容器以守護(hù)形式在后臺(tái)運(yùn)行,并且容器所運(yùn)行的程序不能結(jié)束
-it :合起來實(shí)現(xiàn)和容器交互的作用,運(yùn)行一個(gè)交互式會(huì)話 shell
–name:指定創(chuàng)建的容器的名稱
作用:相當(dāng)于先create容器然后再start容器并持久保持開啟,不能單獨(dú)使用docker run 不加任何選項(xiàng),docker 容器是一個(gè)與其中運(yùn)行的 shell 命令共存亡的終端,命令運(yùn)行容器運(yùn)行, 命令結(jié)束容器退出
注意:docker 容器默認(rèn)會(huì)把容器內(nèi)部第一個(gè)進(jìn)程,也就是 pid=1 的程序作為docker容器是否正在運(yùn)行的依據(jù),如果docker容器中 pid=1的進(jìn)程掛了,那么docker容器便會(huì)直接退出,也就是說Docker容器中必須有一個(gè)前臺(tái)進(jìn)程,否則認(rèn)為進(jìn)程已經(jīng)掛掉。
運(yùn)行過程:
(1)檢查本地是否存在指定的鏡像。當(dāng)鏡像不存在時(shí),會(huì)從公有倉庫下載;
(2)利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器;
(3)分配一個(gè)文件系統(tǒng)給容器,在只讀的鏡像層外面掛載一層可讀寫層;
(4)從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬機(jī)接口到容器中;
(5)分配一個(gè)地址池中的 IP 地址給容器;
(6)執(zhí)行用戶指定的應(yīng)用程序,執(zhí)行完畢后容器被終止運(yùn)行。
6、docker 容器7個(gè)的生命周期
(1)create:已創(chuàng)建還未運(yùn)行的容器
(2)running:正在運(yùn)行中的容器
(3)restarting:容器正在重啟中
(4)removing:容器正在遷移中
(5)paused:容器已暫停的狀態(tài)
(6)exited:停止容器運(yùn)行
(7)dead:死亡,主要是操作系統(tǒng)出現(xiàn)異?;驍帱c(diǎn)導(dǎo)致
暫停和停止?fàn)顟B(tài)的區(qū)別:
paused 命令掛起指定的容器中的所有進(jìn)程為暫停,
stop:表示殺掉正在運(yùn)行的docker容器進(jìn)程,默認(rèn)是10s后
7、docker容器導(dǎo)出導(dǎo)入
容器從一臺(tái)機(jī)器遷移到另一臺(tái)機(jī)器。在遷移過程中,可以使用docker export命令將已經(jīng)創(chuàng)建號(hào)的容器導(dǎo)出為文件,無論這個(gè)容器是處于運(yùn)行狀態(tài)還是停止?fàn)顟B(tài)均可導(dǎo)出。
導(dǎo)出格式:docker export 容器id/容器名稱 >文件夾名
或者 docker export -o 文件名.tar 容器唯一id
-o 指定文件
導(dǎo)入格式:cat 文件| docker import - centos8:test #自定義容器名
或 docker import 文件名.tar -- 容器名:標(biāo)簽名
方法一:
方法二:
8、 刪除容器
格式:docker [選項(xiàng)] 容器id/名稱
[選項(xiàng)]:-f 強(qiáng)制刪除
作用:刪除容器,若容器在運(yùn)行中建議先停止再刪除
批量刪除沒有運(yùn)行的容器
docker rm $(docker ps -a -q | grep -v $(docker ps -q ))
三、Docker網(wǎng)絡(luò)
Docker 網(wǎng)絡(luò)實(shí)現(xiàn)原理
Docker使用Linux橋接,在宿主機(jī)虛擬一個(gè)Docker容器網(wǎng)橋(docker0),Docker啟動(dòng)一個(gè)容器時(shí)會(huì)根據(jù)Docker網(wǎng)橋的網(wǎng)段分配給容器一個(gè)IP地址,稱為Container-IP,同時(shí)Docker網(wǎng)橋是每個(gè)容器的默認(rèn)網(wǎng)關(guān)。因?yàn)樵谕凰拗鳈C(jī)內(nèi)的容器都接入同一個(gè)網(wǎng)橋,這樣容器之間就能夠通過容器的 Container-IP 直接通信。
Docker網(wǎng)橋是宿主機(jī)虛擬出來的,并不是真實(shí)存在的網(wǎng)絡(luò)設(shè)備,外部網(wǎng)絡(luò)是無法尋址到的,這也意味著外部網(wǎng)絡(luò)無法直接通過 Container-IP 訪問到容器。如果容器希望外部訪問能夠訪問到,可以通過映射容器端口到宿主主機(jī)(端口映射),即 docker run 創(chuàng)建容器時(shí)候通過 -p 或 -P 參數(shù)來啟用,訪問容器的時(shí)候就通過[宿主機(jī)IP]:[容器端口]
訪問容器。
1、host模式
docker中的容器使用宿主機(jī)的ip地址但是端口號(hào)不同,Docker使用了Linux的Namespaces技術(shù)來進(jìn)行資源隔離,如PID Namespace隔離進(jìn)程,Mount Namespace隔離文件系統(tǒng),Network Namespace隔離網(wǎng)絡(luò)等。
一個(gè)Network Namespace提供了一份獨(dú)立的網(wǎng)絡(luò)環(huán)境,包括網(wǎng)卡、路由、iptable規(guī)則等都與其他的Network Namespace隔離。 一個(gè)Docker容器一般會(huì)分配一個(gè)獨(dú)立的Network Namespace。 但如果啟動(dòng)容器的時(shí)候使用host模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的Network Namespace, 而是和宿主機(jī)共用一個(gè)Network Namespace。容器將不會(huì)虛擬出自己的網(wǎng)卡、配置自己的IP等,而是使用宿主機(jī)的IP和端口。
配置:創(chuàng)建容器時(shí)添加使用 --net=host
指定容器為host模式。
2、container模式
container模式則是docker容器中所有的容器共享一個(gè)Network Namespace而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP、端口范圍等。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng)、進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過lo網(wǎng)卡設(shè)備通信。
配置:創(chuàng)建容器時(shí)添加使用 --net=container
指定容器為host模式。
查看該容器的進(jìn)程
docker inspect -f '{{.State.Pid}}' 容器ID號(hào)
3、none模式
none模式,Docker容器擁有自己的Network Namespace,但是,并不為Docker容器進(jìn)行任何網(wǎng)絡(luò)配置。 也就是說,這個(gè)Docker容器沒有網(wǎng)卡、IP、路由等信息。這種網(wǎng)絡(luò)模式下容器只有l(wèi)o回環(huán)網(wǎng)絡(luò),沒有其他網(wǎng)卡。這種類型的網(wǎng)絡(luò)沒有辦法聯(lián)網(wǎng),封閉的網(wǎng)絡(luò)能很好的保證容器的安全性。
配置:創(chuàng)建容器時(shí)添加使用 --net=none
指定容器為host模式。
4、bridge模式
bridge模式為docker的默認(rèn)模式,安裝docker時(shí)就已經(jīng)產(chǎn)出了一個(gè) docerk0 的虛擬網(wǎng)卡,bridge模式容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。
(1)當(dāng)Docker進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為docker0的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的Docker容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。
(2)從docker0子網(wǎng)中分配一個(gè)IP給容器使用,并設(shè)置docker0的IP地址為容器的默認(rèn)網(wǎng)關(guān)。在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡veth pair設(shè)備。 veth設(shè)備總是成對(duì)出現(xiàn)的,它們組成了一個(gè)數(shù)據(jù)的通道,數(shù)據(jù)從一個(gè)設(shè)備進(jìn)入,就會(huì)從另一個(gè)設(shè)備出來。因此,veth設(shè)備常用來連接兩個(gè)網(wǎng)絡(luò)設(shè)備。
(3)Docker將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為 eth0(容器的網(wǎng)卡),另一端放在主機(jī)中, 以 veth* 這樣類似的名字命名, 并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到 docker0 網(wǎng)橋中??梢酝ㄟ^ brctl show 命令查看。
(4)使用 docker run -p 時(shí),docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能。可以使用iptables -t nat -vnL 查看。
5、自定義網(wǎng)絡(luò)
直接使用bridge模式,是無法支持指定IP運(yùn)行docker的,例如執(zhí)行以下命令就會(huì)報(bào)錯(cuò)
docker run -itd --name test3 --network bridge --ip 172.17.0.1 centos:7 /bin/bash
#docker1 為執(zhí)行 ifconfig -a 命令時(shí),顯示的網(wǎng)卡名,如果不使用 --opt 參數(shù)指定此名稱,那你在使用 ifconfig -a 命令查看網(wǎng)絡(luò)信息時(shí),看到的是類似 br-110eb56a0b22 這樣的名字,這顯然不怎么好記。
#mynetwork 為執(zhí)行 docker network list 命令時(shí),顯示的bridge網(wǎng)絡(luò)模式名稱。
創(chuàng)建自定義網(wǎng)絡(luò)
#可以先自定義網(wǎng)絡(luò),再使用指定IP運(yùn)行docker
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
docker run -itd --network=mynetwork --ip 172.18.0.100 nginx:1.14
docker inspect 容器ID
可以查看容器的IP
四、Docker數(shù)據(jù)管理
1、數(shù)據(jù)管理類型
管理 Docker 容器中數(shù)據(jù)主要有兩種方式:數(shù)據(jù)卷(Data Volumes)和數(shù)據(jù)卷容器(DataVolumes Containers)
2、數(shù)據(jù)卷
數(shù)據(jù)卷是一個(gè)供容器使用的特殊目錄,位于容器中??蓪⑺拗鳈C(jī)的目錄掛載到數(shù)據(jù)卷上,,對(duì)數(shù)據(jù)卷的修改操作立刻可見,并且更新數(shù)據(jù)不會(huì)影響鏡像,從而實(shí)現(xiàn)數(shù)據(jù)在宿主機(jī)與容器之間的遷移。數(shù)據(jù)卷的使用類似于 Linux 下對(duì)目錄進(jìn)行的 mount 操作,可以互相同步內(nèi)容
mkdir /var/www
#宿主機(jī)創(chuàng)建目錄
docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash
#創(chuàng)建容器centos7并命名為web1.將宿主機(jī)的/var/www目錄掛載到容器中的/data1卷中
# -v 選項(xiàng)表示容器中創(chuàng)建數(shù)據(jù)卷
echo "this is web1" > /data1/a.txt
exit
#數(shù)據(jù)卷中創(chuàng)建內(nèi)容a.txt并退出
cd /var/www/
#進(jìn)入宿主機(jī)的掛載目錄
cat a.txt
#驗(yàn)證容器中數(shù)據(jù)卷內(nèi)容
echo 123>abc.txt
#宿主機(jī)的掛載目錄創(chuàng)建一個(gè)文件夾
docker start web1
docker exec -it web1 /bin/bash
#開啟web1容器并進(jìn)入
ls /data1
#顯示data1數(shù)據(jù)卷驗(yàn)證其中是否有abc.txt
3、數(shù)據(jù)卷容器
–volumes-from 要掛載那個(gè)容器名稱/id號(hào) #用于容器之間的掛載
如果需要在容器之間共享一些數(shù)據(jù),最簡單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個(gè)普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。
docker run --name web3 -v /data1 -v /data2 -it centos:7 /bin/bash
#創(chuàng)建數(shù)據(jù)卷容器web3 并創(chuàng)建2個(gè)data目錄
echo "this is web3" > /data1/abc.txt
echo "This is web3" > /data2/ABC.txt
#web3容器2個(gè)data下創(chuàng)建文件
docker run -it --volumes-from web3 --name web4 centos:7 /bin/bash
#使用 --volumes-from 來掛載 web3 容器中的數(shù)據(jù)卷到新的容器
4、端口映射
在啟動(dòng)容器的時(shí)候,如果不指定對(duì)應(yīng)的端口,在容器外是無法通過網(wǎng)絡(luò)來訪問容器內(nèi)的服務(wù)。端口映射機(jī)制將容器內(nèi)的服務(wù)提供給外部網(wǎng)絡(luò)訪問,實(shí)質(zhì)上就是將宿主機(jī)的端口映射到容器中,使得外部網(wǎng)絡(luò)訪問宿主機(jī)的端口便可訪問容器內(nèi)的服務(wù)。
docker run -d --name test1 -P nginx #隨機(jī)映射端口(從32768開始)
docker run -d --name test2 -p 43000:80 nginx #指定映射端口
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9d3c04f57a68 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:43000->80/tcp test2
b04895f870e5 nginx "/docker-entrypoint.…" 17 seconds ago Up 15 seconds 0.0.0.0:49170->80/tcp test1
瀏覽器訪問:http://192.168.154.10:43000 、http://192.168.154.10:49170
5、容器的互聯(lián)
容器互聯(lián)是通過容器的名稱在容器間建立一條專門的網(wǎng)絡(luò)通信隧道。簡單點(diǎn)說,就是會(huì)在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息。文章來源:http://www.zghlxwxcb.cn/news/detail-471247.html
#創(chuàng)建并運(yùn)行源容器取名web1
docker run -itd -P --name web01 centos:7 /bin/bash
#創(chuàng)建并運(yùn)行接收容器取名web2,使用--link選項(xiàng)指定連接容器以實(shí)現(xiàn)容器互聯(lián)
docker run -itd -P --name web02 --link web01:web01 centos:7 /bin/bash
#登錄web02容器
docker exec -it web02 bash
#測(cè)試連通性
ping web01
文章來源地址http://www.zghlxwxcb.cn/news/detail-471247.html
到了這里,關(guān)于Docker基本管理與網(wǎng)絡(luò)以及數(shù)據(jù)管理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!