Docker實踐(一)

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是基於內核的虛擬化技術


wKiom1g5sx2iaXmCAADqws4yjKY386.png-wh_50

wKioL1g5sx-CM1-SAAD1zepAeDs409.png-wh_50

             虛擬化與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交互模型

wKiom1g5suqixjcyAAC3Ze0cJTo330.png-wh_50

                                                          DockerC/S模式

RemoteAPI交互模型

wKiom1g5ssui9p3jAAC0kSNx0Ng314.png-wh_50

                                                     DockerC/S模式-RemoteAPI

Docker八大應用場景

wKioL1g5srLzG0dXAAISLyuChMo154.png-wh_50

                                                        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  #搜索全部centosdocker鏡像

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 ~]

8.容器間互聯

建立容器時--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

相關文章
相關標籤/搜索