Docker 容器學習筆記

Docker 誕生於2013年,最初發起者是dotCloud公司.Docker自開源後受到普遍的關注和討論,目前已有多個相關項目逐漸造成了圍繞Docker容器的生態體系,因爲Docker在業界形成的影響力實在太大,dotCloud公司後來也直接更名爲Docker Inc,並專一於Docker相關技術和產品的開發.php

Docker是基於Go語言實現的開源容器項目,Docker讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化.容器是徹底使用沙箱機制,相互之間不會有任何接口,html


Docker 容器簡介

Docker的構想是要實現 "Build,Ship and Run Any App,Anywhere" ,即經過對應用的封裝(Packaging)、分發(Distribution)、部署(Deployment)、運行(Runtime)生命週期進行管理,達到應用組件 "一次封裝,處處運行" 的目的.這裏的應用組件,既能夠是一個Web應用、一個編譯環境,也能夠是一套數據庫平臺服務,甚至是一個操做系統或集羣.基於Linux平臺上的多項開源技術,Docker提供了高效、敏捷和輕量級的容器方案,並支持部署到本地環境和多種主流雲平臺.能夠說,Docker首次爲應用的開發、運行和部署提供了"一站式"的實用解決方案,並且Docker的源代碼是開源的,並已加入了Linux基金會,遵循Apache2.0協議,所有開源代碼均在https://github.com/docker/上進行維護.python

跟大部分新興技術的誕生同樣,Docker也並不是"從石頭縫裏蹦出來的",而是站在前人的肩膀上,其中最重要的就是Linux容器(LinuxContainers LXC)技術,LXC能夠提供輕量級的虛擬化,以便隔離進程和資源,並且不須要提供指令解釋機制以及全虛擬化的其餘複雜性.至關於C++中的NameSpace.容器有效地將由單個操做系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求,LXC在資源管理方面依賴於Linux內核的cgroups子系統,cgroups子系統是Linux內核提供的一個基於進程組的資源管理的框架,能夠爲特定的進程組限定可使用的資源.LXC在隔離控制方面依賴於Linux內核的namespace特性,具體而言就是在clone時加入相應的flag.mysql

Docker與Linux系統linux

在LXC的基礎上,Docker進一步優化了容器的使用體驗,首先Docker提供了各類容器管理工具(如分發、版本、移植等)讓用戶無需關注底層的操做,能夠更簡單明瞭地管理和使用容器.其次Docker經過引入分層文件系統構建和高效的鏡像機制,下降了遷移難度,極大地提高了用戶體驗.用戶操做Docker容器就像操做應用自身同樣簡單,早期的Docker代碼實現是直接基於LXC的,自0.9版本開始Docker開發了libcontainer項目,做爲更普遍的容器驅動實現,從而替換掉了LXC的實現.目前Docker還積極推進成立了runC標準項目,試圖讓容器支持再也不侷限於Linux操做系統,而是更安全、更具擴展性.nginx

簡單來講,其實咱們能夠把Docker容器理解爲一種輕量級的沙盒(sandbox),每一個容器內運行着一個應用,不一樣的容器相互隔離,容器之間也能夠經過網絡互相通訊.容器的建立和中止都十分快速,幾乎跟建立和終止原生應用一致.另外,容器自身對系統資源的額外需求也十分有限,遠遠低於傳統虛擬機.不少時候,甚至直接把容器看成應用自己也沒有任何問
題.git

Docker虛擬化的好處github

Docker項目的發起人和Docker公司CTO Solomon Hykes曾認爲,Docker在正確的地點、正確的時間順應了正確的趨勢——如何正確地構建應用.在雲時代,開發者建立的應用必需要能很方便地在網絡上傳播,也就是說應用必須脫離底層物理硬件的限制.同時必須是"任什麼時候間、任何地點"可獲取的,所以,開發者須要一種新型的建立分佈式應用程序的方式,快速分發和部署,這正是Docker所可以提供的最大優點,web

Docker還能夠快速遷移數據,經過容器來打包應用,解耦應用和運行平臺.意味着遷移的時候,只須要在新的服務器上啓動須要的容器就能夠了,不管新舊服務器是不是同一類型的平臺.這無疑將節約大量的寶貴時間,並下降部署過程出現問題的風險.redis

Go語言與Docker

相比Go語言與其它語言的對比,國內外不少技術媒體都有列舉,在Docker領域Go語言相比其它語言的優點在於.

● 相對於C/C++開發難度低,支持向前兼容,運維維護成本小.
● 相對於python生成的是靜態文件,有效的避免的低級錯誤,而且性能高一個等級.
● 併發性好,內存佔用低,屬於編譯型.
● 部署簡單,畢竟生成的靜態文件,有glibc的地方就能運行.

一門語言固然也有本身的缺點,好比內存回收延遲久,圖片處理庫有bug,對包版本要求嚴格等一些問題,可是瑕不掩瑜,一個開發成本極其簡單,性能優良,部署簡單的語言與Docker簡直就是天做之合.

Docker的引擎簡介

Docker的是基於Linux自帶的(Linux Containers,LXC)技術,在LXC上Docker進行了近一步封裝.正由於如此,Docker只能在Linux環境下運行,固然前段時間docker終於支持OSX和Windows了,雖然仍是體驗嚐鮮版,但更加方便開發者去開發了.

Docker的原理

其實前面講了這麼多,Docker的原理已經不言而喻,這裏用IBM的解釋就是:

容器有效的將單個操做系統管理的資源劃分到孤立的組中,以便更好的在孤立的組之間平衡有衝突的資源使用需求.與虛擬化相比,這樣既不須要指令級模擬,也不須要即時編譯.容器能夠在覈心CPU本地運行指令,而不須要任何專門的解釋機制.此外,也避免了準虛擬化(paravirtualization)和系統調用替換中的複雜性.

簡而言之就是,Docker是一個盒子,一個盒子裝一個玩具,不管你丟在哪裏,你給他通電(glibc)他就能運行.你的玩具大就用大盒子,小玩具就用小盒子.

兩個應用之間的環境是環境是徹底隔離的,創建通訊機制來互相調用.容器的建立和中止都十分快速(秒級),容器自身對資源的需求十分有限,遠比虛擬機自己佔用的資源少.


Docker的大部分操做都圍繞着它的三大核心概念:鏡像、容器、倉庫而展開.所以,準確把握這三大核心概念對於掌握Docker技術尤其重要,在docker中,咱們重點關注的就是鏡像和容器了.由於在實際應用中,咱們封裝好鏡像,而後經過鏡像來建立容器,在容器運行咱們的應用就行了.而server端掌控網絡和磁盤,咱們不用去關心,啓動docker sever 和 docker client都是一條命令的事情.

鏡像(Image): Docker鏡像相似於虛擬機鏡像,能夠將它理解爲一個只讀的模板.例如,一個鏡像能夠包含一個基本的操做系統環境,裏面僅安裝了一個應用程序,能夠把它稱爲一個鏡像,鏡像是建立Docker容器的基礎.經過版本管理和增量的文件系統,Docker提供了一套十分簡單的機制來建立和更新現有的鏡像,用戶甚至能夠從網上下載一個已經作好的應用鏡像,並直接使用.

容器(Container): Docker容器相似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用.容器是從鏡像建立的應用運行實例.能夠將其啓動、開始、中止、刪除,而這些容器都是彼此相互隔離的、互不可見的.能夠把容器看作是一個簡易版的Linux系統環境,以及運行在其中的應用程序打包而成的盒子.

鏡像啓動後,都是一堆layer的統一視角,惟一的卻別是鏡像最上面那一層是隻讀的,不能夠修改,可是容器最上面一層是rw的,提供給用戶操做.

倉庫(repository): Docker倉庫相似於代碼倉庫,它是Docker集中存放鏡像文件的場所.根據所存儲的鏡像公開分享與否,Docker倉庫能夠分爲公開倉庫(Public)和私有倉庫(Private)兩種形式.目前,最大的公開倉庫是官方提供的Docker Hub,其中存放了數量龐大的鏡像供用戶下載.國內很多雲服務提供商(如網易雲、阿里雲等)也提供了倉庫的本地源,能夠提供穩定的國內訪問.


Docker 安裝

1.配置YUM源,此處咱們使用阿里源,並安裝EPEL源,和Docker相應的依賴.

[root@localhost ~]# rm -fr /etc/yum.repos.d/*
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install epel-release
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

2.下載Docker源,並開始配置一些安裝屬性列表.

[root@localhost ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@localhost ~]# yum-config-manager --enable docker-ce-edge
[root@localhost ~]# yum-config-manager --enable docker-ce-test
[root@localhost ~]# yum-config-manager --disable docker-ce-edge

3.開始安裝Docker,並設置開機自啓動.

[root@localhost ~]# yum install -y docker-ce
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# docker run hello-world

4.接着配置好阿里雲Docker加速器地址.

[root@localhost ~]# vim /etc/docker/daemon.json

{
 "registry-mirrors": ["https://h8o9al0n.mirror.aliyuncs.com"]
}

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker version


管理Docker鏡像

鏡像是Docker三大核心概念中最爲重要的,自Docker誕生之日起,鏡像就是相關社區最爲熱門的關鍵詞,Docker運行容器前須要本地存在對應的鏡像,若是鏡像沒保存在本地,Docker會嘗試先從默認Docker Hub倉庫下載,用戶也能夠經過配置,使用自定義的鏡像倉庫.

下面例子將圍繞鏡像這一核心概念的具體操做,包括如何使用pull命令從Docker Hub倉庫中下載鏡像到本地,如何查看本地已有的鏡像信息和管理鏡像標籤,如何在遠端倉庫使用search命令進行搜索和過濾,如何刪除鏡像標籤和鏡像文件,如何建立用戶定製的鏡像而且保存爲外部文件.最後,還介紹如何往Docker Hub倉庫中推送本身的鏡像.

◆查詢本地鏡像◆

使用docker images命令能夠列出本地主機上已有鏡像的基本信息,還可使用條件過濾出你想要看獲得的相關鏡像文件的信息.

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

上面信息的參數解釋,在列出的信息中能夠看到如下幾個字段信息:

REPOSITORY=來自於哪一個倉庫,好比hello-world倉庫.
TAG=鏡像標籤信息,latest表示不一樣版本信息.
IMAGE ID=鏡像惟一ID號,此處惟一.
CREATED=建立時間信息,鏡像最後的更新時間.
SIZE=鏡像大小,優秀的鏡像每每體積都較小,hello-world很優秀.

其中鏡像的ID信息十分重要,它惟一標識了鏡像.在使用鏡像ID的時候,通常可使用該ID的前若干個字符組成的可區分串來替代完整的ID,好比後期咱們要刪除一個鏡像時無需寫出所有鏡像ID.

TAG信息用來標記來自同一個倉庫的不一樣鏡像,例如ubuntu倉庫中有多個鏡像,經過TAG信息來區分發行版本,包括13.0四、14.0四、16.04等標籤.

鏡像大小信息只是表示該鏡像的邏輯體積大小,實際上因爲相同的鏡像層本地只會存儲一份,物理上佔用的存儲空間會小於各鏡像的邏輯體積之和.

實例1: 經過使用-a --all=true|false參數,列出全部的鏡像文件(包括臨時文件),默認爲否.由於我這裏只有一個鏡像因此只有這一個啦.

[root@localhost ~]# docker images --all=true

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

實例2: 經過使用--digests=true|false,列出鏡像的數字摘要值,默認爲否.

[root@localhost ~]# docker images --digests=true

REPOSITORY          TAG                 DIGEST                                                                    IMAGE ID            CREATED             SIZE
hello-world         latest              sha256:0add3ace90ecb4adbf7777e9a   4ab4c602aa5e        3 months ago        1.84kB

實例3: 經過使用--quiet=true|false,僅輸出ID信息,默認爲否.

[root@localhost ~]# docker images -q
4ab4c602aa5e

[root@localhost ~]# docker images --quiet=false

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆查詢網絡鏡像◆

使用docker search命令能夠搜索遠端倉庫中共享的鏡像,默認搜索官方倉庫中的鏡像.用法爲docker search TERM.

實例1: 使用search搜索一個Centos鏡像文件.

[root@localhost ~]# docker search centos

NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   5048                [OK]            
ansible/centos7-ansible            Ansible on Centos7                              119                                     [OK]
jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   102                
......

實例2: 僅顯示自動建立的鏡像,默認爲否.

[root@localhost ~]# docker search --automated=true centos
Flag --automated has been deprecated, use --filter=is-automated=true instead
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ansible/centos7-ansible           Ansible on Centos7                              119                                     [OK]
jdeathe/centos-ssh                CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86…   102                                     [OK]
consol/centos-xfce-vnc            Centos container with "headless" VNC session…   73                                      [OK]
imagine10255/centos6-lnmp-php56   centos6-lnmp-php56                              48                                      [OK]

實例3: 搜索全部自動建立的評價爲1+的帶nginx關鍵字的鏡像.

[root@localhost ~]# docker search --automated -s 3 nginx

Flag --automated has been deprecated, use --filter=is-automated=true instead
Flag --stars has been deprecated, use --filter=stars=3 instead
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1488                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   663

◆拉鏡像到本地◆

可使用docker pull命令直接從Docker Hub鏡像源來下載鏡像,該命令的格式爲docker pull NAME[:TAG].其中NAME是鏡像倉庫的名稱,TAG是鏡像的標籤,一般狀況下,描述一個鏡像須要包括"名稱+標籤".

實例: 經過pull命令獲取一個Centos系統鏡像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker pull centos

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆給鏡像加標籤◆

爲了方便在後續工做中使用特定鏡像,還可使用docker tag命令來爲本地鏡像任意添加新的標籤.

實例: 爲Centos鏡像添加一個新的mycentos:latest鏡像標籤.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker tag centos:latest mycentos:latest

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
mycentos            latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

上圖可看到,當再次使用docker images列出本地主機上鏡像信息,能夠看到多了一個擁有mycentos:latest標籤的鏡像,細心的你可能注意到,這些mycentos:latest鏡像的ID跟centos:latest徹底一致,它們實際上指向同一個鏡像文件,只是別名不一樣而已.docker tag命令添加的標籤實際上起到了相似連接的做用.

◆查詢鏡像詳情◆

使用docker inspect命令能夠獲取該鏡像的詳細信息,包括製做者、適應架構、各層的數字摘要等.

[root@localhost ~]# docker inspect hello-world

[
    {
        "Id": "sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f",
        "RepoTags": [
            "hello-world:latest"
        ],
        "RepoDigests": [
            "hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788"
        ],
.....

上面的輸出有不少,只不過我這裏簡單顯示了,若是咱們只要其中一項內容時,可使用參數-f來指定你要打印的數據,例以下面咱們來演示一下獲取當前鏡像的Id這個字段的數據.

[root@localhost ~]# docker inspect -f {{".Id"}} hello-world

sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f

◆查詢鏡像分層◆

既然鏡像文件由多個層組成,那麼怎麼知道各個層的內容具體是什麼呢?這時候可使用history子命令,該命令將列出各層的建立信息.注意過長的命令被自動截斷了,可使用前面提到的--no-trunc選項來輸出完整命令.

[root@localhost ~]# docker history centos:latest

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
1e1148e4cc2c        8 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           8 days ago          /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B
<missing>           8 days ago          /bin/sh -c #(nop) ADD file:6f877549795f4798a…   202MB

◆刪除指定鏡像◆

使用docker rmi命令能夠刪除鏡像,其中IMAGE能夠爲標籤或ID,若是要強制刪除可加-f這個選項.

刪除鏡像: 經過rmi命令刪除mycentos這個標籤.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
mycentos            latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker rmi mycentos:latest
Untagged: mycentos:latest

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

強制刪除: 強制刪除系統所有鏡像.

[root@localhost ~]# docker rmi -f $(docker images -q)

Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
Untagged: hello-world:latest
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f

◆鏡像導入導出◆

導出操做: 經過save 鏡像ID >導出centos鏡像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker save 1e1148e4cc2c > /root/centos.tar

[root@localhost ~]# ls
centos.tar

導入操做: 經過load < 文件名導入centos鏡像.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker load < centos.tar

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              1e1148e4cc2c        8 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

◆鏡像命令速查◆

[root@localhost ~]# docker info                       #查詢守護進程的系統資源設置
[root@localhost ~]# docker search                     #倉庫鏡像的查詢
[root@localhost ~]# docker pull                       #倉庫鏡像的下載
[root@localhost ~]# docker images                     #本地鏡像的查詢
[root@localhost ~]# docker rmi                        #本地鏡像的刪除
[root@localhost ~]# docker rmi -f $(docker images -q) #強制刪除所有鏡像(Image)
[root@localhost ~]# docker rmi -f <image id>          #強制刪除指定鏡像(Image)
[root@localhost ~]# docker history 鏡像名              #查詢鏡像的分層
[root@localhost ~]# docker save 鏡像ID > /root/*.tar  #鏡像的導出
[root@localhost ~]# docker load < /root/*.tar         #鏡像的導入


管理Docker容器

容器是Docker的另外一個核心概念,簡單來講,容器是鏡像的一個運行實例.所不一樣的是,鏡像是靜態的只讀文件,而容器帶有運行時須要的可寫文件層.若是認爲虛擬機是模擬運行的一整套操做系統和跑在上面的應用,那麼Docker容器就是獨立運行的一個應用,以及它們必需的運行環境.

下面的例子將具體介紹圍繞容器的重要操做,包括建立一個容器、啓動容器、終止一個容器、進入容器內執行操做、刪除容器和經過導入導出容器來實現容器遷移等.

◆建立容器◆

從如今開始,忘掉臃腫的虛擬機吧,對容器進行操做就跟直接操做應用同樣簡單、快速.Docker容器實在過輕量級了,用戶能夠隨時建立或刪除容器.

新建容器: 可使用docker create命令新建一個容器,使用docker create命令新建的容器處於中止狀態,可使用docker start命令來啓動它.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker create -it centos:latest
23c881ac33c526e60811978a418be92c6a022c106e6d59d989fb7b932dc3473a

[root@localhost ~]# docker start 23c881ac33c5
23c881ac33c5

新建並啓動: 除了建立容器後經過start命令來啓動,也能夠直接新建並啓動容器.所須要的命令主要爲docker run,等價於先執行docker create命令,再執行docker start命令.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker run centos:latest

守護態運行: 更多的時候,須要讓Docker容器在後臺以守護態Daemonized形式運行.此時,能夠經過添加-d參數來實現.

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              1e1148e4cc2c        9 days ago          202MB
hello-world         latest              4ab4c602aa5e        3 months ago        1.84kB

[root@localhost ~]# docker run -itd ubuntu:latest
540fd59ee8899a38c4302d83549bd113ad159064ec41c9475a773cbc0fd2dfb8

[root@localhost ~]# docker run -d centos:latest /bin/sh
505a728a2bed9e96b3e4615c4e528bd55285a856dc201bb50d4ed5c9e0a52566

[root@localhost ~]# docker run -d centos:latest /bin/sh -c "echo hello"
6c8fc14a6637928442b768bee0b2d3af800464192e7fce295f39ccdd91b73572

◆終止容器◆

可使用docker stop來終止一個運行中的容器,也可使用docker kill命令幹掉一個容器.

stop終止容器: 指定經過stop終止一個容器.

[root@localhost ~]# docker stop 540fd59ee889
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         6 minutes ago       Up 6 minutes                            festive_liskov

[root@localhost ~]# docker stop 540fd59ee889
540fd59ee889

kill終止容器:docker kill命令會直接發送SIGKILL信號來強行終止容器.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
84da1ad9f06c        centos:latest       "/bin/bash"         33 seconds ago      Up 32 seconds                           hungry_bhabha

[root@localhost ~]# docker kill 84da1ad9f06c
84da1ad9f06c

◆進入容器◆

在使用-d參數時,容器啓動後會進入後臺,用戶沒法看到容器中的信息,也沒法進行操做.
這個時候若是須要進入容器進行操做,有多種方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等.下面分別介紹一下.

attach進入容器: attach是Docker自帶的命令,下面咱們使用它來進入容器的內部吧.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         About a minute ago   Up About a minute                       festive_liskov
300560ca1c88        centos:latest       "/bin/bash"         3 minutes ago        Up 3 minutes                            ecstatic_raman

[root@localhost ~]# docker attach 300560ca1c88
[root@300560ca1c88 /]#

可是使用attach命令有時候並不方便,當多個窗口同時用attach命令連到同一個容器的時候,全部窗口都會同步顯示.當某個窗口因命令阻塞時,其餘窗口也沒法執行操做了,接着下面的命令就更好一些了.

exec進入容器: Docker從1.3.0版本起提供了一個更加方便的exec命令,能夠在容器內直接執行任意命令.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
540fd59ee889        ubuntu:latest       "/bin/bash"         3 minutes ago       Up 3 minutes                            festive_liskov

[root@localhost ~]# docker exec -it 540fd59ee889 /bin/bash
root@540fd59ee889:/#

能夠看到,一個bash終端打開了,在不影響容器內其餘應用的前提下,用戶能夠很容易與容器進行交互,經過指定-it參數來保持標準輸入打開,而且分配一個僞終端.經過exec命令對容器執行操做是最爲推薦的方式.

◆刪除容器◆

可使用docker rm命令來刪除處於終止或退出狀態的容器.

rm 刪除容器: 經過rm -f命令強制刪除一個容器.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fa6110bdb3df        centos:latest       "/bin/bash"         3 seconds ago       Up 2 seconds                            eager_mirzakhani

[root@localhost ~]# docker rm -f fa6110bdb3df
fa6110bdb3df

◆命令速查◆

[root@localhost ~]# docker run                      #容器的建立或啓動
[root@localhost ~]# docker run --restart=always     #設置容器的自啓動

[root@localhost ~]# docker ps                       #運行中的容器的查詢
[root@localhost ~]# docker ps --no-trunc            #查看容器狀態
[root@localhost ~]# docker start/stop               #容器啓動/關閉
[root@localhost ~]# docker stop $(docker ps -a -q)  #中止全部運行中的容器(Container)
[root@localhost ~]# docker rm $(docker ps -a -q)    #刪除所有容器(Container)

[root@localhost ~]# docker start/stop 鏡像名         #經過容器別名啓動/中止
[root@localhost ~]# docker inspect 鏡像名            #查看容器全部基本信息
[root@localhost ~]# docker logs 鏡像名               #查看容器日誌
[root@localhost ~]# docker stats 鏡像名              #查看容器所佔用的系統資源

[root@localhost ~]# docker exec 容器名 容器內執行的命令#容器執行命令
[root@localhost ~]# docker exec -it 容器名 /bin/bash  #登入容器的bash
[root@localhost ~]# docker run -it 容器名 /bin/bash   #進入一個鏡像


Docker 持久存儲

生產環境中使用Docker的過程當中,每每須要對數據進行持久化,或者須要在多個容器之間進行數據共享,這必然涉及容器的數據管理操做,容器管理中主要有兩種方式,數據卷(Data Volumes),數據卷容器(Data Volume Containers),本小結將首先介紹如何在容器內建立數據卷,而且把本地的目錄或文件掛載到容器內的數據卷中.接下來,會介紹如何使用數據卷容器在容器和主機、容器和容器之間共享數據,並實現數據的備份和恢復.

◆數據卷◆

數據卷是一個可供容器使用的特殊目錄,它將主機操做系統目錄直接映射進容器,相似於Linux中的mount操做.

數據卷能夠提供不少有用的特性,以下所示:

● 數據卷能夠在容器之間共享和重用,容器間傳遞數據將變得高效方便.
● 對數據卷內數據的修改會立馬生效,不管是容器內操做仍是本地操做.
● 對數據卷的更新不會影響鏡像,解耦了應用和數據.
● 卷會一直存在,直到沒有容器使用,能夠安全地卸載它.

掛載一個本地目錄做爲數據卷:

1.在本地主機建立一個目錄,並寫入一些數據,來模擬本地數據.

[root@localhost ~]# mkdir /data
[root@localhost ~]# echo "hello mkdirs.com" > /data/index.html

2.開啓容器,並讓容器讀取本地的/data目錄.

[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /data:/usr/local/apache2/htdocs httpd:latest
2882b3edda42fe153a897d3dc21f73835eb57c14019b5e810066c34e0eda4c0c

[參數解釋]

    -d     #以守護進程運行
    -p     #將容器中的80口,映射到本地主機的8080
    --name #指定一個容器名稱
    -v     #上面指的是,將本地/data目錄掛載獲得容器中的/usr/local目錄中.
    -P     #是將容器服務暴露的端口,是自動映射到本地主機的臨時端口.


[root@localhost ~]# curl 127.0.0.1:8080
hello mkdirs.com

◆數據卷容器◆

若是用戶須要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器.數據卷容器也是一個容器,可是它的目的是專門用來提供數據卷供其餘容器掛載.

1.首先,建立一個數據卷容器dbdata,並在容器中建立一個數據卷/dbdata的目錄.

[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata centos:latest
1bc16a7978db7db83a4a107bf2fe1c4c42c4c7fffa7dd92372a6aacb68ccfdd0

[root@localhost ~]# docker exec -it dbdata /bin/bash
[root@1bc16a7978db /]# echo "hello mkdirs.com" > /usr/local/apache2/htdocs/index.html
[root@1bc16a7978db /]# ls -lh /usr/local/apache2/htdocs/index.html
total 4.0K
-rw-r--r-- 1 root root 17 Dec 15 11:37 index.html

[root@1bc16a7978db /]# exit

2.而後,能夠在其餘容器中使用--volumes-from來掛載dbdata容器中的數據卷,例如建立db1和db2兩個容器,並從dbdata容器掛載數據卷.

[root@localhost ~]# docker run -d -p 801:80 --volumes-from dbdata --name db1 httpd:latest
123e75f38947f3294ac77a08bf4380f311d09cc176b576c61499139d75b35db3

[root@localhost ~]# docker run -d -p 802:80 --volumes-from dbdata --name db2 httpd:latest
a4e0f8016af6b89e31a637b1482b0849dcea26e4004298def4abce44c84d6dd6

3.分別訪問兩個不一樣的端口,會發現網頁展示效果是同樣的,也就是說,db1和db2共享了dbdata容器裏指定文件的內容.

[root@localhost ~]# netstat -antp |grep 801
tcp6       0      0 :::801                  :::*                    LISTEN      3998/docker-proxy
[root@localhost ~]# netstat -antp |grep 802
tcp6       0      0 :::802                  :::*                    LISTEN      4157/docker-proxy

[root@localhost ~]# curl 127.0.0.1:801
hello mkdirs.com
[root@localhost ~]# curl 127.0.0.1:802
hello mkdirs.com

使用--volumes-from參數所掛載數據卷的容器自身並不須要保持在運行狀態,若是刪除了掛載的容器(包括dbdata、db1和db2),數據卷並不會被自動刪除.若是要刪除一個數據卷,必須在刪除最後一個還掛載着它的容器時顯式使用docker rm -v命令來指定同時刪除關聯的容器.

◆容器備份恢復◆

數據備份: 使用下面的命令來備份dbdata數據卷容器內的數據卷,並把它備份到當前目錄下.

[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name workers centos:latest tar -czvf /backup/backup.tar /usr/local/apache2/htdocs

tar: Removing leading `/' from member names
/usr/local/apache2/htdocs/
/usr/local/apache2/htdocs/index.html
[root@localhost ~]# ls
backup.tar

這個命令稍微有點複雜,具體分析一下,首先利用centos鏡像建立了一個容器workers.使用--volumes-from dbdata參數來讓workers容器掛載dbdata容器的數據卷(即dbdata數據卷),使用-v $(pwd):/backup參數來掛載本地的當前目錄到workers容器的/backup目錄.workers容器啓動後,使用了tar -czvf/backup/backup.tar /usr/local/apache2/htdocs命令來將/usr/local/apache2/htdocs下內容備份爲容器內的/backup/backup.tar,即宿主主機當前目錄下的backup.tar.

數據恢復: 若是要將數據恢復到一個容器,能夠按照下面的步驟操做.

1.首先建立一個帶有數據卷的容器dbdata_backup.

[root@localhost ~]# docker run -itd -v /usr/local/apache2/htdocs --name dbdata_backup centos:latest /bin/bash
a207d887bfa07cc0e1737efb197950cac3b2c5647391348b1b8fa8b873c58667

2.而後建立另外一個新的容器,掛載dbdata2的容器,並使用untar解壓備份文件到所掛載的容器卷中.

[root@localhost ~]# docker run --volumes-from dbdata_backup -v $(pwd):/backup busybox tar -xzvf /backup/backup.tar

usr/local/apache2/htdocs/
usr/local/apache2/htdocs/index.html

本小結介紹了經過數據卷和數據卷容器對容器內數據進行共享、備份和恢復等操做,經過這些機制,即便容器在運行中出現故障,用戶也沒必要擔憂數據發生丟失,只須要快速地從新建立容器便可.

Docker 端口映射

在實踐中,常常會碰到須要多個服務組件容器共同協做的狀況,這每每須要多個容器之間有可以互相訪問到對方的服務,Docker提供了兩個很方便的功能來知足服務訪問的基本需求:一個是容許映射容器內應用的服務端口到本地宿主主機,另外一個是互聯機制實現多個容器間經過容器名來快速訪問,下面咱們來分別介紹一下吧.

◆從外部訪問容器應用◆

隨機分配端口: 當容器中運行一些網絡應用,要讓外部訪問這些應用時,能夠經過-P-p參數來指定端口映射.當使用-P(大寫的)標記時,Docker會隨機映射一個49000~49900的端口到內部容器開放的網絡端口.

[root@localhost ~]# docker run -d -P --name myweb httpd:latest
afb211e832c16c80822632fe0864838781cee2132993f93cde8c915e242f9df5

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
afb211e832c1        httpd:latest        "httpd-foreground"   3 seconds ago       Up 2 seconds        0.0.0.0:32768->80/tcp   myweb

指定分配端口: 當咱們使用-p(小寫的)能夠指定要映射的端口,而且,在一個指定端口上只能夠綁定一個容器.

[root@localhost ~]# docker run -d -p 8080:80 --name myweb1 httpd:latest
b47f6131dea02c8cd22a75049e97c28cc4bb25bc6bf5cd36645c1ccb4210554e

#上面說明,將容器的80端口,映射到本地的8080

[root@localhost ~]# curl 127.0.0.1.8080
<html><body><h1>It works!</h1></body></html>

◆映射全部接口地址◆

映射指定端口: 格式將容器的80端口映射到本機的80端口.

[root@localhost ~]# docker run -d -p 80:80 --name myweb2 httpd:latest
9c3d0f8ad0bbfa75cc6534f93f959192316125a2776a2c909c71dc9dfb5a8b79

[root@localhost ~]# curl 127.0.0.1
<html><body><h1>It works!</h1></body></html>

映射多個端口: 屢次使用-p標記能夠綁定多個端口.

[root@localhost ~]# docker run -d -p 8080:80 -p 1000:21 --name myweb3 httpd:latest
097ceb68128b58195c990dff720e39ca1717809cc2019d3f31466dee6fd32aec

[root@localhost ~]# netstat -antp |grep "8080"
tcp6       0      0 :::8080                 :::*                    LISTEN      2306/docker-proxy
[root@localhost ~]# netstat -antp |grep "1000"
tcp6       0      0 :::1000                 :::*                    LISTEN      2317/docker-proxy

◆映射到指定地址◆

映射到指定地址的指定端口: 將容器中的80端口映射到本地指定IP地址上去.

[root@localhost ~]# ifconfig ens32:0 192.168.1.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig ens32:0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:0c:29:1e:14:e2  txqueuelen 1000  (Ethernet)

[root@localhost ~]# docker run -d -p 192.168.1.10:8080:80 --name myweb_port httpd:latest
7385faa5d476cb37dd7d201cd0ec939501c9bdb23ec1c8239245c30d2be9abe7

[root@localhost ~]# netstat -antp |grep "8080"
tcp        0      0 192.168.1.10:8080       0.0.0.0:*               LISTEN      2585/docker-proxy

[root@localhost ~]# curl 192.168.1.10:8080
<html><body><h1>It works!</h1></body></html>

映射到指定地址的任意端口: :本地主機會自動分配一個端口,綁定到容器的80口.

[root@localhost ~]# docker run -d -p 192.168.1.10::80 --name myweb_port1 httpd:latest
7a5a105ae0827aaff68864a28b5f9b8a9592af3551f7deca564ea2d6d5a249b3

[root@localhost ~]# netstat -antp |grep "80"
tcp        0      0 192.168.1.10:8080       0.0.0.0:*               LISTEN      2585/docker-proxy

#還可使用udp標記來指定udp端口
[root@localhost ~]# docker run -d -p 192.168.1.10:5000:5000/udp --name myweb_udp httpd:latest
b9cc6333a63109a70a1d2e645b1ff5046988b472dea3bb4f4d010f1478951adf

[root@localhost ~]# netstat -an |grep "5000"
udp        0      0 192.168.1.10:5000       0.0.0.0:*


Docker 容器互聯

容器的互聯(linking)是一種讓多個容器中應用進行快速交互的方式,它會在源和接收容器之間建立鏈接關係,接收容器能夠經過容器名快速訪問到源容器,而不用指定具體的IP地址.

1.使用--link參數可讓容器之間安全地進行交互,下面先建立一個新的MySQL數據庫容器.

[root@localhost ~]# docker run -d --name mysqldb mysql:latest
c1770a69ed29944466ce013c42ac2a0391651c88381e41be05308eab80458390

2.而後建立一個新的web容器,並將它鏈接到MySQL容器,使之可以通訊.

[root@localhost ~]# docker run -d -P --name web --link mysqldb:mysqldb httpd:latest
8b2bfcbbe00f6966c511fdbbbc16e40736ab8d6aa89d229e224f38d12c4643df

此時,mysqldb容器和web容器創建互聯關係,--link參數的格式爲--link name:alias,其中name是要鏈接的容器名稱,alias是這個鏈接的別名.

Docker至關於在兩個互聯的容器之間建立了一個虛機通道,並且不用映射它們的端口到宿主主機上.在啓動mysqldb容器的時候並無使用-p和-P標記,從而避免了暴露數據庫服務端口到外部網絡上.

環境變量傳遞參數

FROM centos:latest
USER root
MAINTAINER lyshark@139.com

ENV USER none
ENV PASD none

在docker run 命令中經過 -e標記來傳遞環境變量,這樣容器運行時就可使用該變量:

docker run -it --env "USER=root" \
               --env "PASD=1233" df434s4s /bin/bash

查看環境變量

[root@localhost ~]# docker inspect centos:v3
[root@localhost ~]# docker exec -it b2f327865a98 env

◆Apache◆

Apache是世界使用排名第一的Web服務器軟件,它能夠運行在幾乎全部普遍使用的計算機平臺上,因爲其跨平臺和安全性被普遍使用,是最流行的Web服務器端軟件之一.它快速、可靠而且可經過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中.

1.拉取鏡像,並在本地建立一個測試頁.

[root@localhost ~]# docker pull httpd:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              2a51bb06dc8b        4 weeks ago         132MB

[root@localhost ~]# mkdir /web
[root@localhost ~]# echo "hello world" > /web/index.html

2.運行http容器,並訪問測試.

[root@localhost ~]# docker run -d -p 8080:80 --name MyWeb -v /web:/usr/local/apache2/htdocs httpd:latest
[root@localhost ~]# curl 127.0.0.1:8080
hello world

◆GitLab◆

Gitlab是一款很是強大的開源源碼管理系統.它支持基於Git的源碼管理、代碼評審、issue跟蹤、活動管理、wiki頁面,持續集成和測試等功能.基於Gitlab,用戶能夠本身搭建一套相似Github的開發協同平臺.

1.安裝並啓動postgresql.

[root@localhost ~]# docker pull sameersbn/postgresql:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab_postgresql -d \
--env 'DB_NAME=gitlab' \
--env 'DB_USER=gitlab' --env 'DB_PASS=gitlab' \
sameersbn/postgresql:latest

2.安裝redis.

[root@localhost ~]# docker pull sameersbn/redis:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/redis        latest              ad607f019b8c        4 months ago        84.8MB
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab_redis -itd sameersbn/redis:latest

3.安裝GitLab.

[root@localhost ~]# docker pull sameersbn/gitlab:latest
[root@localhost ~]# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
sameersbn/gitlab       latest              336fe9c19d92        6 days ago          1.96GB
sameersbn/redis        latest              ad607f019b8c        4 months ago        84.8MB
sameersbn/postgresql   latest              3c0142eb3992        5 months ago        204MB

[root@localhost ~]# docker run --name gitlab -d sameersbn/gitlab \
--link gitlab_postgresql:postgresql --link gitlab_redis:redis \
--publish 10022:22 --publish 10080:80 \
--env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string' \
sameersbn/gitlab:latest

◆WordPress◆

WordPress是使用PHP語言開發的博客平臺,用戶能夠在支持PHP和MySQL數據庫的服務器上架設屬於本身的網站.也能夠把WordPress看成一個內容管理系統(CMS)來使用,WordPress逐步演化成一款內容管理系統軟件,它是使用PHP語言和MySQL數據庫開發的.用戶能夠在支持PHP和MySQL數據庫的服務器上使用本身的博客.

1.首先安裝一個MariaDB數據庫,並配置好初始密碼.

[root@localhost ~]# docker pull mariadb:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mariadb             latest              b468922dbbd7        3 weeks ago         366MB

[root@localhost ~]# docker run --name MyDataBase --env MYSQL_ROOT_PASSWORD=example -d mariadb:latest

2.拉取WordPress鏡像,並運行,將容器內的80口映射到宿主機的8080口上.

[root@localhost ~]# docker pull wordpress:latest
[root@localhost ~]# docker run --name MyWordPress --link MyDataBase:MariaDB -p 8080:80 -d wordpress:latest


Docker 製做鏡像

◆手動製做鏡像◆

1.拉centos:latest 鏡像爲基礎鏡像

[root@localhost ~]# docker pull centos:latest

2.啓動並進入容器內部

[root@localhost ~]# docker run -itd --name lamp --net=host centos:latest
[root@localhost ~]# docker exec -it lamp /bin/bash

3.安裝lamp環境

yum install -y httpd httpd-devel \
               mariadb mariadb-server mysql-devel \
               php php-mysql php-common php-gd \
               php-mbstring php-mcrypt php-devel php-xml

4.寫入一下內容.

echo "hello lyshark" > /var/www/html/index.html
echo "/usr/sbin/apachectl" >> /etc/bashrc

5.保存鏡像,將所退出的容器用commit命令保存爲一個新的my_ssh:centos鏡像.

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS             
ebfae6bcd308        centos:latest       "/bin/bash"         2 minutes ago       Up 2 minutes      

[root@localhost ~]# docker commit ebfae6bcd308 httpd:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              89cb7bb995ba        4 seconds ago       329 MB
docker.io/centos    latest              9f38484d220f        2 months ago        202 MB

6.啓動容器,並添加端口映射10000-->22.其中10000是宿主主機的端口,22是容器的SSH服務監聽端口.

[root@localhost ~]# docker run -itd -p 8080:80 httpd:latest
[root@localhost ~]# docker run -p 10000:22 -itd my_ssh:centos

◆編譯製做鏡像◆

1.首先咱們要解決Docker容器內不得網絡問題.修改DockerDNS,默認沒有文件自行建立便可.

[root@localhost ~]# vim /etc/default/docker
docker_OPTS="--dns 8.8.8.8 --dns 114.114.114.114"

[root@localhost ~]# systemctl restart docker

2.接着在當前目錄建立一個Dockerfile文件,和一個index.html文件,文件內容以下.

vim Dockerfile

FROM centos:latest                          // 指定基礎鏡像
USER root                                   // 以root身份運行
MAINTAINER lyshark@139.com                  // 我的描述信息
ENV PATH $PATH:/usr/local/nginx/sbin/       // 指定環境變量

RUN yum install -y gcc wget pcre pcre-devel zlib zlib-devel openssl openssl-devel
WORKDIR /tmp/
RUN wget http://nginx.org/download/nginx-1.15.12.tar.gz
RUN tar -xzf nginx-1.15.12.tar.gz           // 解壓文件
WORKDIR /tmp/nginx-1.15.12                  // 切換默認目錄

RUN useradd -s /sbin/nologin -M nginx \     // 編譯安裝過程
&& ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
&& make \
&& make install

RUN echo "hello docker" > /usr/local/nginx/html/index.html
# COPY ./index.html /usr/local/nginx/html/      // 拷貝文件
EXPOSE 80                                       // 內部偵聽端口
ENTRYPOINT  /usr/local/nginx/sbin/nginx && tail -f /usr/local/nginx/logs/access.log  // 鏡像入口
#CMD ["/usr/local/nginx/sbin/nginx"]            // 做用同上

3.編譯鏡像文件,並運行鏡像

docker build -t nginx:latest .
docker run -d -p80:80 nginx:latest


Registry 倉庫搭建

Docker Registry工具是Docker內置的私有倉庫解決方案,新版本的Registry基於Golang進行了重構,提供更好的性能和擴展性,而且支持Docker 1.6+的API,很是適合用來構建私有的鏡像註冊服務器.官方倉庫中也提供了Registry的鏡像,所以用戶能夠經過容器運行和源碼安裝兩種方
式來使用Registry.

實驗規劃Docker服務器:192.168.1.5,Docker客戶端:192.168.1.25,請在服務端配置好網橋服務.

◆服務端配置◆

1.將本機配置成網橋,使之可以互相通訊.

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens32
DEVICE=eno16777728
TYPE=Ethernet
BOOTPROTO=static
BRIDGE=br0
NM_CONTROLLED=yes
ONBOOT=yes

[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
DEVICE=br0
BOOTPROTO=static
IPADDR=192.168.1.15
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
ONBOOT=yes

[root@localhost ~]# reboot

2.在服務端192.168.1.5上拉取registry鏡像包.

[root@localhost ~]# docker pull registry:latest
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
registry            latest              2e2f252f3c88        3 months ago        33.3MB

3.在服務端192.168.1.5運行docker私有倉庫成功執行,則咱們的docker私有倉庫搭建成功.

[root@localhost ~]# docker run -itd -p 5000:5000 -v /registry:/var/lib/registry --restart=always --privileged=true --name my_registry registry:latest

◆客戶端上傳◆

1.此處咱們以hello-world爲例,首先要先把它拉取下來.

[root@localhost ~]# docker pull hello-world:latest
[root@localhost ~]# docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB

2.其次給hello-world鏡像打個tag表示新的版本,過程當中指定服務器IP地址.

[root@localhost ~]# docker tag hello-world 192.168.1.5:5000/hello-world:latest
[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
192.168.1.5:5000/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB
docker.io/hello-world          latest              4ab4c602aa5e        3 months ago        1.84 kB

3.因爲docker私有倉庫服務器,默認是基於https傳輸的,因此咱們須要在客戶端192.168.1.25作相關設置,禁止使用https傳輸.

[root@localhost ~]# vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
        "insecure-registries":["192.168.1.5:5000"]
}

4.依次執行下面兩條命令,從新啓動docker讓其加載咱們的配置文件.

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl enable docker

5.執行推送命令,將咱們的hello-world推送到服務器上.

[root@localhost ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
192.168.1.5:5000/hello-world   latest              4ab4c602aa5e        3 months ago        1.84 kB
docker.io/hello-world          latest              4ab4c602aa5e        3 months ago        1.84 kB

[root@localhost ~]# docker push 192.168.1.5:5000/hello-world:latest
The push refers to a repository [192.168.1.5:5000/hello-world]
428c97da766c: Pushed
latest: digest: sha256:1a6fd470b9ce10849be79e99529a88371dff60c60aab424c077007f6979b4812 size: 524

6.在服務器端查看剛剛提交的一個請求.

[root@localhost ~]# ls -l /registry/docker/registry/v2/repositories
total 0
drwxr-xr-x 5 root root 55 Dec 17 20:23 hello-world

[root@localhost ~]# curl http://192.168.1.5:5000/v2/_catalog
{"repositories":["hello-world"]}

◆客戶端拉取◆

1.客戶端修改一下配置文件,指定如下服務器地址.

[root@localhost ~]# cat /etc/docker/daemon.json
{
        "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],
        "insecure-registries":["192.168.1.5:5000"]
}

2.修改Docker配置文件,開啓局域網模式.

在/etc/default/docker添加一行:

DOCKER_OPTS="--insecure-registry 192.168.1.5:5000"

或在/etc/sysconfig/docker文件中添加

OPTIONS='--selinux-enabled --insecure-registry 192.168.1.5:5000'

3.從新啓動Docker,加載配置文件.

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl enable docker

4.經過命令下載測試鏡像.

[root@localhost ~]# docker pull 192.168.1.5:5000/hello-world:latest
相關文章
相關標籤/搜索