太全了|萬字詳解Docker架構原理、功能及使用(送書)

1、簡介

一、瞭解Docker的前生LXC


LXC爲Linux Container的簡寫。能夠提供輕量級的虛擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性。至關於C++中的NameSpace。容器有效地將由單個操做系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。
與傳統虛擬化技術相比,它的優點在於:
(1)與宿主機使用同一個內核,性能損耗小;
(2)不須要指令級模擬;
(3)不須要即時(Just-in-time)編譯;
(4)容器能夠在CPU核心的本地運行指令,不須要任何專門的解釋機制;
(5)避免了準虛擬化和系統調用替換中的複雜性;
(6)輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。
總結:Linux Container是一種輕量級的虛擬化的手段。

Linux Container提供了在單一可控主機節點上支持多個相互隔離的server container同時執行的機制。Linux Container有點像chroot,提供了一個擁有本身進程和網絡空間的虛擬環境,但又有別於虛擬機,由於lxc是一種操做系統層次上的資源的虛擬化。

二、LXC與docker什麼關係?


docker並非LXC替代品,docker底層使用了LXC來實現,LXC將linux進程沙盒化,使得進程之間相互隔離,而且可以課哦內閣制各進程的資源分配。
在LXC的基礎之上,docker提供了一系列更強大的功能。

三、什麼是docker


docker是一個開源的應用容器引擎,基於go語言開發並遵循了apache2.0協議開源。
docker可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的linux服務器,也能夠實現虛擬化。
容器是徹底使用沙箱機制,相互之間不會有任何接口(類iphone的app),而且容器開銷極其低。

四、docker官方文檔

https://docs.docker.com/

五、爲何docker愈來愈受歡迎


官方話語:

  • 容器化愈來愈受歡迎,由於容器是:css

  • 靈活:即便是最複雜的應用也能夠集裝箱化。html

  • 輕量級:容器利用並共享主機內核。linux

  • 可互換:您能夠即時部署更新和升級。nginx

  • 便攜式:您能夠在本地構建,部署到雲,並在任何地方運行。git

  • 可擴展:您能夠增長並自動分發容器副本。github

  • 可堆疊:您能夠垂直和即時堆疊服務。golang

  • 鏡像和容器(contalners)


經過鏡像啓動一個容器,一個鏡像是一個可執行的包,其中包括運行應用程序所須要的全部內容包含代碼,運行時間,庫、環境變量、和配置文件。
容器是鏡像的運行實例,當被運行時有鏡像狀態和用戶進程,可使用docker ps 查看。

  • 容器和虛擬機


容器時在linux上本機運行,並與其餘容器共享主機的內核,它運行的一個獨立的進程,不佔用其餘任何可執行文件的內存,很是輕量。

虛擬機運行的是一個完成的操做系統,經過虛擬機管理程序對主機資源進行虛擬訪問,相比之下須要的資源更多。

六、docker版本


Docker Community Edition(CE)社區版
Enterprise Edition(EE) 商業版

七、docker和openstack的幾項對比


八、容器在內核中支持2種重要技術


docker本質就是宿主機的一個進程,docker是經過namespace實現資源隔離,經過cgroup實現資源限制,經過寫時複製技術(copy-on-write)實現了高效的文件操做(相似虛擬機的磁盤好比分配500g並非實際佔用物理磁盤500g)

1)namespaces 名稱空間
2)control Group 控制組

cgroup的特色是: 
      
  • cgroup的api以一個僞文件系統的實現方式,用戶的程序能夠經過文件系統實現cgroup的組件管理web

  • cgroup的組件管理操做單元能夠細粒度到線程級別,另外用戶能夠建立和銷燬cgroup,從而實現資源載分配和再利用算法

  • 全部資源管理的功能都以子系統的方式實現,接口統一子任務建立之初與其父任務處於同一個cgroup的控制組docker


四大功能:

  • 資源限制:能夠對任務使用的資源總額進行限制

  • 優先級分配:經過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上至關於控制了任務運行優先級

  • 資源統計:能夠統計系統的資源使用量,如cpu時長,內存用量等

  • 任務控制:cgroup能夠對任務執行掛起、恢復等操做

九、瞭解docker三個重要概念


1)image鏡像

docker鏡像就是一個只讀模板,好比,一個鏡像能夠包含一個完整的centos,裏面僅安裝apache或用戶的其餘應用,鏡像能夠用來建立docker容器,另外docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下週一個已經作好的鏡像來直接使用

2)container容器

docker利用容器來運行應用,容器是從鏡像建立的運行實例,它能夠被啓動,開始、中止、刪除、每一個容器都是互相隔離的,保證安全的平臺,能夠吧容器看作是要給簡易版的linux環境(包括root用戶權限、鏡像空間、用戶空間和網絡空間等)和運行再其中的應用程序
3)repostory倉庫

倉庫是集中存儲鏡像文件的滄桑,registry是倉庫主從服務器,實際上參考註冊服務器上存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)

倉庫分爲兩種,公有參考,和私有倉庫,最大的公開倉庫是docker Hub,存放了數量龐大的鏡像供用戶下週,國內的docker pool,這裏倉庫的概念與Git相似,registry能夠理解爲github這樣的託管服務

十、docker的主要用途


官方就是Bulid 、ship、run any app/any where,編譯、裝載、運行、任何app/在任意地放都能運行。
就是實現了應用的封裝、部署、運行的生命週期管理只要在glibc的環境下,均可以運行。
運維生成環境中:docker化。
  • 發佈服務不用擔憂服務器的運行環境,全部的服務器都是自動分配docker,自動部署,自動安裝,自動運行

  • 再不用擔憂其餘服務引擎的磁盤問題,cpu問題,系統問題了

  • 資源利用更出色

  • 自動遷移,能夠製做鏡像,遷移使用自定義的鏡像便可遷移,不會出現什麼問題

  • 管理更加方便了

十一、docker改變了什麼


  • 面向產品:產品交付

  • 面向開發:簡化環境配置

  • 面向測試:多版本測試

  • 面向運維:環境一致性

  • 面向架構:自動化擴容(微服務)

2、docker架構

一、整體架構


  • distribution 負責與docker registry交互,上傳洗澡鏡像以及v2 registry 有關的源數據

  • registry負責docker registry有關的身份認證、鏡像查找、鏡像驗證以及管理registry mirror等交互操做

  • image 負責與鏡像源數據有關的存儲、查找,鏡像層的索引、查找以及鏡像tar包有關的導入、導出操做

  • reference負責存儲本地全部鏡像的repository和tag名,並維護與鏡像id之間的映射關係

  • layer模塊負責與鏡像層和容器層源數據有關的增刪改查,並負責將鏡像層的增刪改查映射到實際存儲鏡像層文件的graphdriver模塊

  • graghdriver是全部與容器鏡像相關操做的執行者

二、docker架構2


若是以爲上面架構圖比較亂能夠看這個架構:

從上圖不難看出,用戶是使用Docker Client與Docker Daemon創建通訊,併發送請求給後者。
而Docker Daemon做爲Docker架構中的主體部分,首先提供Server的功能使其能夠接受Docker Client的請求;然後Engine執行Docker內部的一系列工做,每一項工做都是以一個Job的形式的存在。
Job的運行過程當中,當須要容器鏡像時,則從Docker Registry中下載鏡像,並經過鏡像管理驅動graphdriver將下載鏡像以Graph的形式存儲;當須要爲Docker建立網絡環境時,經過網絡管理驅動networkdriver建立並配置Docker容器網絡環境;當須要限制Docker容器運行資源或執行用戶指令等操做時,則經過execdriver來完成。
而libcontainer是一項獨立的容器管理包,networkdriver以及execdriver都是經過libcontainer來實現具體對容器進行的操做。當執行完運行容器的命令後,一個實際的Docker容器就處於運行狀態,該容器擁有獨立的文件系統,獨立而且安全的運行環境等。

三、docker架構3


再來看看另一個架構,這個個架構就簡單清晰指明瞭server/client交互,容器和鏡像、數據之間的一些聯繫。

這個架構圖更加清晰了架構

docker daemon就是docker的守護進程即server端,能夠是遠程的,也能夠是本地的,這個不是C/S架構嗎,客戶端Docker client 是經過rest api進行通訊。

docker cli 用來管理容器和鏡像,客戶端提供一個只讀鏡像,而後經過鏡像能夠建立多個容器,這些容器能夠只是一個RFS(Root file system根文件系統),也能夠ishi一個包含了用戶應用的RFS,容器再docker client中只是要給進程,兩個進程之間互不可見。

用戶不能與server直接交互,但能夠經過與容器這個橋樑來交互,因爲是操做系統級別的虛擬技術,中間的損耗幾乎能夠不計。

3、docker架構2各個模塊的功能(帶完善)


主要的模塊有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。   

一、docker client


docker client 是docker架構中用戶用來和docker daemon創建通訊的客戶端,用戶使用的可執行文件爲docker,經過docker命令行工具能夠發起衆多管理container的請求。

docker client能夠經過一下三宗方式和docker daemon創建通訊:tcp://host:port;unix:path_to_socket;fd://socketfd。,docker client能夠經過設置命令行flag參數的形式設置安全傳輸層協議(TLS)的有關參數,保證傳輸的安全性

docker client發送容器管理請求後,由docker daemon接受並處理請求,當docker client 接收到返回的請求相應並簡單處理後,docker client 一次完整的生命週期就結束了,當須要繼續發送容器管理請求時,用戶必須再次經過docker能夠執行文件建立docker client。

二、docker daemon


docker daemon 是docker架構中一個常駐在後臺的系統進程,功能是:接收處理docker client發送的請求。該守護進程在後臺啓動一個server,server負載接受docker client發送的請求;接受請求後,server經過路由與分發調度,找到相應的handler來執行請求。

docker daemon啓動所使用的可執行文件也爲docker,與docker client啓動所使用的可執行文件docker相同,在docker命令執行時,經過傳入的參數來判別docker daemon與docker client。

docker daemon的架構能夠分爲:docker server、engine、job。daemon

三、docker server


docker server在docker架構中時專門服務於docker client的server,該server的功能時:接受並調度分發docker client發送的請求,架構圖以下:
    

在Docker的啓動過程當中,經過包gorilla/mux(golang的類庫解析),建立了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及調度分發器。該mux.Router中添加了衆多的路由項,每個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、Handler三部分組成。

若Docker Client經過HTTP的形式訪問Docker Daemon,建立完mux.Router以後,Docker將Server的監聽地址以及mux.Router做爲參數,建立一個httpSrv=http.Server{},最終執行httpSrv.Serve()爲請求服務。

在Server的服務過程當中,Server在listener上接受Docker Client的訪問請求,並建立一個全新的goroutine來服務該請求。在goroutine中,首先讀取請求內容,而後作解析工做,接着找到相應的路由項,隨後調用相應的Handler來處理該請求,最後Handler處理完請求以後回覆該請求。

須要注意的是:Docker Server的運行在Docker的啓動過程當中,是靠一個名爲」serveapi」的job的運行來完成的。原則上,Docker Server的運行是衆多job中的一個,可是爲了強調Docker Server的重要性以及爲後續job服務的重要特性,將該」serveapi」的job單獨抽離出來分析,理解爲Docker Server。

四、engine


Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,而且經過執行job的方式來操縱管理這些容器。

在Engine數據結構的設計與實現過程當中,有一個handler對象。該handler對象存儲的都是關於衆多特定job的handler處理訪問。舉例說明,Engine的handler對象中有一項爲:{「create」: daemon.ContainerCreate,},則說明當名爲」create」的job在運行時,執行的是daemon.ContainerCreate的handler。

五、job


一個Job能夠認爲是Docker架構中Engine內部最基本的工做執行單元。Docker能夠作的每一項工做,均可以抽象爲一個job。例如:在容器內部運行一個進程,這是一個job;建立一個新的容器,這是一個job,從Internet上下載一個文檔,這是一個job;包括以前在Docker Server部分說過的,建立Server服務於HTTP的API,這也是一個job,等等。

Job的設計者,把Job設計得與Unix進程相仿。好比說:Job有一個名稱,有參數,有環境變量,有標準的輸入輸出,有錯誤處理,有返回狀態等。

六、docker registry


Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被建立時,被加載用來初始化容器的文件架構與目錄。

在Docker的運行過程當中,Docker Daemon會與Docker Registry通訊,並實現搜索鏡像、下載鏡像、上傳鏡像三個功能,這三個功能對應的job名稱分別爲」search」,」pull」 與 「push」。

其中,在Docker架構中,Docker可使用公有的Docker Registry,即你們熟知的Docker Hub,如此一來,Docker獲取容器鏡像文件時,必須經過互聯網訪問Docker Hub;同時Docker也容許用戶構建本地私有的Docker Registry,這樣能夠保證容器鏡像的獲取在內網完成。

七、Graph


Graph在Docker架構中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關係的記錄者。一方面,Graph存儲着本地具備版本信息的文件系統鏡像,另外一方面也經過GraphDB記錄着全部文件系統鏡像彼此之間的關係。

Graph的架構以下:

其中,GraphDB是一個構建在SQLite之上的小型圖數據庫,實現了節點的命名以及節點之間關聯關係的記錄。它僅僅實現了大多數圖數據庫所擁有的一個小的子集,可是提供了簡單的接口表示節點之間的關係。

同時在Graph的本地目錄中,關於每個的容器鏡像,具體存儲的信息有:該容器鏡像的元數據,容器鏡像的大小信息,以及該容器鏡像所表明的具體rootfs。
八、driver

Driver是Docker架構中的驅動模塊。經過Driver驅動,Docker能夠實現對Docker容器執行環境的定製。因爲Docker運行的生命週期中,並不是用戶全部的操做都是針對Docker容器的管理,另外還有關於Docker運行信息的獲取,Graph的存儲與記錄等。所以,爲了將Docker容器的管理從Docker Daemon內部業務邏輯中區分開來,設計了Driver層驅動來接管全部這部分請求。

在Docker Driver的實現中,能夠分爲如下三類驅動:graphdriver、networkdriver和execdriver。

graphdriver主要用於完成容器鏡像的管理,包括存儲與獲取。即當用戶須要下載指定的容器鏡像時,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶須要使用指定的容器鏡像來建立容器的rootfs時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像。

在graphdriver的初始化過程以前,有4種文件系統或類文件系統在其內部註冊,它們分別是aufs、btrfs、vfs和devmapper。而Docker在初始化之時,經過獲取系統環境變量」DOCKER_DRIVER」來提取所使用driver的指定類型。而以後全部的graph操做,都使用該driver來執行。

graphdriver的架構以下:
networkdriver的用途是完成Docker容器網絡環境的配置,其中包括Docker啓動時爲Docker環境建立網橋;Docker容器建立時爲其建立專屬虛擬網卡設備;以及爲Docker容器分配IP、端口並與宿主機作端口映射,設置容器防火牆策略等。networkdriver的架構以下:
execdriver做爲Docker容器的執行驅動,負責建立容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等。在execdriver的實現過程當中,原先可使用LXC驅動調用LXC的接口,來操縱容器的配置以及生命週期,而如今execdriver默認使用native驅動,不依賴於LXC。具體體如今Daemon啓動過程當中加載的ExecDriverflag參數,該參數在配置文件已經被設爲」native」。這能夠認爲是Docker在1.2版本上一個很大的改變,或者說Docker實現跨平臺的一個先兆。execdriver架構以下:

九、libcontainer


libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是但願該庫能夠不依靠任何依賴,直接訪問內核中與容器相關的API。

正是因爲libcontainer的存在,Docker能夠直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火牆規則等。這一系列操做的完成都不須要依賴LXC或者其餘包。libcontainer架構以下:
另外,libcontainer提供了一整套標準的接口來知足上層對容器管理的需求。或者說,libcontainer屏蔽了Docker上層對容器的直接管理。又因爲libcontainer使用Go這種跨平臺的語言開發實現,且自己又能夠被上層多種不一樣的編程語言訪問,所以很難說,將來的Docker就必定會牢牢地和Linux捆綁在一塊兒。而於此同時,Microsoft在其著名雲計算平臺Azure中,也添加了對Docker的支持,可見Docker的開放程度與業界的火熱度。

暫不談Docker,因爲libcontainer的功能以及其自己與系統的鬆耦合特性,頗有可能會在其餘以容器爲原型的平臺出現,同時也頗有可能催生出雲計算領域全新的項目。

十、docker container


Docker container(Docker容器)是Docker架構中服務交付的最終體現形式。

Docker按照用戶的需求與指令,訂製相應的Docker容器:

  • 用戶經過指定容器鏡像,使得Docker容器能夠自定義rootfs等文件系統;

  • 用戶經過指定計算資源的配額,使得Docker容器使用指定的計算資源;

  • 用戶經過配置網絡及其安全策略,使得Docker容器擁有獨立且安全的網絡環境;

  • 用戶經過指定運行的命令,使得Docker容器執行指定的工做。

   

4、docker簡單使用


一、安裝

yum install docker -y 
systemctl enable docker
systemctl start docker複製代碼
注意:啓動前應當設置源
vim /usr/lib/systemd/system/docker.service複製代碼
這裏設置阿里的,註冊阿里雲帳戶號每一個用戶都有:
[root@web1 ~]# vim /usr/lib/systemd/system/docker.service

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target
Wants=docker-storage-setup.service
Requires=docker-cleanup.timer

[Service]
Type=notify
NotifyAccess=main
EnvironmentFile=-/run/containers/registries.conf
EnvironmentFile=-/etc/sysconfig/docker
EnvironmentFile=-/etc/sysconfig/docker-storage
EnvironmentFile=-/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=DOCKER_HTTP_HOST_COMPAT=1
Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin
ExecStart=/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 \
$REGISTRIES
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
TimeoutStartSec=0
Restart=on-abnormal
KillMode=process

[Install]
WantedBy=multi-user.target
複製代碼
  
 
二、docker版本查詢
[root@web1 ~]# docker version
Client:
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/amd64

Server:
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複製代碼
複製代碼
三、搜索下載鏡像
docker pull alpine    #下載鏡像
docker search nginx   #查看鏡像
docker pull nginx複製代碼

四、查看已經下載的鏡像

[root@web1 ~]# docker images
REPOSITORY         TAG      IMAGE  ID     CREATED      SIZE
zxg/my_nginx      v1       b164f4c07c64  8 days ago    126 MB
zxg/my_nginx      latest   f07837869dfc  8 days ago    126 MB
docker.io/nginx   latest   e445ab08b2be  2 weeks ago   126 MB
docker.io/alpine  latest   b7b28af77ffe  3 weeks ago   5.58 MB
docker.io/centos  latest   9f38484d220f  4 months ago  202 MB
複製代碼

五、導出鏡像

docker  save nginx >/tmp/nginx.tar.gz複製代碼

六、刪除鏡像

docker rmi -f nginx複製代碼

七、導入鏡像

docker load </tmp/nginx.tar.gz複製代碼

八、默認配置文件


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的方式指定複製代碼

九、運行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 02 MB[root@web1 overlay2]# docker run centos echo "hello world"hello world
複製代碼

十、運行一個容器-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
複製代碼
還有一種-rm參數,ctrl+c後就刪除,能夠測試環境用,生成環境用的少
[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
複製代碼

十一、如何進入容器


三種方法,上面已經演示了一種
第一種,須要容器自己的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 psCONTAINER 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# lsbin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var# exit[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複製代碼
複製代碼

十二、查看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
複製代碼

1三、查看容器詳細信息


並不須要進入到容器裏面,經過查看詳細信息看到了剛纔運行的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 href="http://nginx.net/"><img
src="nginx-logo.png"
alt="[ Powered by nginx ]"
width="121" height="32" /></a>

<a href="http://fedoraproject.org/"><img
src="poweredby.png"
alt="[ Powered by Fedora ]"
width="88" height="31" /></a>
</div>
</div>
</body>
</html>複製代碼

1四、查看日誌


-f 掛起這個終端,動態查看日誌
[root@web1 ~]# docker logs -f mynginx複製代碼
出處:https://www.cnblogs.com/zhangxingeng/p/11236968.html

看完了這些詳解以後若是還以爲沒有真正瞭解的話,我再送大家一個祕笈:【史上最全、最詳細的Docker學習資料】,民工哥再給你們送上一份福利。

福利時間
此次「 民工哥技術之路」聯合「 機械工業出版社華章公司」給你們帶來《Docker技術入門與實戰》第3版(我讀的時候是第2版)。

Docker技術入門與實戰(第3版)》

做者:楊保華,戴王劍,曹亞侖 著

適讀人羣:1.雲計算開發人員。2.網絡應用開發與管理人員。入門Docker的首本書,經典暢銷書升級,系統化掌握容器技術棧,第3版基於 Docker 新 18.x 系列版本。

做者簡介:楊保華,博士,現爲甲骨文架構師。研究方向包括分佈式系統、大數據和算法設計等,是容器、網絡虛擬化、區塊鏈等技術的早期研究者和佈道者。他倡導技術創新與產品、市場相結合,曾負責多個大型平臺的架構和設計,以及企業系統的實現和實施。他熱愛開源文化,曾積極貢獻了多個開源項目。

送書規則 :

一、僅限本公衆號讀者參與,截止時間2019年8月21號12:30.

二、留言分享你對於Docker的理解或本身的獨特看法,也可分享你學習Docker容器技術的方法、踩過的坑、解決過的難題等相關的(字數20-100字)。

三、精選留言點贊前4名的讀者各送一本,短期內贊數爆增或其它做弊行爲均視爲無效,同時也會進入黑名單永久取消獲贈書資格。

四、精選留言隨機抽取3名幸運讀者各送一本,留言最走心,最用心等都是增長抽取機率的關鍵因素。

五、活動截止後,請中獎者於一個工做日內主動聯繫民工哥發送詳細收貨地址,逾期則視爲自動放棄,資格轉移至其它讀者。

相關文章
相關標籤/搜索