Docker實踐linux
什麼是LXC?nginx
LXC爲Linux Container的簡寫。Linux Container容器是一種內核虛擬化技術,能夠提供輕量級的虛擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性。至關於C++中的NameSpace。容器有效地將由單個操做系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。與傳統虛擬化技術相比,它的優點在於:git
與宿主機使用同一個內核,性能損耗小;面試
不須要指令級模擬;docker
不須要即時(Just-in-time)編譯;shell
容器能夠在CPU核心的本地運行指令,不須要任何專門的解釋機制;後端
避免了準虛擬化和系統調用替換中的複雜性;centos
輕量級隔離,在隔離的同時還提供共享機制,以實現容器與宿主機的資源共享。api
總結:Linux Container是一種輕量級的虛擬化的手段。安全
什麼是Docker?
docker的英文本意是碼頭工人,也就是搬運工,這種搬運工搬運的是集裝箱(Container),集裝箱裏面裝的可不是商品貨物,而是任意類型的App,Docker把App(叫Payload)裝在Container內,經過Linux Container技術的包裝將App變成一種標準化的、可移植的、自管理的組件,這種組件能夠在你的latop上開發、調試、運行,最終很是方便和一致地運行在production環境下。
Docker項目的目標是實現輕量級的操做系統虛擬化解決方案。
Docker是經過內核虛擬化技術(namespaces及cgroups等)來提供容器的資源隔離與安全保障等。因爲Docker經過操做系統層的虛擬化實現隔離,因此Docker容器在運行時,不須要相似虛擬機VM額外的操做系統開銷,提升資源利用率。
下面圖比較了Docker和傳統虛擬化方式的不一樣之處,可見容器是在操做系統層面上實現虛擬化,直接複製本地主機的操做系統,而傳統方式則是在硬件層面實現。
KVM是基於硬件的虛擬化技術
Docker是基於內核的虛擬化技術
虛擬化與docker對比圖
Docker的工做模式
學習Docker的源碼並非一個枯燥的過程,反而能夠從中理解Docker架構的設計原理。
Docker對使用者來說是一個C/S模式的架構,而Docker的後端是一個很是鬆耦合的架構,模塊各司其職,並有機組合,支撐Docker的運行。
用戶是使用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容器就處於運行狀態,該容器擁有獨立的文件系統,獨立而且安全的運行環境等。
CLI交互模型
Docker的C/S模式
RemoteAPI交互模型
Docker的C/S模式-RemoteAPI
Docker八大應用場景
Dcoerk八中應用場景
一、簡化配置,統一配置,經過鏡像快速啓動(Simplifying)
二、代碼流水線管理,開發環境->測試環境->預生產環境->灰度發佈->正式發佈,docker在這裏實現了快速遷移(Code Oioeline Management)
三、開發效率,對開發人員,有了鏡像,直接啓動容器便可(DeveloperProductivity)
四、應用隔離,相對於虛擬機的徹底隔離會佔用資源,docker會比較節約資源(App lsolation)
五、服務器整合,一臺服務器跑多個docker容器,提升服務器的利用率(ServerConsolidation)
六、調試能力,debug調試(Debugging Capabilties)
七、多租戶,一個租戶多個用戶,相似於阿里公有云的一個project下多個用戶(Multi-tenancy)
八、快速部署,不須要啓動操做系統,實現秒級部署(Rapid Deplovment)
Docker八大開發模式
1.共享基礎容器
2.共享捲開發容器
3.開發工具容器
4.不一樣環境下測試容器
5.構建容器
6.安裝容器
7.盒子中默認服務容器
8.基礎設施/粘合劑容器
Docker九個基本事實
1.容器不一樣於虛擬機
2.容器不如虛擬機來得成熟
3.容器能夠在幾分之一秒內啓動
4.容器已在大規模環境證實了自身的價值
5.IT人員稱容器爲輕量級
6.容器引起了安全問題
7.Docker已成爲容器的代名詞,但它不是惟一的提供者
8.容器能節省IT人力,加快更新
9.容器仍面臨一些沒有解決的問題
使用Docker理由
做爲一種新興的虛擬化方式,Docker跟傳統的虛擬化方式具備衆多的優點。
首先,Docker容器的啓動能夠在秒級實現,這相比傳統的虛擬機方式要快得多。其次,Docker對系統資源的利用率很低,一臺主機上能夠同時運行數千個Docker容器。
至於爲何要使用Docker:
一、技術儲備
相對大公司這個很是重要,若是大家都在用,他們不用就落後了,等到徹底成熟之後就跟不上了。 二、無技術棧和技術債
沒有任何Openstack或者saltstack,服務down了就down了,全部的服務都是鬆耦合。
3、跟上潮流(提高自我,裝逼)
面試的時候你們都會Docker,你不會是否是落後了。
4、符合當前業務
雖然Docker很優秀,可是,大多數處在第二種狀態,不多有符合本身的業務
Docker改變了什麼
面向產品:產品交付
面向開發:簡化環境配置
面向測試:多版本測試
面向運維:環境一致性
面向架構:自動化擴容(微服務)
Docker更快速的交付和部署
對於開發和人員來講,最但願的就是一次建立和配置,能夠在任意地方正常運行。
開發者可使用一個標準的鏡像來構建一套開發容器,開發完成以後,運維人員能夠直接使用這個容器來部署代碼。Docker能夠快速建立容器,快速迭代應用程序,並讓整個過程全稱可見,使團隊中的其餘成員更容易理解應用程序是如何建立和工做。Docker容器很輕很快!容器的啓動時間是秒級的,大量第節約開發、測試、部署的時間。
Docker更高效的虛擬化
Docker容器的運行不須要額外的Hypervisor支持,它是內核級的虛擬化,所以能夠實現更高的性能和效率。
Docker更輕鬆的遷移和擴展
Docker容器幾乎能夠在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、我的電腦、服務器等。這種兼容性可讓用戶把一個應用程序從一個平臺直接遷移到另一個。
Docker更簡單的管理
使用Docker,只須要小小的修改,就能夠替代往大量的更新工做。全部的修改都以增量的方式被分發和更新,從而實現自動化而且高效的管理。
Docker與虛擬化、OpenStack
特性 容器 虛擬機
啓動 秒級 分鐘級
硬盤使用 通常爲 MB 通常爲 GB
性能 接近原生 弱於
系統支持量 單機支持上千個容器 通常幾十個
類別 |
Docker |
OpenStack |
結論 |
部署難度 |
很是簡單 |
組件多,部署複雜 |
因爲平臺是對已有的線上生產環境進行改造,必須選擇侵入性較小的容器化技術 |
啓動速度 |
秒級 |
分鍾級 |
面對流量峯值,速度就是一切 |
執行性能 |
和物理系統幾乎一致 |
VM會佔用一些資源 |
微博核心業務對服務SLA要求很是苛刻 |
鏡像體積 |
鏡像是MB級別 |
虛擬機鏡像是GB級別 |
當集羣大規模部署時,體積小就表明更大的並發調度量 |
管理效率 |
管理簡單 |
組件相互依賴,管理複雜 |
生產系統集羣可控性是核心競爭力 |
隔離性 |
隔離性高 |
徹底隔離 |
|
可管理性能 |
單進程、不建議啓動SSH |
完整的系統管理 |
|
網絡連接 |
比較弱 |
藉助Neutron能夠靈活組建各類網絡架構 |
Docker三大核心概念
Docker鏡像(p_w_picpath)
Docker鏡像就是一個只讀的模板。
例如:一個鏡像能夠包含一個完整的CentOS操做系統環境,裏面僅安裝了Apache或用戶須要的其餘應用程序。
鏡像能夠用來建立Docker容器。
Docker提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。
Docker容器(container)
Docker利用容器來運行應用。
容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的,保證安全的平臺。
能夠把容器看作是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
注意:鏡像是隻讀的,容器在啓動的時候建立一層可寫層做爲最上層。
Docker倉庫(repository)
倉庫是集中存放鏡像文件的場所。有時候把倉庫和倉庫註冊服務器(Registry)混爲一談,並不嚴格區分。實際上,倉庫註冊服務器上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。
倉庫分爲公開倉庫(Public)和私有倉庫(Private)兩種形式。
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括DockerPool等,能夠提供大陸用戶更穩定快讀的訪問。
當用戶建立了本身的鏡像以後就可使用push命令將它上傳到公有或者私有倉庫,這樣下載在另一臺機器上使用這個鏡像時候,只需須要從倉庫上pull下來就能夠了。
注意:Docker倉庫的概念跟Git相似,註冊服務器能夠理解爲GitHub這樣的託管服務。
Docker企業實戰
系統環境
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@localhost ~]# uname -r
3.10.0-327.el7.x86_64
[root@localhost ~]# yum -y install docker //安裝docker
[root@localhost ~]# systemctl start docker //啓動docker
[root@localhost ~]# systemctl enable docker //加入開機啓動
[root@localhost ~]# docker
docker docker-current docker-storage-setup
[root@localhost ~]# docker version
Client: //客戶端版本
Version: 1.10.3
API version: 1.22
Package version:docker-common-1.10.3-46.el7.centos.14.x86_64
Go version: go1.6.3
Git commit: cb079f6-unsupported
Built: Fri Sep 16 13:24:25 2016
OS/Arch: linux/amd64
Server: //服務器端版本
Version: 1.10.3
API version: 1.22
Package version:docker-common-1.10.3-46.el7.centos.14.x86_64
Go version: go1.6.3
Git commit: cb079f6-unsupported
Built: Fri Sep 16 13:24:25 2016
OS/Arch: linux/amd64
Docker基礎命令
[root@localhost ~]# docker –help
Usage: docker [OPTIONS] COMMAND [arg…]
docker daemon [ –help | … ]
docker [ –help | -v | –version ]
A self-sufficient runtime for containers.
Options:
–config=~/.docker Location of client config files #客戶端配置文件的位置
-D, –debug=false Enable debug mode #啓用Debug調試模式
-H, –host=[] Daemon socket(s) to connect to #守護進程的套接字(Socket)鏈接
-h, –help=false Print usage #打印使用
-l, –log-level=info Set the logging level #設置日誌級別
–tls=false Use TLS; implied by –tlsverify #
–tlscacert=~/.docker/ca.pem Trust certs signed only by this CA #信任證書籤名CA
–tlscert=~/.docker/cert.pem Path to TLS certificate file #TLS證書文件路徑
–tlskey=~/.docker/key.pem Path to TLS key file #TLS密鑰文件路徑
–tlsverify=false Use TLS and verify the remote #使用TLS驗證遠程
-v, –version=false Print version information and quit #打印版本信息並退出
Commands:
attach Attach to a running container #當前shell下attach鏈接指定運行鏡像
build Build an p_w_picpath from a Dockerfile #經過Dockerfile定製鏡像
commit Create a new p_w_picpath from a container’s changes #提交當前容器爲新的鏡像
cp Copy files/folders from a container to a HOSTDIR or to STDOUT #從容器中拷貝指定文件或者目錄到宿主機中
create Create a new container #建立一個新的容器,同run 但不啓動容器
diff Inspect changes on a container’s filesystem #查看docker容器變化
events Get real time events from the server #從docker服務獲取容器實時事件
exec Run a command in a running container #在已存在的容器上運行命令
export Export a container’s filesystem as a tar archive #導出容器的內容流做爲一個tar歸檔文件(對應import)
history Show the history of an p_w_picpath #展現一個鏡像造成歷史
p_w_picpaths List p_w_picpaths #列出系統當前鏡像
import Import the contents from a tarball to create a filesystem p_w_picpath #從tar包中的內容建立一個新的文件系統映像(對應export)
info Display system-wide information #顯示系統相關信息
inspect Return low-level information on a container or p_w_picpath #查看容器詳細信息
kill Kill a running container #kill指定docker容器
load Load an p_w_picpath from a tar archive or STDIN #從一個tar包中加載一個鏡像(對應save)
login Register or log in to a Docker registry #註冊或者登錄一個docker源服務器
logout Log out from a Docker registry #從當前Docker registry退出
logs Fetch the logs of a container #輸出當前容器日誌信息
pause Pause all processes within a container #暫停容器
port List port mappings or a specific mapping for the CONTAINER #查看映射端口對應的容器內部源端口
ps List containers #列出容器列表
pull Pull an p_w_picpath or a repository from a registry #從docker鏡像源服務器拉取指定鏡像或者庫鏡像
push Push an p_w_picpath or a repository to a registry #推送指定鏡像或者庫鏡像至docker源服務器
rename Rename a container #重命名容器
restart Restart a running container #重啓運行的容器
rm Remove one or more containers #移除一個或者多個容器
rmi Remove one or more p_w_picpaths #移除一個或多個鏡像(無容器使用該鏡像才能夠刪除,不然須要刪除相關容器才能夠繼續或者-f強制刪除)
run Run a command in a new container #建立一個新的容器並運行一個命令
save Save an p_w_picpath(s) to a tar archive #保存一個鏡像爲一個tar包(對應load)
search Search the Docker Hub for p_w_picpaths #在docker hub中搜索鏡像
start Start one or more stopped containers #啓動容器
stats Display a live stream of container(s) resource usage statistics #統計容器使用資源
stop Stop a running container #中止容器
tag Tag an p_w_picpath into a repository #給源中鏡像打標籤
top Display the running processes of a container #查看容器中運行的進程信息
unpause Unpause all processes within a container #取消暫停容器
version Show the Docker version information #查看容器版本號
wait Block until a container stops, then print its exit code #截取容器中止時的退出狀態值
Run ‘docker COMMAND –help’ for more information on a command.
#運行docker命令在線幫助能夠獲取更多信息
Docker鏡像管理
1.搜索Docker鏡像
[root@localhost ~]# docker search centos #搜索全部centos的docker鏡像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build ofCentOS. 2839 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 47 [OK]
docker.io docker.io/gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 14 [OK]
docker.io docker.io/million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK]
。。。。。。
2.獲取Docker鏡像
可使用docker pull命令來從倉庫獲取所須要的鏡像。下面的例子將從Docker Hub倉庫下載一個Centos操做系統的鏡像。
[root@localhost ~]# docker pull centos #獲取centos鏡像
[root@localhost ~]# docker run -it centos /bin/bash #完成後可使用該鏡像建立一個容器
[root@5284d42eeb3a /]#
3.查看docker鏡像
鏡像的ID惟一標識了鏡像,若是ID相同,說明是同一鏡像。
TAG信息來區分不一樣發行版本,若是不指定具體標記,默認使用latest標記信息。
[root@localhost ~]# docker p_w_picpaths #查看docker鏡像
REPOSITORY(來自那個倉庫) TAG(標籤) IMAGE ID(惟一ID) CREATED(建立時間) VIRTUAL SIZE(大小)
docker.io/centos latest 60e65a8e4030 5 days ago 196.6 MB
docker.io/nginx latest 813e3731b203 13 days ago 133.8 MB
4.刪除Docker鏡像
若是要移除本地的鏡像,可使用docker rmi命令(在刪除鏡像以前先用docker rm刪除依賴於這個鏡像的全部容器)。注意docker rm 命令是移除容器。
[root@localhost ~]# docker rmi p_w_picpathID #刪除docker鏡像
5.導出Docker鏡像
若是要導出鏡像到本地文件,可使用docker save命令。
[root@localhost ~]# docker save centos >/opt/centos.tar.gz #導出docker鏡像至本地
[root@localhost ~]# ll /opt/
-rw-r–r–. 1 root root 204205056 12月 30 09:53 centos.tar.gz
6.導入Docker鏡像
可使用docker load從本地文件中導入到本地docker鏡像庫
[root@localhost ~]# docker load </opt/centos.tar.gz #導入本地鏡像到docker鏡像庫
[root@localhost ~]# docker p_w_picpaths #查看鏡像導入狀況
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/centos latest 60e65a8e4030 5 days ago 196.6MB
Docker容器管理
1.啓動Docker容器
啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另一個是將在終止狀態(stopped)的容器從新啓動。
由於Docker的容器實在過輕量級了,不少時候用戶都是隨時刪除和新建立容器。
2.新建容器並啓動
所須要的命令主要爲docker run
例如,下面的命令輸出一個hehe,以後終止容器。
[root@localhost ~]# docker run centos/bin/echo 「hehe」#這跟在本地直接執行 /bin/echo ‘hehe’
Hehe
[root@localhost ~]# docker ps -a //查看當前主機下啓動的全部容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f08ffa7419c3 centos "/bin/bash" About a minute ago Up About aminute mydocker
5c45c670367e centos "/bin/echo haha" 4minutes ago Exited (0) 4 minutesago furious_yalow
[root@localhost ~]# docker run --namemydocker -it centos /bin/bash #啓動一個bash終端,容許用戶進行交互。
[root@1c6c3f38ea07 /]# pwd
/
[root@1c6c3f38ea07 /]# ls
anaconda-post.log bin dev etc home liblib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
–name:給容器定義一個名稱
-i:讓容器的標準輸入、輸出,錯誤輸出保持打開。
-t:讓Docker分配一個僞終端,並綁定到容器的標準輸入上
/bin/bash:執行一個命令
當利用docker run來建立容器時,Docker在後臺運行的標準操做包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像建立並啓動一個容器
分配一個文件系統,並在只讀的鏡像層外面掛在一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個ip地址給容器
執行用戶指定的應用程序
執行完畢後容器被終止
3.啓動已終止容器
能夠利用docker start命令,直接將一個已經終止的容器啓動運行。
容器的核心爲所執行的應用程序,所須要的資源都是應用程序運行所必需的。除此以外,並無其餘的資源。能夠在僞終端中利用ps和top來查看進程信息。
[root@localhost~]# docker start 1c6c3f38ea07 #啓動一個終止的容器
1c6c3f38ea07
[root@localhost~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f08ffa7419c3 centos "/bin/bash" 15 minutes ago Up About a minute mydocker
[root@localhost~]# docker attach f08ffa7419c3 //進入已啓動的容器
[root@f08ffa7419c3/]#
[root@f08ffa7419c3/]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11776 1868 ? Ss 12:53 0:00 /bin/b
root 16 0.0 0.0 47424 1664 ? R+ 12:57 0:00 ps aux
[root@f08ffa7419c3/]# exit
exit
[root@localhost~]# docker ps //發現退出後,容器中止了,是由於咱們退出了/bin/bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
nsenter //用nsenter進入容器,不讓它退出。yum insall util-linux
[root@localhost~]# docker inspect --format "``.`State`.`Pid`" f08ffa7419c3 //獲取容器的pid
12425
[root@localhost~]# nsenter --help
Usage:
nsenter [options] <program>[<argument>...]
Run a program withnamespaces of other processes.
Options:
-t, --target <pid> target process to get namespaces from
-m, --mount[=<file>] enter mount namespace
-u, --uts[=<file>] enter UTS namespace (hostname etc)
-i, --ipc[=<file>] enter System V IPC namespace
-n, --net[=<file>] enter network namespace
-p, --pid[=<file>] enter pid namespace
-U, --user[=<file>] enter user namespace
-S, --setuid <uid> set uid in entered namespace
-G, --setgid <gid> set gid in entered namespace
--preserve-credentials do not touch uidsor gids
-r, --root[=<dir>] set the root directory
-w, --wd[=<dir>] set the working directory
-F, --no-fork do not fork before exec'ing<program>
-Z, --follow-context set SELinux context according to --targetPID
-h, --help display this help and exit
-V, --version output version information and exit
For more detailssee nsenter(1).
[root@localhost ~]# nsenter -t 12425 -u -i -n -p
[root@f08ffa7419c3 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 44508 7260 ? Ss 05:26 0:04 /usr/l
root 2 0.0 0.0 0 0 ? S 05:26 0:00 [kthre
root 3 0.0 0.0 0 0 ? S 05:26 0:00 [ksoft
root 5 0.0 0.0 0 0 ? S< 05:26 0:00 [kwork
root 7 0.0 0.0 0 0 ? S 05:26 0:00 [migra
[root@f08ffa7419c3 ~]# exit
logout
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f08ffa7419c3 centos "/bin/bash" 37 minutes ago Up 12 minutes mydocker
[root@localhost~]# docker ps -a #查看是否啓動
CONTAINER ID IMAGECOMMAND CREATED STATUS PORTS NAMES
1c6c3f38ea07centos 「/bin/bash」 8 minutes ago Up 1 seconds mycentos
4.守護進程運行
更多的時候,須要讓Docker容器在後臺以守護形式運行。此時能夠經過添加-d參數來實現。
例以下面的命令會在後臺運行容器。
[root@localhost ~]# docker run -d centos/bin/bash -c 「while true; do echo hehe; sleep 1;done」
961fd1162c2f6a8d04e4d8ab6ccacf4cb01a90af8ab553d5e2c5063ac483ffd8
[root@localhost ~]# docker ps #查看正在運行的docker容器
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2fcentos 「/bin/bash -c ‘while 」 18 minutes ago Up 18 minutes agitated_raman
[root@localhost ~]# docker logs961fd1162c2f
#獲取容器輸出信息,經過docker logs命令
hehe
hehe
…
5.中止容器
可使用docker stop來終止一個運行中的容器。
此外,當Docker容器中指定的應用終結時,容器也自動終止。例如啓動一個終端的容器,用戶經過exit命令或者ctrl+d來退出終端時,所建立的容器馬上終止。
終止狀態的容器能夠用dockerps -a命令看到,也能夠經過docker start ID 命令來啓動容器。
[root@localhost ~]# docker ps -a #查看全部容器的狀況
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2fcentos 「/bin/bash -c ‘while 」 30 minutes ago Up 30 minutes agitated_raman
[root@localhost ~]# docker stop961fd1162c2f #中止容器
961fd1162c2f
[root@localhost ~]# docker ps -a
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
961fd1162c2fcentos 「/bin/bash -c ‘while 」 31 minutes ago Exited (137) 27 seconds ago agitated_raman
極端方式中止容器(不推薦)
[root@867e6627a194~]# docker ps -a -q
#列出全部啓動容器的ID
867e6627a194
[root@867e6627a194~]# docker kill $(docker ps -a -q)
#批量殺掉啓動的容器
./in.sh:行 4: 20078 已殺死 nsenter -t $PID -u -i -n -p
6.刪除容器
[root@867e6627a194~]# docker ps -a #查看全部容器當前狀態
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194centos 「/bin/bash」 16 minutes ago Up 5 minutes mydocker
c599b569f387centos 「/bin/echo hehe」 19 minutes ago Exited (0) 19 minutes agofervent_torvalds
302f39c202c9nginx 「/bin/bash」 2 hours ago Up 2 hours 80/tcp, 443/tcp mynginx
[root@867e6627a194~]#
[root@867e6627a194~]# docker rm c599b569f387 #刪除已經中止的容器
c599b569f387
[root@867e6627a194~]# docker rm -f 302f39c202c9
#刪除正在運行的容器
302f39c202c9
7.進入容器
使用-d參數時,容器啓動後會進入後臺。某些時候須要進入容器進行操做,有不少種方法,包括使用docker attach命令或nsenter工具等。
attach命令
docker attach是Docker自帶的命令。下面示例如何使用該命令。
[root@localhost ~]# docker ps -a
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194centos 「/bin/bash」 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@localhost ~]# docker start867e6627a194
#啓動已經中止的容器
867e6627a194
[root@localhost ~]# docker attach867e6627a194
#經過docker attach進入
[root@867e6627a194/]#
可是使用attach命令有時候並不方便。當多個窗口同時attach到同一個容器的時候,全部的窗口都會同步顯示,當某個窗口因命令阻塞時,其餘窗口也沒法執行操做了。
nsenter命令
nsenter能夠訪問另外一個進程的名字空間。nsenter須要有root權限。
[root@localhost ~]# yum install -yutil-linux
#安裝包中有須要用到的nsenter
[root@localhost ~]# docker ps -a
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194centos 「/bin/bash」 10 minutes ago Exited (127) 47 seconds ago mydocker
[root@localhost ~]# docker start867e6627a194 #啓動已經關閉的容器
867e6627a194
[root@localhost ~]# docker inspect --format「``.`State`.`Pid`」 867e6627a194
#找到容器的第一個進程PID
20012
[root@localhost ~]# nsenter -t 20012 -u -i-n -p
#經過這個PID鏈接到容器
[root@867e6627a194~]# exit
[root@localhost ~]# docker ps
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
867e6627a194centos 「/bin/bash」 13 minutes ago Up 2 minutes mydocker
[root@localhost ~]#cat in.sh #編寫成腳本快速進入容器空間
#!/bin/sh
PID=$(docker inspect –format 「``.`State`.`Pid`」$1)
nsenter -t $PID -u -i -n -p
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUSPORTS NAMES
867e6627a194 centos 「/bin/bash」 15 minutesago Up 4 minutes mydocker
[root@localhost ~]# ./in.sh 867e6627a194 #執行腳本跟上容器ID快速進入
[root@867e6627a194 ~]
建立容器時--name
對容器命名。
[root@localhost ~]# docker run -d -p 9000:5000 --name www1 -v \ /opt/data/registry:/tmp/registryregistry
c1dac01092450b1bff26e4e71a88a06c3d79c7f4308b90346267c3e27d480c32
查看命名的容器
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1dac0109245 registry "/entrypoint.sh/etc/" 6 seconds ago Up 5 seconds 0.0.0.0:9000->5000/tcp www1
也可以使用docker inspect
查看
[root@localhost ~]# docker inspect -f "` `.`Name `" c1dac0109245
/www1
注意:容器的名稱是惟一的。若是已經命名了一個叫www1 的容器,當你要再次使用www1這個名稱的時候,須要先用docker rm
來刪除以前建立的同名容器。
在執行docker run
的時候若是添加--rm
標記,則容器在終止後會馬上刪除。注意,--rm
和-d
參數不能同時使用。
[root@localhost ~]# docker run -dit --name www2 --link \ www1:www2towww1localhost:5000/zkq/mynginx /bin/bash
686abd938f0e6351d02c904925464d70fb0ce0380d84f41bd0f782060b37554d
登陸測試
[root@localhost ~]# docker attach www2
[root@686abd938f0e /]# ping www1
PING www2towww1 (172.17.0.4) 56(84) bytesof data.
64 bytes from www2towww1 (172.17.0.4):icmp_seq=1 ttl=64 time=0.089 ms
64 bytes from www2towww1 (172.17.0.4):icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from www2towww1 (172.17.0.4):icmp_seq=3 ttl=64 time=0.229 ms
64 bytes from www2towww1 (172.17.0.4):icmp_seq=4 ttl=64 time=0.112 ms
^C
--- www2towww1 ping statistics ---
4 packets transmitted, 4 received, 0%packet loss, time 3007ms
rtt min/avg/max/mdev =0.085/0.128/0.229/0.060 ms
本文部份內容參考了老男孩教育博客:http://blog.oldboyedu.com