提示:文中有些内容為大神的部落格内容,就不統一标注那裡引用,隻是再最下面标注參考連接配接謝謝
一、簡介
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是一種作業系統層次上的資源的虛拟化。
2、LXC與docker什麼關系?
docker并不是LXC替代品,docker底層使用了LXC來實作,LXC将linux程序沙盒化,使得程序之間互相隔離,并且能夠控制各程序的資源配置設定。
在LXC的基礎之上,docker提供了一系列更強大的功能。
3、什麼是docker
docker是一個開源的應用容器引擎,基于go語言開發并遵循了apache2.0協定開源。
docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的linux伺服器,也可以實作虛拟化。
容器是完全使用沙箱機制,互相之間不會有任何接口(類iphone的app),并且容器開銷極其低。
4、docker官方文檔
https://docs.docker.com/
5、為什麼docker越來越受歡迎
官方話語:
容器化越來越受歡迎,因為容器是:
-
-
- 靈活:即使是最複雜的應用也可以集裝箱化。
- 輕量級:容器利用并共享主機核心。
- 可互換:您可以即時部署更新和更新。
- 便攜式:您可以在本地建構,部署到雲,并在任何地方運作。
- 可擴充:您可以增加并自動分發容器副本。
- 可堆疊:您可以垂直和即時堆疊服務。
-
鏡像和容器(contalners)
通過鏡像啟動一個容器,一個鏡像是一個可執行的包,其中包括運作應用程式所需要的所有内容包含代碼,運作時間,庫、環境變量、和配置檔案。
容器是鏡像的運作執行個體,當被運作時有鏡像狀态和使用者程序,可以使用docker ps 檢視
容器和虛拟機
容器時在linux上本機運作,并與其他容器共享主機的核心,它運作的一個獨立的程序,不占用其他任何可執行檔案的記憶體,非常輕量
虛拟機運作的是一個完成的作業系統,通過虛拟機管理程式對主機資源進行虛拟通路,相比之下需要的資源更多
6、docker版本
Docker Community Edition(CE)社群版
Enterprise Edition(EE) 商業版
7、docker和openstack的幾項對比
8、容器在核心中支援2種重要技術
docker本質就是主控端的一個程序,docker是通過namespace實作資源隔離,通過cgroup實作資源限制,通過寫時複制技術(copy-on-write)實作了高效的檔案操作(類似虛拟機的磁盤比如配置設定500g并不是實際占用實體磁盤500g)
1)namespaces 名稱空間
2)control Group 控制組
cgroup的特點是:
cgroup的api以一個僞檔案系統的實作方式,使用者的程式可以通過檔案系統實作cgroup的元件管理
cgroup的元件管理操作單元可以細粒度到線程級别,另外使用者可以建立和銷毀cgroup,進而實作資源載配置設定和再利用
所有資源管理的功能都以子系統的方式實作,接口統一子任務建立之初與其父任務處于同一個cgroup的控制組
四大功能:
資源限制:可以對任務使用的資源總額進行限制
優先級配置設定:通過配置設定的cpu時間片數量以及磁盤IO帶寬大小,實際上相當于控制了任務運作優先級
資源統計:可以統計系統的資源使用量,如cpu時長,記憶體用量等
任務控制:cgroup可以對任務執行挂起、恢複等操作
9、了解docker三個重要概念
1)image鏡像
docker鏡像就是一個隻讀模闆,比如,一個鏡像可以包含一個完整的centos,裡面僅安裝apache或使用者的其他應用,鏡像可以用來建立docker容器,另外docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,使用者甚至可以直接從其他人那裡下周一個已經做好的鏡像來直接使用
2)container容器
docker利用容器來運作應用,容器是從鏡像建立的運作執行個體,它可以被啟動,開始、停止、删除、每個容器都是互相隔離的,保證安全的平台,可以吧容器看做是要給簡易版的linux環境(包括root使用者權限、鏡像空間、使用者空間和網絡空間等)和運作再其中的應用程式
3)repostory倉庫
倉庫是集中存儲鏡像檔案的滄桑,registry是倉庫主從伺服器,實際上參考注冊伺服器上存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的标簽(tag)
倉庫分為兩種,公有參考,和私有倉庫,最大的公開倉庫是docker Hub,存放了數量龐大的鏡像供使用者下周,國内的docker pool,這裡倉庫的概念與Git類似,registry可以了解為github這樣的托管服務
10、docker的主要用途
官方就是Bulid 、ship、run any app/any where,編譯、裝載、運作、任何app/在任意地放都能運作
就是實作了應用的封裝、部署、運作的生命周期管理隻要在glibc的環境下,都可以運作
運維生成環境中:docker化
釋出服務不用擔心伺服器的運作環境,所有的伺服器都是自動配置設定docker,自動部署,自動安裝,自動運作
再不用擔心其他服務引擎的磁盤問題,cpu問題,系統問題了
資源利用更出色
自動遷移,可以制作鏡像,遷移使用自定義的鏡像即可遷移,不會出現什麼問題
管理更加友善了
11、docker改變了什麼
面向産品:産品傳遞
面向開發:簡化環境配置
面向測試:多版本測試
面向運維:環境一緻性
面向架構:自動化擴容(微服務)
二、docker架構
1、總體架構
distribution 負責與docker registry互動,上傳洗澡鏡像以及v2 registry 有關的源資料
registry負責docker registry有關的身份認證、鏡像查找、鏡像驗證以及管理registry mirror等互動操作
image 負責與鏡像源資料有關的存儲、查找,鏡像層的索引、查找以及鏡像tar包有關的導入、導出操作
reference負責存儲本地所有鏡像的repository和tag名,并維護與鏡像id之間的映射關系
layer子產品負責與鏡像層和容器層源資料有關的增删改查,并負責将鏡像層的增删改查映射到實際存儲鏡像層檔案的graphdriver子產品
graghdriver是所有與容器鏡像相關操作的執行者
2、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容器就處于運作狀态,該容器擁有獨立的檔案系統,獨立并且安全的運作環境等。
3、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直接互動,但可以通過與容器這個橋梁來互動,由于是作業系統級别的虛拟技術,中間的損耗幾乎可以不技
三、docker架構2各個子產品的功能(帶完善)
主要的子產品有:
Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。
1、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。
2、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
3、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。
4、engine
Engine是Docker架構中的運作引擎,同時也Docker運作的核心子產品。它扮演Docker container存儲倉庫的角色,并且通過執行job的方式來操縱管理這些容器。
在Engine資料結構的設計與實作過程中,有一個handler對象。該handler對象存儲的都是關于衆多特定job的handler處理通路。舉例說明,Engine的handler對象中有一項為:{“create”: daemon.ContainerCreate,},則說明當名為”create”的job在運作時,執行的是daemon.ContainerCreate的handler。
5、job
一個Job可以認為是Docker架構中Engine内部最基本的工作執行單元。Docker可以做的每一項工作,都可以抽象為一個job。例如:在容器内部運作一個程序,這是一個job;建立一個新的容器,這是一個job,從Internet上下載下傳一個文檔,這是一個job;包括之前在Docker Server部分說過的,建立Server服務于HTTP的API,這也是一個job,等等。
Job的設計者,把Job設計得與Unix程序相仿。比如說:Job有一個名稱,有參數,有環境變量,有标準的輸入輸出,有錯誤處理,有傳回狀态等。
6、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,這樣可以保證容器鏡像的擷取在内網完成。
7、Graph
Graph在Docker架構中扮演已下載下傳容器鏡像的保管者,以及已下載下傳容器鏡像之間關系的記錄者。一方面,Graph存儲着本地具有版本資訊的檔案系統鏡像,另一方面也通過GraphDB記錄着所有檔案系統鏡像彼此之間的關系。Graph的架構如下:
其中,GraphDB是一個建構在SQLite之上的小型圖資料庫,實作了節點的命名以及節點之間關聯關系的記錄。它僅僅實作了大多數圖資料庫所擁有的一個小的子集,但是提供了簡單的接口表示節點之間的關系。
同時在Graph的本地目錄中,關于每一個的容器鏡像,具體存儲的資訊有:該容器鏡像的中繼資料,容器鏡像的大小資訊,以及該容器鏡像所代表的具體rootfs。
8、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架構如下:
9、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的功能以及其本身與系統的松耦合特性,很有可能會在其他以容器為原型的平台出現,同時也很有可能催生出雲計算領域全新的項目。
10、docker container
Docker container(Docker容器)是Docker架構中服務傳遞的最終展現形式。
Docker按照使用者的需求與指令,訂制相應的Docker容器:
使用者通過指定容器鏡像,使得Docker容器可以自定義rootfs等檔案系統; 使用者通過指定計算資源的配額,使得Docker容器使用指定的計算資源; 使用者通過配置網絡及其安全政策,使得Docker容器擁有獨立且安全的網絡環境; 使用者通過指定運作的指令,使得Docker容器執行指定的工作。
四、docker簡單使用
1、安裝
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
2、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
3、搜尋下載下傳鏡像
docker pull alpine #下載下傳鏡像
docker search nginx #檢視鏡像
docker pull nginx
4、檢視已經下載下傳的鏡像
[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
[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 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
~
~
~
~
如果更改存儲目錄就添加
--graph=/opt/docker
如果更改DNS
預設采用主控端的dns
--dns=xxxx的方式指定
9、運作hello world
這裡用centos鏡像echo一個hello word
[root@web1 overlay2]# 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
[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
/ #
/ #
/ #
/ #
/ #
/ # ls
bin etc lib mnt proc run srv tmp var
dev home media opt root sbin sys usr
/ # cd tmp
/tmp # exit
背景運作(-d背景運作)(--name添加一個名字)
[root@web1 overlay2]# docker run -it -d --name test1 alpine
ac46c019b800d34c37d4f9dcd56c974cb82eca3acf185e5f8f80c8a60075e343
[root@web1 overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac46c019b800 alpine "/bin/sh" 5 seconds ago Up 3 seconds test1
[root@web1 overlay2]#
還有一種-rm參數,ctrl+c後就删除,可以測試環境用,生成環境用的少
[root@web1 overlay2]# docker run -it --rm --name centos nginx
^C[root@web1 overlay2]#
##另開一個視窗
[root@web1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3397b96ea7bd nginx "nginx -g 'daemon ..." 27 seconds ago Up 25 seconds 80/tcp centos
ac46c019b800 alpine "/bin/sh" 4 minutes ago Up 4 minutes test1
[root@web1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac46c019b800 alpine "/bin/sh" 4 minutes ago Up 4 minutes test1
[root@web1 ~]#
11、如何進入容器
三種方法,上面已經示範了一種
第一種,需要容器本身的pid及util-linux,不推薦,暫時不示範了
第二種,不配置設定bash終端的一種實施操作,不推薦
這種操作如果在開一個視窗也能看到操作的指令,所有人都能看到
[root@web1 overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fc796e928d7 nginx "sh" 2 minutes ago Up 8 seconds 80/tcp mynginx
ac46c019b800 alpine "/bin/sh" 12 minutes ago Up 12 minutes test1
[root@web1 overlay2]# docker attach mynginx
#
#
#
#
# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
# exit
[root@web1 overlay2]# docker attach mynginx
You cannot attach to a stopped container, start it first
[root@web1 overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac46c019b800 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 pa
docker: 'pa' is not a docker command.
See 'docker --help'
[root@web1 overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6fc2d091cfe9 nginx "nginx -g 'daemon ..." 45 seconds ago Up 43 seconds 80/tcp mynginx
ac46c019b800 alpine "/bin/sh" 16 minutes ago Up 16 minutes test1
12、檢視docker程序及删除容器
上面已經示範
[root@web1 overlay2]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fc796e928d7 nginx "sh" 2 minutes ago Up 8 seconds 80/tcp mynginx
ac46c019b800 alpine "/bin/sh" 12 minutes ago Up 12 minutes test1
[root@web1 overlay2]# docker ps -a #-a :顯示所有的容器,包括未運作的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fc796e928d7 nginx "sh" 4 minutes ago Exited (0) About a minute ago mynginx
ac46c019b800 alpine "/bin/sh" 15 minutes ago Up 15 minutes test1
3bf234febeaa alpine "sh" 17 minutes ago Exited (0) 16 minutes ago youthful_lumiere
ab113c63f0b4 centos "echo 'hello world'" 31 minutes ago Exited (0) 31 minutes ago infallible_torvalds
b326027dcf42 zxg/my_nginx "nginx" 8 days ago Exited (0) 8 days ago my_nginx
4f1f1ca319f2 centos "bash" 8 days ago Exited (137) 8 days ago musing_lichterman
64b4e32991c7 nginx "nginx -g 'daemon ..." 12 days ago Exited (0) 12 days ago mynginx1
aee506fe7b5a alpine "sh" 12 days ago Created infallible_haibt
70620c73b9a0 alpine "sh" 12 days ago Created gallant_volhard
7655cbf87bb0 alpine "sh" 12 days ago Created agitated_brahmagupta
33fb949372e8 fce289e99eb9 "/hello" 12 days ago Created elastic_dijkstra
9de47616aea4 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 <[email protected]>"
},
"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>
[root@web1 overlay2]#
14、檢視日志
-f 挂起這個終端,動态檢視日志
[root@web1 ~]# docker logs -f mynginx
轉載請注明出處:https://www.cnblogs.com/zhangxingeng/p/11236968.html
下面幾篇介紹鏡像制作方法及私庫搭建:
Docker2 docker commit方法鏡像制作
Docker3-Dockerfile建立鏡像的方法(推薦docker file這種方法)
Docker4-docker私庫的搭建及常用方法-docker-registry方式
Docker5-docker私庫的搭建及常用方法-harbor-registry方式
下面幾篇介紹K8S:
介紹:Kubernetes1-K8s的簡單介紹
部署:請見Kubernetes2-K8s的叢集部署
kubectl:請見Kubernetes3-kubectl管理Kubernetes容器平台-1
kubectl:請見Kubernetes3-kubectl管理Kubernetes容器平台-2
參考1:https://cloud.tencent.com/developer/article/1006116
參考2:https://yq.aliyun.com/articles/65145?spm=5176.11065265.1996646101.searchclickresult.4b465c7aYn2qsn
參考3:https://blog.51cto.com/10085711/2068290
參考4:https://www.cnblogs.com/zuxing/articles/8717415.html