- 互聯網企業容器技術實踐
- 龔曦主編
- 2284字
- 2019-07-25 11:39:33
1.1 容器簡介與Docker容器引擎
??1.1.1 什么是容器
容器又稱為容器虛擬化技術,從名稱可以看出容器也是一種虛擬化技術。容器是基于操作系統的輕量級的虛擬化技術。容器的英文名稱是 Container,該單詞的另一個意思是集裝箱,其實容器和集裝箱確實有很多相似的地方。下面就通過集裝箱這個例子來講一下什么是容器。如果把容器比作集裝箱,容器上面運行的應用服務比作集裝箱里面的貨物,則運載貨物的輪船就是物理機。集裝箱可以將不同的貨物隔離開來,只不過容器隔離的是應用服務罷了。
其實容器就是將軟件打包到一個平臺中,用來開發、發布和部署的一種工具。容器鏡像是一個輕量級、獨立、可執行的軟件包,包含運行它所需的所有內容:代碼、運行時、系統工具、系統庫、設置等。不管環境如何,容器化軟件在Linux系統和Windows系統平臺上都可以運行相同的應用程序。容器可以將軟件與其周圍環境隔離開來,解決開發環境和安裝環境之間存在差異的問題,還有助于減少團隊之間在同一基礎架構上運行不同軟件的沖突。
??1.1.2 Docker容器
一說到容器,幾乎立馬想到的就是Docker了,Docker似乎已經成為容器的代名詞,導致現在很多人以為容器就是Docker。其實Docker只是容器的其中一種而已,它將容器技術發揚光大。
1.Docker的由來
2013年,dotCloud公司決定開源他們內部使用的容器技術,這就是Docker的由來。之后,Docker很快在各大論壇火爆起來。到了2013年10月,dotCloud公司甚至直接更名為Docker股份有限公司,工作重心也轉向全面圍繞Docker來開發,可見Docker的火爆程度與崛起速度。Docker 之所以能迅速崛起,是因為它解決了傳統方式的各種問題,在很大程度上提高了軟件的生產效率,這是很多用戶在生產環境中真實遇到的痛點。
2.Docker是什么
其實Docker并不能算一種新技術,因為Docker是基于LXC(Linux Containers),并使用了一些已經存在了很長的時間并且被廣泛應用的技術來實現的。Docker 主要是將這些復雜、瑣碎的底層技術服務化了。之所以能夠獲得如此巨大的成功,受到如此多用戶的青睞,因為它能夠更加了解用戶的需求,且足夠的簡單方便。下面演示Docker的使用,運行Docker的最小鏡像hello-world。如果使用的系統環境已經安裝了Docker,則可以直接在Root環境下執行以下命令:
docker run hello-world
其實這個鏡像并沒有實際意義,只是Docker的最小鏡像,最大的作用是用來測試Docker服務環境是否正常,在一切正常的情況下,首行會打印出“Hello from Docker!”的字符串。
3.Docker的一般操作
本節主要講解Docker的一些常用操作,讀者可以跟著動手操作。
既然要進行操作,首先需要具備Docker環境,下面介紹Docker的安裝方法。
(1)安裝Docker
Docker安裝起來很方便,其主要是安裝在Linux系統環境中,因為Docker的實現是依賴Linux內核的。當然,Docker也有Windows和Mac OS版本,但實質是安裝了一個Linux虛擬機,所以為了獲得最好的體驗,還是需要Linux環境的。本書在CentOS環境中演示:
(2)拉取鏡像
Docker通過docker pull命令拉取鏡像,命令格式如下:
如上所示,Docker倉庫的默認地址是Docker Hub,當沒有明確指出時,就會從Docker Hub中拉取鏡像。同時,倉庫名是兩段式名稱,采用<用戶名>/<鏡像名>這種格式,當沒有給出用戶名的時候,默認為library,即為官方鏡像。下面拉取一個ubuntu:16.04鏡像。
在沒有指明Docker鏡像倉庫地址的情況下,會將標簽為16.04的鏡像從Docker Hub中的官方鏡像倉庫library/ubuntu中拉取到本地。有了Docker鏡像,就可以通過鏡像運行容器。
(3)鏡像的保存和加載
有時會由于環境的原因,導致有些機器無法拉取鏡像,可以使用Docker鏡像的保存加載機制,把鏡像復制到任意的服務器上。
首先通過docker save命令將一個本地存在的鏡像打包成一個tar文件,如下所示。
從上面的代碼可以看到,已經將本地的ubuntu:16.04鏡像打包成ubuntu-1604.tar并保存在本地,接下來可以把 ubuntu-1604.tar 打包文件復制到另外一臺服務器上,并通過 docker load將ubuntu:16.04鏡像加載到這臺服務器上,如下所示。
(4)容器的導入和導出
容器的導入和導出與鏡像的保存和加載有很多相似之處,不同之處在于一個用于操作容器,另一個用于操作鏡像。
首先通過docker export命令將一個本地存在的容器打包成一個tar文件,如下所示。
如上所示,已將本地的容器tender_fermat打包成ubuntu-export-1604.tar文件,接著可以把該文件復制到其他的服務器上,然后在服務器上通過 import 命令將容器快照導入為鏡像,如下所示。
(5)啟動Docker容器
啟動Docker容器有兩種類型,一種是通過鏡像創建并啟動一個新的容器,另一種是啟動一個處于停止狀態的容器。可以通過docker run命令創建并啟動一個容器,如下所示。
如上啟動了一個Nginx服務器的容器,下面重新打開一個終端界面,通過docker ps命令查看本地啟動的容器:
由上面可以看出本地啟動了一個Nginx服務器容器。要啟動一個處于停止狀態的容器,可以使用docker start命令。先用Ctrl+C組合鍵終止剛啟動的容器,如下所示。
可以通過docker ps-a命令查看本地所有的容器:
可以發現容器已經終止,下面用docker start命令啟動該容器,如下所示。
需要注意的是,在大多數情況下啟動的容器需要使其在后臺運行,可以通過當docker run啟動容器時,為其添加一個-d 參數來實現。這樣容器啟動后就不會占用一個終端,生命周期不會受到該終端生命周期的影響,同時也就無法通過Ctrl+C組合鍵終止容器進程了。
(6)進入容器
因為大多數情況都是通過-d 參數使容器在后臺啟動的,所以需要進入容器中才能進行一些操作。Docker進入容器可以通過docker attach 命令或 docker exec 命令兩種方式,通常推薦使用docker exec的方式。下面通過docker attach的方式進入,如下所示。
可以看出,通過 docker attach 進入容器后退出時,會導致容器終止。因為當使用 docker attach命令進入容器時,執行的是容器自帶的命令,把容器默認進程殺掉,容器自然就退出了。下面使用docker exec方式進入容器:
通過docker exec進入容器并退出,對容器不會產生影響。在如上命令中,其中的-i參數指打開容器的標準輸入,-t:告訴Docker為容器建立一個命令行終端,而/bin/bash則表示進入容器中要執行的命令。
(7)終止容器
Docker可以使用docker stop命令終止一個正在運行的容器,如下所示。
(8)刪除容器
Docker可以通過docker rm命令刪除一個已經終止的容器,如下所示。