Docker奪命連環(huán)15問(wèn),你能堅(jiān)持第幾問(wèn)?
程序員的成長(zhǎng)之路互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
關(guān)注
閱讀本文大概需要 10?分鐘。
來(lái)自:blog.csdn.net/weixin_41645135/article
目錄
- 什么是Docker?
- Docker的應(yīng)用場(chǎng)景有哪些?
- Docker的優(yōu)點(diǎn)有哪些?
- Docker與虛擬機(jī)的區(qū)別是什么?
- Docker的三大核心是什么?
- 如何快速安裝Docker?
- 如何修改Docker的存儲(chǔ)位置?
- Docker鏡像常用管理有哪些?
- 如何創(chuàng)建Docker容器?
- Docker在后臺(tái)的標(biāo)準(zhǔn)運(yùn)行過(guò)程是什么?
- Docker網(wǎng)絡(luò)模式有哪些?
- 什么是Docker的數(shù)據(jù)卷
- 如何搭建Docker私有倉(cāng)庫(kù)
- Docker如何遷移備份?
- Docker如何部署MySQL?
前言
本文總結(jié)了Docker常見的問(wèn)題和坑,采用問(wèn)答的形式,分享給大家1.什么是Docker?
- Docker 是一個(gè)開源的應(yīng)用容器引擎,基于go 語(yǔ)言開發(fā)并遵循了apache2.0 協(xié)議開源
- Docker 是在Linux 容器里運(yùn)行應(yīng)用的開源工具,是一種輕量級(jí)的“虛擬機(jī)”
- Docker 的容器技術(shù)可以在一臺(tái)主機(jī)上輕松為任何應(yīng)用創(chuàng)建一個(gè)輕量級(jí)的,可移植的,自給自足的容器
Docker 的Logo設(shè)計(jì)為藍(lán)色鯨魚,拖著許多集裝箱,鯨魚可以看作為宿主機(jī),集裝箱可以理解為相互隔離的容器,每個(gè)集裝箱中都包含自己的應(yīng)用程序。
2.Docker的應(yīng)用場(chǎng)景有哪些?
- Web 應(yīng)用的自動(dòng)化打包和發(fā)布。
- 自動(dòng)化測(cè)試和持續(xù)集成、發(fā)布。
- 在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫(kù)或其他的后臺(tái)應(yīng)用。
- 從頭編譯或者擴(kuò)展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺(tái)來(lái)搭建自己的 PaaS 環(huán)境。
3.Docker的優(yōu)點(diǎn)有哪些?
容器化越來(lái)越受歡迎,Docker的容器有點(diǎn)總結(jié)如下:- 靈活:即使是最復(fù)雜的應(yīng)用也可以集裝箱化。
- 輕量級(jí):容器利用并共享主機(jī)內(nèi)核。
- 可互換:可以即時(shí)部署更新和升級(jí)。
- 便攜式:可以在本地構(gòu)建,部署到云,并在任何地方運(yùn)行。
- 可擴(kuò)展:可以增加并白動(dòng)分發(fā)容器副本。
- 可堆疊:可以垂直和即時(shí)堆疊服務(wù)。
Docker 是一個(gè)用于開發(fā),交付和運(yùn)行應(yīng)用程序的開放平臺(tái)。Docker 使您能夠?qū)?yīng)用程序與基礎(chǔ)架構(gòu)分開,從而可以快速交付軟件。借助 Docker,您可以與管理應(yīng)用程序相同的方式來(lái)管理基礎(chǔ)架構(gòu)。通過(guò)利用 Docker 的方法來(lái)快速交付,測(cè)試和部署代碼,您可以大大減少編寫代碼和在生產(chǎn)環(huán)境中運(yùn)行代碼之間的延遲。4.Docker與虛擬機(jī)的區(qū)別是什么?
虛擬機(jī)通過(guò)添加Hypervisor層(虛擬化中間層),虛擬出網(wǎng)卡、內(nèi)存、CPU等虛擬硬件,再在其上建立虛擬機(jī),每個(gè)虛擬機(jī)都有自己的系統(tǒng)內(nèi)核。而Docker容器則是通過(guò)隔離(namesapce)的方式,將文件系統(tǒng)、進(jìn)程、設(shè)備、網(wǎng)絡(luò)等資源進(jìn)行隔離,再對(duì)權(quán)限、CPU資源等進(jìn)行控制(cgroup),最終讓容器之間互不影響,容器無(wú)法影響宿主機(jī)。與虛擬機(jī)相比,容器資源損耗要少。同樣的宿主機(jī)下,能夠建立容器的數(shù)量要比虛擬機(jī)多但是,虛擬機(jī)的安全性要比容器稍好,而docker容器與宿主機(jī)共享內(nèi)核、文件系統(tǒng)等資源,更有可能對(duì)其他容器、宿主機(jī)產(chǎn)生影響。
5.Docker的三大核心是什么?
鏡像
Docker的鏡像是創(chuàng)建容器的基礎(chǔ),類似虛擬機(jī)的快照,可以理解為一個(gè)面向Docker容器引擎的只讀模板。通過(guò)鏡像啟動(dòng)一個(gè)容器,一個(gè)鏡像是一個(gè)可執(zhí)行的包,其中包括運(yùn)行應(yīng)用程序所需要的所有內(nèi)容包含代碼,運(yùn)行時(shí)間,庫(kù)、環(huán)境變量、和配置文件。Docker鏡像也是一個(gè)壓縮包,只是這個(gè)壓縮包不只是可執(zhí)行文件,環(huán)境部署腳本,它還包含了完整的操作系統(tǒng)。因?yàn)榇蟛糠值溺R像都是基于某個(gè)操作系統(tǒng)來(lái)構(gòu)建,所以很輕松的就可以構(gòu)建本地和遠(yuǎn)端一樣的環(huán)境,這也是Docker鏡像的精髓。容器
Docker的容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例,它可以被啟動(dòng)、停止和刪除。所創(chuàng)建的每一個(gè)容器都是相互隔離、互不可見,以保證平臺(tái)的安全性??梢园讶萜骺醋鍪且粋€(gè)簡(jiǎn)易版的linux環(huán)境(包括root用戶權(quán)限、鏡像空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序。倉(cāng)庫(kù)
倉(cāng)庫(kù)注冊(cè)服務(wù)器上往往存放著多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)中包含了多個(gè)鏡像,每個(gè)鏡像有不同標(biāo)簽(tag)。倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)(Public)和私有倉(cāng)庫(kù)(Private)兩種形式。最大的公開倉(cāng)庫(kù)是 Docker Hub:https://hub.docker.com,存放了數(shù)量龐大的鏡像供用戶下載。國(guó)內(nèi)的公開倉(cāng)庫(kù)包括阿里云 、網(wǎng)易云等。6.如何快速安裝Docker?
執(zhí)行以下安裝命令去安裝依賴包
yum?install?-y?yum-utils?device-mapper-persistent-data?lvm2
sudo?yum-config-manager
–add-repo
https://download.docker.com/linux/centos/docker-ce.repo
[root@centos7?~]?yum?-y?install?docker-ce?docker-ce-cli?containerd.io
[root@centos7?~]#?docker?ps?--查看docker

[root@centos7?~]#?systemctl?enable?docker
[root@centos7?~]#?systemctl?start?docker
[root@centos7?~]#?systemctl?status?docker
[root@centos7?~]#?docker?ps?--查看容器
[root@centos7?~]#?docker?version?--查看版本
[root@centos7?~]#?docker?info?--查看版本
7.如何修改Docker的存儲(chǔ)位置?
默認(rèn)情況下 Docker的存放位置為:/var/lib/docker可以通過(guò)命令查看具體位置:docker info | grep “Docker Root Dir”修改到其它目錄
首先停掉 Docker 服務(wù):
systemctl?stop?docker
然后移動(dòng)整個(gè)/var/lib/docker 目錄到目的路徑
mkdir?-p?/root/data/docker
mv?/var/lib/docker?/root/data/docker
ln?-s?/root/data/docker?/var/lib/docker?--快捷方式
8.Docker鏡像常用管理有哪些?
快速檢索鏡像
格式:docker search?關(guān)鍵字獲取鏡像
格式:docker ? pull?? 倉(cāng)庫(kù)名稱[:標(biāo)簽] 如果下載鏡像時(shí)不指定標(biāo)簽,則默認(rèn)會(huì)下載倉(cāng)庫(kù)中最新版本的鏡像,即選擇標(biāo)簽為 latest 標(biāo)簽查看鏡像信息
鏡像下載后默認(rèn)存放在?/var/lib/docker-
REPOSITORY: 鏡像所屬倉(cāng)庫(kù) -
TAG: 鏡像的標(biāo)簽信息,標(biāo)記同一個(gè)倉(cāng)庫(kù)中的不同鏡像 -
IMAGE ID?:鏡像的唯一ID號(hào),唯一標(biāo)識(shí)一個(gè)鏡像 -
CREATED: 鏡像創(chuàng)建時(shí)間 -
SIZE: 鏡像大小

獲取鏡像的詳細(xì)信息
格式:docker ? inspect?? 鏡像ID號(hào)鏡像ID 號(hào)可以不用打全。
為本地鏡像添加新的標(biāo)簽
格式:docker ? tag ?名稱:[ 標(biāo)簽]刪除鏡像
格式1:docker ? rmi ? 倉(cāng)庫(kù)名稱:標(biāo)簽當(dāng)一個(gè)鏡像有多個(gè)標(biāo)簽時(shí),只是刪除其中指定的標(biāo)簽格式2:?docker ? rmi ?鏡像ID ?[-f]如果該鏡像已經(jīng)被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像將鏡像保存為本地文件
格式:docker ? save ? -o ?存儲(chǔ)文件名 ? 存儲(chǔ)的鏡像
[root@localhost?~]#?docker?save?-o?/opt/nginx.tar?nginx:latest
#將本地鏡像傳給另一臺(tái)主機(jī)
[root@localhost?~]#?scp?/opt/nginx.tar?192.168.1.54:/opt
9.如何創(chuàng)建Docker容器?
#docker?images???--鏡像
docker?run?-d?--name?centos7.8?-h?centos7.8?\
-p?220:22?-p?3387:3389?\
--privileged=true?\
centos:7.8.2003?/usr/sbin/init
#我想擁有一個(gè)?linux?8.2?的環(huán)境
docker?run?-d?--name?centos8.2?-h?centos8.2?\
-p?230:22?-p?3386:3389?\
--privileged=true?\
daocloud.io/library/centos:8.2.2004?init
#?進(jìn)入容器
docker?exec?-it?centos7.8bash
docker?exec?-it?centos8.2?bash
cat?/etc/redhat-release????--查看系統(tǒng)版本
10.Docker在后臺(tái)的標(biāo)準(zhǔn)運(yùn)行過(guò)程是什么?
當(dāng)利用?docker run?來(lái)創(chuàng)建容器時(shí), Docker 在后臺(tái)的標(biāo)準(zhǔn)運(yùn)行過(guò)程是:- 檢查本地是否存在指定的鏡像。當(dāng)鏡像不存在時(shí),會(huì)從公有倉(cāng)庫(kù)下載;
- 利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器;
- 分配一個(gè)文件系統(tǒng)給容器,在只讀的鏡像層外面掛載一層可讀寫層;
- 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬機(jī)接口到容器中;
- 分配一個(gè)地址池中的 IP 地址給容器;
- 執(zhí)行用戶指定的應(yīng)用程序,執(zhí)行完畢后容器被終止運(yùn)行。
11.Docker網(wǎng)絡(luò)模式有哪些?
host模式
host 模式 :使用?--net=host?指定相當(dāng)于VMware 中的橋接模式,與宿主機(jī)在同一個(gè)網(wǎng)絡(luò)中,但是沒有獨(dú)立IP地址Docker 使用了Linux 的Namespace 技術(shù)來(lái)進(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和端口.此時(shí)容器不再擁有隔離的、獨(dú)立的網(wǎng)絡(luò)棧。不擁有所有端口資源
container模式
container模式:使用–net=contatiner:NAME_or_ID?指定這個(gè)模式指定新創(chuàng)建的容器和已經(jīng)存在的一個(gè)容器共享一個(gè)Network Namespace,而不是和宿主機(jī)共享。新創(chuàng)建的容器不會(huì)創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個(gè)指定的容器共享IP,端口范圍等。?可以在一定程度上節(jié)省網(wǎng)絡(luò)資源,容器內(nèi)部依然不會(huì)擁有所有端口。同樣,兩個(gè)容器除了網(wǎng)絡(luò)方面,其他的如文件系統(tǒng),進(jìn)程列表等還是隔離的。兩個(gè)容器的進(jìn)程可以通過(guò)lo網(wǎng)卡設(shè)備通信
none 模式
none模式:使用?--net=none指定使用none 模式,docker 容器有自己的network Namespace?,但是并不為Docker 容器進(jìn)行任何網(wǎng)絡(luò)配置。也就是說(shuō),這個(gè)Docker 容器沒有網(wǎng)卡,ip, 路由等信息。這種網(wǎng)絡(luò)模式下,容器只有l(wèi)o 回環(huán)網(wǎng)絡(luò),沒有其他網(wǎng)卡。這種類型沒有辦法聯(lián)網(wǎng),但是封閉的網(wǎng)絡(luò)能很好的保證容器的安全性該容器將完全獨(dú)立于網(wǎng)絡(luò),用戶可以根據(jù)需要為容器添加網(wǎng)卡。此模式擁有所有端口。(none網(wǎng)絡(luò)模式配置網(wǎng)絡(luò))特殊情況下才會(huì)用到,一般不用bridge 模式
相當(dāng)于Vmware中的 nat 模式,容器使用獨(dú)立network Namespace,并連接到docker0虛擬網(wǎng)卡。通過(guò)docker0網(wǎng)橋以及iptables nat表配置與宿主機(jī)通信,此模式會(huì)為每一個(gè)容器分配Network Namespace、設(shè)置IP等,并將一個(gè)主機(jī)上的 Docker 容器連接到一個(gè)虛擬網(wǎng)橋上。當(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ī)上的所有容器就通過(guò)交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。從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è)備出來(lái)。因此,veth設(shè)備常用來(lái)連接兩個(gè)網(wǎng)絡(luò)設(shè)備。Docker將veth pair?設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0(容器的網(wǎng)卡),另一端放在主機(jī)中, 以veth*這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。可以通過(guò)?brctl show?命令查看。容器之間通過(guò)veth pair進(jìn)行訪問(wèn)使用?docker run -p?時(shí),docker實(shí)際是在iptables做了DNAT規(guī)則,實(shí)現(xiàn)端口轉(zhuǎn)發(fā)功能??梢允褂?code style="font-size:14px;background-color:rgba(27,31,35,.05);font-family:'Operator Mono', Consolas, Monaco, Menlo, monospace;color:rgb(239,112,96);">iptables -t nat -vnL?查看。
12.什么是Docker的數(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操作。如果需要在容器之間共享一些數(shù)據(jù),最簡(jiǎn)單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個(gè)普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。容器互聯(lián)是通過(guò)容器的名稱在容器間建立一條專門的網(wǎng)絡(luò)通信隧道。簡(jiǎn)單點(diǎn)說(shuō),就是會(huì)在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息13.如何搭建Docker私有倉(cāng)庫(kù)
1.拉取私有倉(cāng)庫(kù)鏡像
[root@jeames?~]#?docker?pull?registry
Using?default?tag:?latest
docker?run?-di?--name?registry?-p?5000:5000?registry
docker?update?--restart=always?registry???--開機(jī)自啟動(dòng)
docker?ps?-a??--format?"table?{{.ID}}\t{{.Names}}\t{{.Status}}"
http://192.168.1.54:5000/v2/_catalog3.設(shè)置信任
[root@jeames?~]#?vi?/etc/docker/daemon.json
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],
"insecure-registries":["192.168.1.54:5000"]
}
[root@jeames?~]#?systemctl?restart?docker???--重啟docker
[root@jeames?~]#?docker?images
[root@jeames?~]#?docker?tag?postgres:11?192.168.1.54:5000/postgres
[root@jeames?~]#?docker?push?192.168.1.54:5000/postgres
[root@jeames?~]#?docker?rmi?192.168.1.54:5000/postgres
[root@jeames?~]#?docker?images
[root@jeames?~]#?docker?pull?192.168.1.54:5000/postgres
14.Docker如何遷移備份?
1.容器保存為鏡像
[root@jeames?~]#?docker?images
[root@jeames?~]#?docker?ps?-a
docker?ps?-a?--format?"table?{{.ID}}\t{{.Names}}\t{{.Status}}"
[root@jeames?~]#?docker?commit?redis?myredis
##使用新的鏡像創(chuàng)建容器
docker?run?-di?--name?myredis?myredis
[root@jeames?~]#?docker?save?-o?myredis.tar?myredis
[root@jeames?~]#?ll
[root@jeames?~]#?pwd
##刪除容器
docker?ps?--format?"table?{{.ID}}\t{{.Names}}\t{{.Status}}"
docker?stop?myredis
docker?rm?myredis
##刪除鏡像
docker?images
docker?rmi?myredis
[root@jeames?~]#?docker?load?-i?myredis.tar
15. Docker如何部署MySQL?
1.下載鏡像
https://hub.docker.com/?中搜索mysql
[root@jeames?~]#?docker?pull?mysql:5.7.30
[root@jeames?~]#?docker?pull?mysql:8.0.20
2.安裝部署
2.1 創(chuàng)建容器
mkdir?-p?/usr/local/mysql5730/
mkdir?-p?/usr/local/mysql8020/
docker?run?-d?--name?mysql5730?-h?mysql5730?\
-p?3309:3306?\
-v?/usr/local/mysql5730/conf:/etc/mysql/conf.d?\
-e?MYSQL_ROOT_PASSWORD=root?-e?TZ=Asia/Shanghai?\
mysql:5.7.30
docker?run?-d?--name?mysql8020?-h?mysql8020?\
-p?3310:3306?\
-v?/usr/local/mysql8020/conf:/etc/mysql/conf.d?\
-e?MYSQL_ROOT_PASSWORD=root?-e?TZ=Asia/Shanghai?\
mysql:8.0.20
##登陸容器
docker?exec?-it?mysql5730?bash
mysql?-uroot?-proot
mysql>?select?user,host?from?mysql.user
##遠(yuǎn)程訪問(wèn)
mysql?-uroot?-proot?-h192.168.59.220?-P3309
Win11 2022更新向所有符合兼容要求的用戶開放,你會(huì)升級(jí)嗎?
三種跨域解決方案:HttpClient、注解、網(wǎng)關(guān)
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)
內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)??!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?
![]()
