作者:樂章
一挡毅、簡介
1、了解Docker的前生LXC
LXC為Linux Container的簡寫暴构」虺剩可以提供輕量級的虛擬化,以便隔離進程和資源取逾,而且不需要提供指令解釋機制以及全虛擬化的其他復雜性耗绿。相當于C++中的NameSpace。容器有效地將由單個操作系統(tǒng)管理的資源劃分到孤立的組中砾隅,以更好地在孤立的組之間平衡有沖突的資源使用需求误阻。
與傳統(tǒng)虛擬化技術相比,它的優(yōu)勢在于:
(1)與宿主機使用同一個內核琉用,性能損耗卸榧ā;
(2)不需要指令級模擬邑时;
(3)不需要即時(Just-in-time)編譯奴紧;
(4)容器可以在CPU核心的本地運行指令,不需要任何專門的解釋機制晶丘;
(5)避免了準虛擬化和系統(tǒng)調用替換中的復雜性黍氮;
(6)輕量級隔離,在隔離的同時還提供共享機制浅浮,以實現容器與宿主機的資源共享沫浆。
總結:Linux Container是一種輕量級的虛擬化的手段。
Linux Container提供了在單一可控主機節(jié)點上支持多個相互隔離的server container同時執(zhí)行的機制滚秩。Linux Container有點像chroot专执,提供了一個擁有自己進程和網絡空間的虛擬環(huán)境,但又有別于虛擬機郁油,因為lxc是一種操作系統(tǒng)層次上的資源的虛擬化本股。
2、LXC與docker什么關系桐腌?
docker并不是LXC替代品拄显,docker底層使用了LXC來實現,LXC將linux進程沙盒化案站,使得進程之間相互隔離躬审,并且能夠課哦內閣制各進程的資源分配。
在LXC的基礎之上,docker提供了一系列更強大的功能承边。
3遭殉、什么是docker
docker是一個開源的應用容器引擎,基于go語言開發(fā)并遵循了apache2.0協(xié)議開源炒刁。
docker可以讓開發(fā)者打包他們的應用以及依賴包到一個輕量級恩沽、可移植的容器中,然后發(fā)布到任何流行的linux服務器翔始,也可以實現虛擬化罗心。
容器是完全使用沙箱機制,相互之間不會有任何接口(類iphone的app)城瞎,并且容器開銷極其低渤闷。
4、docker官方文檔
5脖镀、為什么docker越來越受歡迎
官方話語:
容器化越來越受歡迎飒箭,因為容器是:
靈活:即使是最復雜的應用也可以集裝箱化。
輕量級:容器利用并共享主機內核蜒灰。
可互換:您可以即時部署更新和升級弦蹂。
便攜式:您可以在本地構建,部署到云强窖,并在任何地方運行凸椿。
可擴展:您可以增加并自動分發(fā)容器副本。
可堆疊:您可以垂直和即時堆疊服務翅溺。
-
鏡像和容器(contalners)
通過鏡像啟動一個容器脑漫,一個鏡像是一個可執(zhí)行的包,其中包括運行應用程序所需要的所有內容包含代碼咙崎,運行時間优幸,庫、環(huán)境變量褪猛、和配置文件网杆。容器是鏡像的運行實例,當被運行時有鏡像狀態(tài)和用戶進程伊滋,可以使用docker ps 查看碳却。
-
容器和虛擬機
容器時在linux上本機運行,并與其他容器共享主機的內核新啼,它運行的一個獨立的進程追城,不占用其他任何可執(zhí)行文件的內存刹碾,非常輕量燥撞。虛擬機運行的是一個完成的操作系統(tǒng),通過虛擬機管理程序對主機資源進行虛擬訪問,相比之下需要的資源更多物舒。
6色洞、docker版本
Docker Community Edition(CE)社區(qū)版Enterprise Edition(EE) 商業(yè)版
7、docker和openstack的幾項對比
8冠胯、容器在內核中支持2種重要技術
docker本質就是宿主機的一個進程火诸,docker是通過namespace實現資源隔離,通過cgroup實現資源限制荠察,通過寫時復制技術(copy-on-write)實現了高效的文件操作(類似虛擬機的磁盤比如分配500g并不是實際占用物理磁盤500g)1)namespaces 名稱空間2)control Group 控制組cgroup的特點是:
cgroup的api以一個偽文件系統(tǒng)的實現方式置蜀,用戶的程序可以通過文件系統(tǒng)實現cgroup的組件管理
cgroup的組件管理操作單元可以細粒度到線程級別,另外用戶可以創(chuàng)建和銷毀cgroup悉盆,從而實現資源載分配和再利用
所有資源管理的功能都以子系統(tǒng)的方式實現盯荤,接口統(tǒng)一子任務創(chuàng)建之初與其父任務處于同一個cgroup的控制組
四大功能:
資源限制:可以對任務使用的資源總額進行限制
優(yōu)先級分配:通過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上相當于控制了任務運行優(yōu)先級
資源統(tǒng)計:可以統(tǒng)計系統(tǒng)的資源使用量焕盟,如cpu時長秋秤,內存用量等
任務控制:cgroup可以對任務執(zhí)行掛起、恢復等操作
9脚翘、了解docker三個重要概念
1)image鏡像docker鏡像就是一個只讀模板灼卢,比如,一個鏡像可以包含一個完整的centos来农,里面僅安裝apache或用戶的其他應用鞋真,鏡像可以用來創(chuàng)建docker容器,另外docker提供了一個很簡單的機制來創(chuàng)建鏡像或者更新現有的鏡像备图,用戶甚至可以直接從其他人那里下周一個已經做好的鏡像來直接使用2)container容器docker利用容器來運行應用灿巧,容器是從鏡像創(chuàng)建的運行實例,它可以被啟動揽涮,開始抠藕、停止、刪除蒋困、每個容器都是互相隔離的盾似,保證安全的平臺,可以吧容器看做是要給簡易版的linux環(huán)境(包括root用戶權限雪标、鏡像空間零院、用戶空間和網絡空間等)和運行再其中的應用程序3)repostory倉庫倉庫是集中存儲鏡像文件的滄桑,registry是倉庫主從服務器村刨,實際上參考注冊服務器上存放著多個倉庫告抄,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)倉庫分為兩種嵌牺,公有參考打洼,和私有倉庫龄糊,最大的公開倉庫是docker Hub,存放了數量龐大的鏡像供用戶下周募疮,國內的docker pool炫惩,這里倉庫的概念與Git類似,registry可以理解為github這樣的托管服務阿浓。
10他嚷、docker的主要用途
官方就是Bulid 、ship芭毙、run any app/any where筋蓖,編譯、裝載退敦、運行扭勉、任何app/在任意地放都能運行。就是實現了應用的封裝苛聘、部署涂炎、運行的生命周期管理只要在glibc的環(huán)境下,都可以運行设哗。運維生成環(huán)境中:docker化唱捣。
發(fā)布服務不用擔心服務器的運行環(huán)境,所有的服務器都是自動分配docker网梢,自動部署震缭,自動安裝,自動運行
再不用擔心其他服務引擎的磁盤問題战虏,cpu問題拣宰,系統(tǒng)問題了
資源利用更出色
自動遷移,可以制作鏡像烦感,遷移使用自定義的鏡像即可遷移巡社,不會出現什么問題
管理更加方便了
11、docker改變了什么
面向產品:產品交付
面向開發(fā):簡化環(huán)境配置
面向測試:多版本測試
面向運維:環(huán)境一致性
面向架構:自動化擴容(微服務)
二手趣、docker架構
1晌该、總體架構
distribution 負責與docker registry交互,上傳洗澡鏡像以及v2 registry 有關的源數據
registry負責docker registry有關的身份認證绿渣、鏡像查找朝群、鏡像驗證以及管理registry mirror等交互操作
image 負責與鏡像源數據有關的存儲、查找中符,鏡像層的索引姜胖、查找以及鏡像tar包有關的導入、導出操作
reference負責存儲本地所有鏡像的repository和tag名淀散,并維護與鏡像id之間的映射關系
layer模塊負責與鏡像層和容器層源數據有關的增刪改查右莱,并負責將鏡像層的增刪改查映射到實際存儲鏡像層文件的graphdriver模塊
graghdriver是所有與容器鏡像相關操作的執(zhí)行者
2堵第、docker架構2
如果覺得上面架構圖比較亂可以看這個架構:
從上圖不難看出,用戶是使用Docker Client與Docker Daemon建立通信隧出,并發(fā)送請求給后者。而Docker Daemon作為Docker架構中的主體部分阀捅,首先提供Server的功能使其可以接受Docker Client的請求胀瞪;而后Engine執(zhí)行Docker內部的一系列工作,每一項工作都是以一個Job的形式的存在饲鄙。Job的運行過程中凄诞,當需要容器鏡像時,則從Docker Registry中下載鏡像忍级,并通過鏡像管理驅動graphdriver將下載鏡像以Graph的形式存儲帆谍;當需要為Docker創(chuàng)建網絡環(huán)境時,通過網絡管理驅動networkdriver創(chuàng)建并配置Docker容器網絡環(huán)境轴咱;當需要限制Docker容器運行資源或執(zhí)行用戶指令等操作時汛蝙,則通過execdriver來完成。而libcontainer是一項獨立的容器管理包朴肺,networkdriver以及execdriver都是通過libcontainer來實現具體對容器進行的操作窖剑。當執(zhí)行完運行容器的命令后,一個實際的Docker容器就處于運行狀態(tài)戈稿,該容器擁有獨立的文件系統(tǒng)西土,獨立并且安全的運行環(huán)境等。
3鞍盗、docker架構3
再來看看另外一個架構需了,這個個架構就簡單清晰指明了server/client交互,容器和鏡像般甲、數據之間的一些聯(lián)系肋乍。這個架構圖更加清晰了架構docker daemon就是docker的守護進程即server端,可以是遠程的敷存,也可以是本地的住拭,這個不是C/S架構嗎,客戶端Docker client 是通過rest api進行通信历帚。docker cli 用來管理容器和鏡像滔岳,客戶端提供一個只讀鏡像,然后通過鏡像可以創(chuàng)建多個容器挽牢,這些容器可以只是一個RFS(Root file system根文件系統(tǒng))谱煤,也可以ishi一個包含了用戶應用的RFS,容器再docker client中只是要給進程禽拔,兩個進程之間互不可見刘离。用戶不能與server直接交互室叉,但可以通過與容器這個橋梁來交互,由于是操作系統(tǒng)級別的虛擬技術硫惕,中間的損耗幾乎可以不計茧痕。
三、docker架構2各個模塊的功能(帶完善)
主要的模塊有:Docker Client恼除、Docker Daemon踪旷、Docker Registry、Graph豁辉、Driver令野、libcontainer以及Docker container。
1徽级、docker client
docker client 是docker架構中用戶用來和docker daemon建立通信的客戶端气破,用戶使用的可執(zhí)行文件為docker,通過docker命令行工具可以發(fā)起眾多管理container的請求餐抢。docker client可以通過一下三宗方式和docker daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd现使。,docker client可以通過設置命令行flag參數的形式設置安全傳輸層協(xié)議(TLS)的有關參數旷痕,保證傳輸的安全性朴下。docker client發(fā)送容器管理請求后,由docker daemon接受并處理請求苦蒿,當docker client 接收到返回的請求相應并簡單處理后殴胧,docker client 一次完整的生命周期就結束了,當需要繼續(xù)發(fā)送容器管理請求時佩迟,用戶必須再次通過docker可以執(zhí)行文件創(chuàng)建docker client团滥。
2、docker daemon
docker daemon 是docker架構中一個常駐在后臺的系統(tǒng)進程报强,功能是:接收處理docker client發(fā)送的請求灸姊。該守護進程在后臺啟動一個server,server負載接受docker client發(fā)送的請求秉溉;接受請求后力惯,server通過路由與分發(fā)調度,找到相應的handler來執(zhí)行請求召嘶。docker daemon啟動所使用的可執(zhí)行文件也為docker父晶,與docker client啟動所使用的可執(zhí)行文件docker相同,在docker命令執(zhí)行時弄跌,通過傳入的參數來判別docker daemon與docker client甲喝。docker daemon的架構可以分為:docker server、engine铛只、job埠胖。daemon
3糠溜、docker server
docker server在docker架構中時專門服務于docker client的server,該server的功能時:接受并調度分發(fā)docker client發(fā)送的請求直撤,架構圖如下:在Docker的啟動過程中非竿,通過包gorilla/mux(golang的類庫解析),創(chuàng)建了一個mux.Router谋竖,提供請求的路由功能红柱。在Golang中,gorilla/mux是一個強大的URL路由器以及調度分發(fā)器圈盔。該mux.Router中添加了眾多的路由項匪蝙,每一個路由項由HTTP請求方法(PUT霉撵、POST幔亥、GET或DELETE)粒褒、URL形纺、Handler三部分組成肃廓。若Docker Client通過HTTP的形式訪問Docker Daemon般妙,創(chuàng)建完mux.Router之后阻逮,Docker將Server的監(jiān)聽地址以及mux.Router作為參數容诬,創(chuàng)建一個httpSrv=http.Server{}娩梨,最終執(zhí)行httpSrv.Serve()為請求服務。在Server的服務過程中览徒,Server在listener上接受Docker Client的訪問請求狈定,并創(chuàng)建一個全新的goroutine來服務該請求。在goroutine中习蓬,首先讀取請求內容纽什,然后做解析工作,接著找到相應的路由項躲叼,隨后調用相應的Handler來處理該請求芦缰,最后Handler處理完請求之后回復該請求。需要注意的是:Docker Server的運行在Docker的啟動過程中枫慷,是靠一個名為”serveapi”的job的運行來完成的让蕾。原則上,Docker Server的運行是眾多job中的一個或听,但是為了強調Docker Server的重要性以及為后續(xù)job服務的重要特性探孝,將該”serveapi”的job單獨抽離出來分析,理解為Docker Server誉裆。
4再姑、engine
Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊找御。它扮演Docker container存儲倉庫的角色元镀,并且通過執(zhí)行job的方式來操縱管理這些容器绍填。在Engine數據結構的設計與實現過程中,有一個handler對象栖疑。該handler對象存儲的都是關于眾多特定job的handler處理訪問讨永。舉例說明,Engine的handler對象中有一項為:{“create”: daemon.ContainerCreate,}遇革,則說明當名為”create”的job在運行時卿闹,執(zhí)行的是daemon.ContainerCreate的handler。
5萝快、job
一個Job可以認為是Docker架構中Engine內部最基本的工作執(zhí)行單元锻霎。Docker可以做的每一項工作,都可以抽象為一個job揪漩。例如:在容器內部運行一個進程旋恼,這是一個job;創(chuàng)建一個新的容器奄容,這是一個job冰更,從Internet上下載一個文檔,這是一個job昂勒;包括之前在Docker Server部分說過的蜀细,創(chuàng)建Server服務于HTTP的API,這也是一個job戈盈,等等奠衔。Job的設計者,把Job設計得與Unix進程相仿塘娶。比如說:Job有一個名稱涣觉,有參數,有環(huán)境變量血柳,有標準的輸入輸出官册,有錯誤處理,有返回狀態(tài)等难捌。
6膝宁、docker registry
Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被創(chuàng)建時根吁,被加載用來初始化容器的文件架構與目錄员淫。在Docker的運行過程中,Docker Daemon會與Docker Registry通信击敌,并實現搜索鏡像介返、下載鏡像、上傳鏡像三個功能,這三個功能對應的job名稱分別為”search”圣蝎,”pull” 與 “push”刃宵。其中,在Docker架構中徘公,Docker可以使用公有的Docker Registry牲证,即大家熟知的Docker Hub,如此一來关面,Docker獲取容器鏡像文件時坦袍,必須通過互聯(lián)網訪問Docker Hub;同時Docker也允許用戶構建本地私有的Docker Registry等太,這樣可以保證容器鏡像的獲取在內網完成捂齐。
7、Graph
Graph在Docker架構中扮演已下載容器鏡像的保管者缩抡,以及已下載容器鏡像之間關系的記錄者奠宜。一方面,Graph存儲著本地具有版本信息的文件系統(tǒng)鏡像缝其,另一方面也通過GraphDB記錄著所有文件系統(tǒng)鏡像彼此之間的關系挎塌。Graph的架構如下:其中徘六,GraphDB是一個構建在SQLite之上的小型圖數據庫内边,實現了節(jié)點的命名以及節(jié)點之間關聯(lián)關系的記錄。它僅僅實現了大多數圖數據庫所擁有的一個小的子集待锈,但是提供了簡單的接口表示節(jié)點之間的關系漠其。同時在Graph的本地目錄中,關于每一個的容器鏡像竿音,具體存儲的信息有:該容器鏡像的元數據和屎,容器鏡像的大小信息,以及該容器鏡像所代表的具體rootfs春瞬。8柴信、driverDriver是Docker架構中的驅動模塊。通過Driver驅動宽气,Docker可以實現對Docker容器執(zhí)行環(huán)境的定制随常。由于Docker運行的生命周期中,并非用戶所有的操作都是針對Docker容器的管理萄涯,另外還有關于Docker運行信息的獲取绪氛,Graph的存儲與記錄等。因此涝影,為了將Docker容器的管理從Docker Daemon內部業(yè)務邏輯中區(qū)分開來枣察,設計了Driver層驅動來接管所有這部分請求。在Docker Driver的實現中,可以分為以下三類驅動:graphdriver序目、networkdriver和execdriver臂痕。graphdriver主要用于完成容器鏡像的管理,包括存儲與獲取宛琅。即當用戶需要下載指定的容器鏡像時刻蟹,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶需要使用指定的容器鏡像來創(chuàng)建容器的rootfs時嘿辟,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像舆瘪。在graphdriver的初始化過程之前,有4種文件系統(tǒng)或類文件系統(tǒng)在其內部注冊红伦,它們分別是aufs英古、btrfs、vfs和devmapper昙读。而Docker在初始化之時召调,通過獲取系統(tǒng)環(huán)境變量”DOCKER_DRIVER”來提取所使用driver的指定類型。而之后所有的graph操作蛮浑,都使用該driver來執(zhí)行唠叛。graphdriver的架構如下:
9需曾、libcontainer
libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是希望該庫可以不依靠任何依賴,直接訪問內核中與容器相關的API呆万。正是由于libcontainer的存在商源,Docker可以直接調用libcontainer,而最終操縱容器的namespace谋减、cgroups牡彻、apparmor、網絡設備以及防火墻規(guī)則等出爹。這一系列操作的完成都不需要依賴LXC或者其他包庄吼。libcontainer架構如下:另外,libcontainer提供了一整套標準的接口來滿足上層對容器管理的需求严就∽苎埃或者說,libcontainer屏蔽了Docker上層對容器的直接管理梢为。又由于libcontainer使用Go這種跨平臺的語言開發(fā)實現渐行,且本身又可以被上層多種不同的編程語言訪問,因此很難說铸董,未來的Docker就一定會緊緊地和Linux捆綁在一起祟印。而于此同時,Microsoft在其著名云計算平臺Azure中粟害,也添加了對Docker的支持蕴忆,可見Docker的開放程度與業(yè)界的火熱度。暫不談Docker我磁,由于libcontainer的功能以及其本身與系統(tǒng)的松耦合特性孽文,很有可能會在其他以容器為原型的平臺出現驻襟,同時也很有可能催生出云計算領域全新的項目夺艰。
10、docker container
Docker container(Docker容器)是Docker架構中服務交付的最終體現形式沉衣。Docker按照用戶的需求與指令郁副,訂制相應的Docker容器:
用戶通過指定容器鏡像,使得Docker容器可以自定義rootfs等文件系統(tǒng)豌习;
用戶通過指定計算資源的配額存谎,使得Docker容器使用指定的計算資源;
用戶通過配置網絡及其安全策略肥隆,使得Docker容器擁有獨立且安全的網絡環(huán)境既荚;
用戶通過指定運行的命令,使得Docker容器執(zhí)行指定的工作栋艳。
四恰聘、docker簡單使用
推薦:Docker 核心概念、安裝、端口映射及常用操作命令晴叨,詳細到令人發(fā)指凿宾。
1、安裝
yum install docker -y systemctl enable dockersystemctl start docker
注意:啟動前應當設置源
vim /usr/lib/systemd/system/docker.service
這里設置阿里的兼蕊,注冊阿里云賬戶號每個用戶都有:
[root@web1 ~]# vim /usr/lib/systemd/system/docker.service [Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.targetWants=docker-storage-setup.serviceRequires=docker-cleanup.timer[Service]Type=notifyNotifyAccess=mainEnvironmentFile=-/run/containers/registries.confEnvironmentFile=-/etc/sysconfig/dockerEnvironmentFile=-/etc/sysconfig/docker-storageEnvironmentFile=-/etc/sysconfig/docker-networkEnvironment=GOTRACEBACK=crashEnvironment=DOCKER_HTTP_HOST_COMPAT=1Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbinExecStart=/usr/bin/dockerd-current --registry-mirror=https://rfcod7oz.mirror.aliyuncs.com \ #這個值可以登陸阿里云賬號請參考下圖 --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \ --default-runtime=docker-runc \ --exec-opt native.cgroupdriver=systemd \ --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \ --init-path=/usr/libexec/docker/docker-init-current \ --seccomp-profile=/etc/docker/seccomp.json \ $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ $BLOCK_REGISTRY \ $INSECURE_REGISTRY \ $REGISTRIESExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0Restart=on-abnormalKillMode=process[Install]WantedBy=multi-user.target
2初厚、docker版本查詢
[root@web1 ~]# docker versionClient: Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 Go version: go1.10.3 Git commit: b2f74b2/1.13.1 Built: Wed May 1 14:55:20 2019 OS/Arch: linux/amd64Server: Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-96.gitb2f74b2.el7.centos.x86_64 Go version: go1.10.3 Git commit: b2f74b2/1.13.1 Built: Wed May 1 14:55:20 2019 OS/Arch: linux/amd64 Experimental: false
3、搜索下載鏡像
docker pull alpine #下載鏡像docker search nginx #查看鏡像docker pull nginx
4孙技、查看已經下載的鏡像
[root@web1 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEzxg/my_nginx v1 b164f4c07c64 8 days ago 126 MBzxg/my_nginx latest f07837869dfc 8 days ago 126 MBdocker.io/nginx latest e445ab08b2be 2 weeks ago 126 MBdocker.io/alpine latest b7b28af77ffe 3 weeks ago 5.58 MBdocker.io/centos latest 9f38484d220f 4 months ago 202 MB[root@web1 ~]#
5产禾、導出鏡像
docker save nginx >/tmp/nginx.tar.gz
6、刪除鏡像
docker rmi -f nginx
7牵啦、導入鏡像
docker load </tmp/nginx.tar.gz
8下愈、默認配置文件
vim /usr/lib/systemd/system/docker.service
[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.comAfter=network.targetWants=docker-storage-setup.serviceRequires=docker-cleanup.timer[Service]Type=notifyNotifyAccess=mainEnvironmentFile=-/run/containers/registries.confEnvironmentFile=-/etc/sysconfig/dockerEnvironmentFile=-/etc/sysconfig/docker-storageEnvironmentFile=-/etc/sysconfig/docker-networkEnvironment=GOTRACEBACK=crashEnvironment=DOCKER_HTTP_HOST_COMPAT=1Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbinExecStart=/usr/bin/dockerd-current --registry-mirror=https://rfcod7oz.mirror.aliyuncs.com \ --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \ --default-runtime=docker-runc \ --exec-opt native.cgroupdriver=systemd \ --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \ --init-path=/usr/libexec/docker/docker-init-current \ --seccomp-profile=/etc/docker/seccomp.json \ $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ $BLOCK_REGISTRY \ $INSECURE_REGISTRY \ $REGISTRIESExecReload=/bin/kill -s HUP $MAINPIDLimitNOFILE=1048576LimitNPROC=1048576LimitCORE=infinityTimeoutStartSec=0Restart=on-abnormalKillMode=process[Install]WantedBy=multi-user.target~ ~ ~ ~
如果更改存儲目錄就添加
--graph=/opt/docker
如果更改DNS——默認采用宿主機的dns
--dns=xxxx的方式指定
9、運行hello world
這里用centos鏡像echo一個hello word
[root@web1 overlay2]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEzxg/my_nginx v1 b164f4c07c64 8 days ago 126 MBzxg/my_nginx latest f07837869dfc 8 days ago 126 MBdocker.io/nginx latest e445ab08b2be 2 weeks ago 126 MBdocker.io/alpine latest b7b28af77ffe 3 weeks ago 5.58 MBdocker.io/centos latest 9f38484d220f 4 months ago 202 MB[root@web1 overlay2]# docker run centos echo "hello world"hello world[root@web1 overlay2]#
10蕾久、運行一個容器-run
[root@web1 overlay2]# docker run -it alpine sh #運行并進入alpine / # / # / # / # / # / # lsbin etc lib mnt proc run srv tmp vardev home media opt root sbin sys usr/ # cd tmp/tmp # exit
后臺運行(-d后臺運行)(--name添加一個名字)
[root@web1 overlay2]# docker run -it -d --name test1 alpineac46c019b800d34c37d4f9dcd56c974cb82eca3acf185e5f8f80c8a60075e343[root@web1 overlay2]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESac46c019b800 alpine "/bin/sh" 5 seconds ago Up 3 seconds test1[root@web1 overlay2]#
還有一種-rm參數势似,ctrl+c后就刪除,可以測試環(huán)境用僧著,生成環(huán)境用的少
[root@web1 overlay2]# docker run -it --rm --name centos nginx ^C[root@web1 overlay2]# ##另開一個窗口[root@web1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3397b96ea7bd nginx "nginx -g 'daemon ..." 27 seconds ago Up 25 seconds 80/tcp centosac46c019b800 alpine "/bin/sh" 4 minutes ago Up 4 minutes test1[root@web1 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESac46c019b800 alpine "/bin/sh" 4 minutes ago Up 4 minutes test1[root@web1 ~]#
11履因、如何進入容器
三種方法,上面已經演示了一種第一種盹愚,需要容器本身的pid及util-linux栅迄,不推薦,暫時不演示了第二種皆怕,不分配bash終端的一種實施操作毅舆,不推薦,這種操作如果在開一個窗口也能看到操作的指令愈腾,所有人都能看到憋活。
[root@web1 overlay2]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9fc796e928d7 nginx "sh" 2 minutes ago Up 8 seconds 80/tcp mynginxac46c019b800 alpine "/bin/sh" 12 minutes ago Up 12 minutes test1[root@web1 overlay2]# docker attach mynginx# # # # # lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var# exit [root@web1 overlay2]# docker attach mynginxYou cannot attach to a stopped container, start it first[root@web1 overlay2]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESac46c019b800 alpine "/bin/sh" 13 minutes ago Up 13 minutes test1[root@web1 overlay2]#
第三種:exec方式,終端時分開的虱黄,推薦
[root@web1 overlay2]# docker exec -it mynginx sh# # # # ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var# exit[root@web1 overlay2]# [root@web1 overlay2]# [root@web1 overlay2]# [root@web1 overlay2]# docker padocker: 'pa' is not a docker command.See 'docker --help'[root@web1 overlay2]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6fc2d091cfe9 nginx "nginx -g 'daemon ..." 45 seconds ago Up 43 seconds 80/tcp mynginxac46c019b800 alpine "/bin/sh" 16 minutes ago Up 16 minutes test1
12悦即、查看docker進程及刪除容器
上面已經演示:
[root@web1 overlay2]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9fc796e928d7 nginx "sh" 2 minutes ago Up 8 seconds 80/tcp mynginxac46c019b800 alpine "/bin/sh" 12 minutes ago Up 12 minutes test1
[root@web1 overlay2]# docker ps -a #-a :顯示所有的容器,包括未運行的CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES9fc796e928d7 nginx "sh" 4 minutes ago Exited (0) About a minute ago mynginxac46c019b800 alpine "/bin/sh" 15 minutes ago Up 15 minutes test13bf234febeaa alpine "sh" 17 minutes ago Exited (0) 16 minutes ago youthful_lumiereab113c63f0b4 centos "echo 'hello world'" 31 minutes ago Exited (0) 31 minutes ago infallible_torvaldsb326027dcf42 zxg/my_nginx "nginx" 8 days ago Exited (0) 8 days ago my_nginx4f1f1ca319f2 centos "bash" 8 days ago Exited (137) 8 days ago musing_lichterman64b4e32991c7 nginx "nginx -g 'daemon ..." 12 days ago Exited (0) 12 days ago mynginx1aee506fe7b5a alpine "sh" 12 days ago Created infallible_haibt70620c73b9a0 alpine "sh" 12 days ago Created gallant_volhard7655cbf87bb0 alpine "sh" 12 days ago Created agitated_brahmagupta33fb949372e8 fce289e99eb9 "/hello" 12 days ago Created elastic_dijkstra9de47616aea4 fce289e99eb9 "/hello" 13 days ago Created confident_fermi[root@web1 overlay2]# docker rm 9fc796e928d7 #rm時刪除一個或多個容器 9fc796e928d7
13橱乱、查看容器詳細信息
并不需要進入到容器里面辜梳,通過查看詳細信息看到了剛才運行的nginx,宿主機curl ip地址訪問一下運行情況泳叠。
[root@web1 overlay2]# docker inspect mynginx[ { "Id": "6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010", "Created": "2019-08-07T08:57:48.864538933Z", "Path": "nginx", "Args": [ "-g", "daemon off;" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 119948, "ExitCode": 0, "Error": "", "StartedAt": "2019-08-07T08:57:49.417992182Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:e445ab08b2be8b178655b714f89e5db9504f67defd5c7408a00bade679a50d44", "ResolvConfPath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/resolv.conf", "HostnamePath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hostname", "HostsPath": "/var/lib/docker/containers/6fc2d091cfe9b0484da3e70db842446bbdfeb7f5e5409c2e40ae21b99498d010/hosts", "LogPath": "", "Name": "/mynginx", "RestartCount": 0, "Driver": "overlay2", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "journald", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "docker-runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": null, "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DiskQuota": 0, "KernelMemory": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": -1, "OomKillDisable": false, "PidsLimit": 0, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0 }, "GraphDriver": { "Name": "overlay2", "Data": { "LowerDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a-init/diff:/var/lib/docker/overlay2/d8e95505fc3894eb30b48e4b0f48ab5e89d99c09a07c79c0b057c611621e31eb/diff:/var/lib/docker/overlay2/b2a6a25974bf17398b698a27208711574be3c69a2cd06658bbe838359f373a27/diff:/var/lib/docker/overlay2/d4610bc89b3ba8ad6ab30ea895fc3a06efff15db493d86ac9bc100e04abbab67/diff", "MergedDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/merged", "UpperDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/diff", "WorkDir": "/var/lib/docker/overlay2/937140af0aee6c43f04c2d7b72e6b5451a44fef921417e8236d9fe01e9286c7a/work" } }, "Mounts": [], "Config": { "Hostname": "6fc2d091cfe9", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": true, "OpenStdin": true, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.17.2", "NJS_VERSION=0.3.3", "PKG_RELEASE=1~buster" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "ArgsEscaped": true, "Image": "nginx", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGTERM" }, "NetworkSettings": { "Bridge": "", "SandboxID": "3ece36008fbc5f3f46d3d251cf803c1478cc14032d74a36747e4ed8a115b81df", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": null }, "SandboxKey": "/var/run/docker/netns/3ece36008fbc", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", #看到ip地址 "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "2edae9131e77500a56d251b94ab2cdf0bc86f8df9f2453fa46bf4bab2f7be99f", "EndpointID": "898de81d97d54d2b60aeb6cc77ef1b4f9b481d1b72f542faa496494594024eac", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03" } } } }][root@web1 overlay2]# curl 172.17.0.1 #訪問一下<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Test Page for the Nginx HTTP Server on Fedora</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style type="text/css"> /*<![CDATA[*/ body { background-color: #fff; color: #000; font-size: 0.9em; font-family: sans-serif,helvetica; margin: 0; padding: 0; } :link { color: #c00; } :visited { color: #c00; } a:hover { color: #f50; } h1 { text-align: center; margin: 0; padding: 0.6em 2em 0.4em; background-color: #294172; color: #fff; font-weight: normal; font-size: 1.75em; border-bottom: 2px solid #000; } h1 strong { font-weight: bold; font-size: 1.5em; } h2 { text-align: center; background-color: #3C6EB4; font-size: 1.1em; font-weight: bold; color: #fff; margin: 0; padding: 0.5em; border-bottom: 2px solid #294172; } hr { display: none; } .content { padding: 1em 5em; } .alert { border: 2px solid #000; } img { border: 2px solid #fff; padding: 2px; margin: 2px; } a:hover img { border: 2px solid #294172; } .logos { margin: 1em; text-align: center; } /*]]>*/ </style> </head> <body> <h1>Welcome to <strong>nginx</strong> on Fedora!</h1> <div class="content"> <p>This page is used to test the proper operation of the <strong>nginx</strong> HTTP server after it has been installed. If you can read this page, it means that the web server installed at this site is working properly.</p> <div class="alert"> <h2>Website Administrator</h2> <div class="content"> <p>This is the default <tt>index.html</tt> page that is distributed with <strong>nginx</strong> on Fedora. It is located in <tt>/usr/share/nginx/html</tt>.</p> <p>You should now put your content in a location of your choice and edit the <tt>root</tt> configuration directive in the <strong>nginx</strong> configuration file <tt>/etc/nginx/nginx.conf</tt>.</p> </div> </div> <div class="logos"> <a ><img src="nginx-logo.png" alt="[ Powered by nginx ]" width="121" height="32" /></a> <a ><img src="poweredby.png" alt="[ Powered by Fedora ]" width="88" height="31" /></a> </div> </div> </body></html>[root@web1 overlay2]#
14作瞄、查看日志
-f 掛起這個終端,動態(tài)查看日志
[root@web1 ~]# docker logs -f mynginx
參考文章:https://cloud.tencent.com/developer/article/1006116 https://yq.aliyun.com/articles/65145https://blog.51cto.com/10085711/2068290https://www.cnblogs.com/zuxing/articles/8717415.html