Docker奪命連環(huán)15問,你能堅持第幾問?
本文總結了Docker常見的問題和坑,采用問答的形式,分享給大家
Docker 是一個開源的應用容器引擎,基于go 語言開發(fā)并遵循了apache2.0 協(xié)議開源
Docker 是在Linux 容器里運行應用的開源工具,是一種輕量級的“虛擬機”
Docker 的容器技術可以在一臺主機上輕松為任何應用創(chuàng)建一個輕量級的,可移植的,自給自足的容器
也可以這樣形象的比喻:
◆ 2.Docker的應用場景有哪些?
Web 應用的自動化打包和發(fā)布。
自動化測試和持續(xù)集成、發(fā)布。
在服務型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺應用。
從頭編譯或者擴展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環(huán)境。
?? 在這里我重點介紹下Docker作為內(nèi)部開發(fā)環(huán)境的場景
在容器技術出現(xiàn)之前,公司往往是通過為每個開發(fā)人員提供一臺或者多臺虛擬機來充當開發(fā)測試環(huán)境。
開發(fā)測試環(huán)境一般負載較低,大量的系統(tǒng)資源都被浪費在虛擬機本身的進程上了。
Docker容器沒有任何CPU和內(nèi)存上的額外開銷,很適合用來提供公司內(nèi)部的開發(fā)測試環(huán)境。
而且由于docker鏡像可以很方便的在公司內(nèi)部分享,這對開發(fā)環(huán)境的規(guī)范性也有極大的幫助。
如果要把容器作為開發(fā)機使用,需要解決的是遠程登錄容器和容器內(nèi)進程管理問題。
雖然docker的初衷是為“微服務”架構設計的,但根據(jù)我們的實際使用經(jīng)驗,
在docker內(nèi)運行多個程序,甚至sshd或者upstart也是可行的。
◆ 3.Docker的優(yōu)點有哪些?
容器化越來越受歡迎,Docker的容器有點總結如下:
靈活:即使是最復雜的應用也可以集裝箱化。
輕量級:容器利用并共享主機內(nèi)核。
可互換:可以即時部署更新和升級。
便攜式:可以在本地構建,部署到云,并在任何地方運行。
可擴展:可以增加并白動分發(fā)容器副本。
可堆疊:可以垂直和即時堆疊服務。

虛擬機通過添加Hypervisor層(虛擬化中間層),虛擬出網(wǎng)卡、內(nèi)存、CPU等虛擬硬件,再在其上建立虛擬機,每個虛擬機都有自己的系統(tǒng)內(nèi)核。而Docker容器則是通過隔離(namesapce)的方式,將文件系統(tǒng)、進程、設備、網(wǎng)絡等資源進行隔離,再對權限、CPU資源等進行控制(cgroup),最終讓容器之間互不影響,容器無法影響宿主機。微信搜索公眾號:Java項目精選,回復:java 領取資料 。
與虛擬機相比,容器資源損耗要少。同樣的宿主機下,能夠建立容器的數(shù)量要比虛擬機多
但是,虛擬機的安全性要比容器稍好,而docker容器與宿主機共享內(nèi)核、文件系統(tǒng)等資源,更有可能對其他容器、宿主機產(chǎn)生影響。

◆ 5.Docker的三大核心是什么?
?? 鏡像
Docker的鏡像是創(chuàng)建容器的基礎,類似虛擬機的快照,可以理解為一個面向Docker容器引擎的只讀模板。
通過鏡像啟動一個容器,一個鏡像是一個可執(zhí)行的包,其中包括運行應用程序所需要的所有內(nèi)容包含代碼,運行時間,庫、環(huán)境變量、和配置文件。
Docker鏡像也是一個壓縮包,只是這個壓縮包不只是可執(zhí)行文件,環(huán)境部署腳本,它還包含了完整的操作系統(tǒng)。因為大部分的鏡像都是基于某個操作系統(tǒng)來構建,所以很輕松的就可以構建本地和遠端一樣的環(huán)境,這也是Docker鏡像的精髓。
?? 容器
Docker的容器是從鏡像創(chuàng)建的運行實例,它可以被啟動、停止和刪除。所創(chuàng)建的每一個容器都是相互隔離、互不可見,以保證平臺的安全性。可以把容器看做是一個簡易版的linux環(huán)境(包括root用戶權限、鏡像空間、用戶空間和網(wǎng)絡空間等)和運行在其中的應用程序。
?? 倉庫
倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中包含了多個鏡像,每個鏡像有不同標簽(tag)。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是 Docker Hub:https://hub.docker.com,存放了數(shù)量龐大的鏡像供用戶下載。
國內(nèi)的公開倉庫包括阿里云 、網(wǎng)易云等。
◆ 6.如何快速安裝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 --查看版本
默認情況下 Docker的存放位置為:/var/lib/docker
可以通過命令查看具體位置:docker info | grep “Docker Root Dir”
?? 修改到其它目錄
首先停掉 Docker 服務:
systemctl stop docker
然后移動整個/var/lib/docker 目錄到目的路徑
mkdir -p /root/data/docker
mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker --快捷方式
格式:docker search 關鍵字
格式:docker ? pull ? 倉庫名稱[:標簽]
如果下載鏡像時不指定標簽,則默認會下載倉庫中最新版本的鏡像,即選擇標簽為 latest 標簽
鏡像下載后默認存放在 /var/lib/docker
REPOSITORY: 鏡像所屬倉庫
TAG: 鏡像的標簽信息,標記同一個倉庫中的不同鏡像
IMAGE ID :鏡像的唯一ID號,唯一標識一個鏡像
CREATED: 鏡像創(chuàng)建時間
SIZE: 鏡像大小


??為本地鏡像添加新的標簽
格式:docker ? tag ?名稱:[ 標簽]
?? 刪除鏡像
格式1:docker ? rmi ? 倉庫名稱:標簽
當一個鏡像有多個標簽時,只是刪除其中指定的標簽
格式2: docker ? rmi ?鏡像ID ?[-f]
如果該鏡像已經(jīng)被容器使用,正確的做法是先刪除依賴該鏡像的所有容器,再去刪除鏡像
#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#我想擁有一個 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# 進入容器docker exec -it centos7.8bashdocker exec -it centos8.2 bashcat /etc/redhat-release --查看系統(tǒng)版本
檢查本地是否存在指定的鏡像。當鏡像不存在時,會從公有倉庫下載;
利用鏡像創(chuàng)建并啟動一個容器;
分配一個文件系統(tǒng)給容器,在只讀的鏡像層外面掛載一層可讀寫層;
從宿主主機配置的網(wǎng)橋接口中橋接一個虛擬機接口到容器中;
分配一個地址池中的 IP 地址給容器;
執(zhí)行用戶指定的應用程序,執(zhí)行完畢后容器被終止運行。
但是如果啟動容器的時候使用host 模式,那么這個容器將不會獲得一個獨立的Network Namespace ,而是和宿主機共用一個Network Namespace 。容器將不會虛擬出自己的網(wǎng)卡,配置自己的IP等,而是使用宿主機的IP和端口.此時容器不再擁有隔離的、獨立的網(wǎng)絡棧。不擁有所有端口資源

container模式:使用–net=contatiner:NAME_or_ID 指定
這個模式指定新創(chuàng)建的容器和已經(jīng)存在的一個容器共享一個Network Namespace,而不是和宿主機共享。**新創(chuàng)建的容器不會創(chuàng)建自己的網(wǎng)卡,配置自己的IP,而是和一個指定的容器共享IP,端口范圍等。**可以在一定程度上節(jié)省網(wǎng)絡資源,容器內(nèi)部依然不會擁有所有端口。
同樣,兩個容器除了網(wǎng)絡方面,其他的如文件系統(tǒng),進程列表等還是隔離的。
兩個容器的進程可以通過lo網(wǎng)卡設備通信

?? bridge 模式

◆ 12.什么是Docker的數(shù)據(jù)卷
數(shù)據(jù)卷是一個供容器使用的特殊目錄,位于容器中??蓪⑺拗鳈C的目錄掛載到數(shù)據(jù)卷上,對數(shù)據(jù)卷的修改操作立刻可見,并且更新數(shù)據(jù)不會影響鏡像,從而實現(xiàn)數(shù)據(jù)在宿主機與容器之間的遷移。數(shù)據(jù)卷的使用類似于Linux下對目錄進行的mount操作。
如果需要在容器之間共享一些數(shù)據(jù),最簡單的方法就是使用數(shù)據(jù)卷容器。數(shù)據(jù)卷容器是一個普通的容器,專門提供數(shù)據(jù)卷給其他容器掛載使用。
容器互聯(lián)是通過容器的名稱在容器間建立一條專門的網(wǎng)絡通信隧道。簡單點說,就是會在源容器和接收容器之間建立一條隧道,接收容器可以看到源容器指定的信息
1.拉取私有倉庫鏡像[]Using default tag: latest2.啟動私有倉庫容器docker run -di --name registry -p 5000:5000 registrydocker update --restart=always registry --開機自啟動docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"訪問網(wǎng)址:http://192.168.1.54:5000/v2/_catalog3.設置信任[]{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"],"insecure-registries":["192.168.1.54:5000"]}[]4.上傳本地鏡像[][][]5.重新拉取鏡像[][][]
◆ 14.Docker如何遷移備份?
1.容器保存為鏡像[root@jeames ~]# docker images[root@jeames ~]# docker ps -adocker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"[root@jeames ~]# docker commit redis myredis##使用新的鏡像創(chuàng)建容器docker run -di --name myredis myredis2.鏡像的備份[root@jeames ~]# docker save -o myredis.tar myredis默認放到當前目錄[root@jeames ~]# ll[root@jeames ~]# pwd3.恢復過程##刪除容器docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"docker stop myredisdocker rm myredis##刪除鏡像docker imagesdocker rmi myredis[root@jeames ~]# docker load -i myredis.tar

來源:https://blog.csdn.net/weixin_41645135/article/details/125513040
聯(lián)合一線大廠朋友花費8個月的時間,錄制了一份Java入門+進階視頻教程
課程特色:
總共88G,時常高達365小時,覆蓋所有主流技術棧
均為同一人錄制,不是東拼西湊的
對標線下T0級別的培訓課,講師大廠架構師,多年授課經(jīng)驗,通俗易懂
內(nèi)容豐富,每一個技術點除了視頻,還有課堂源碼、筆記、PPT、圖解
五大實戰(zhàn)項目(視頻+源碼+筆記+SQL+軟件)
一次付費,持續(xù)更新,永無二次費用
點擊下方超鏈接查看詳情
(或者點擊文末閱讀原文):



