引言html
相信不少技術同窗在開發時都會使用虛擬機,配置好一個開發環境,之後使用時只須要啓動虛擬機就行了。但虛擬機動輒幾個GB,大一點兒的甚至幾百個GB,並且只要其中任意的虛擬機文件損壞,整個虛擬機就沒辦法啓動了。你可能說應該常常備份,這的確是個好主意。但有沒有更好的辦法呢?今天鋼哥就帶着你們瞭解一下Docker(容器),看看它是否比傳統的虛擬機更適合咱們。nginx
什麼是容器?docker
顧名思義,容器就是用來裝東西的。咱們平時喝水的杯子就是容器,只不過杯子這個「容器」是用來裝水的,而咱們這裏的容器裝的是應用程序。瀏覽器
容器有什麼特色?bash
容器與虛擬機有什麼區別?工具
不少同窗會以爲,容器能作的事虛擬機也能作啊,到底有什麼區別呢?性能
虛擬機的缺點測試
容器的優勢ui
下面是 Docker 官網截圖(後文會解釋什麼是 Docker)操作系統
從這張圖咱們能夠看出,傳統的虛擬機很是重,每個虛擬機都是一臺獨立的操做系統。而 Docker 則不一樣,它會重用宿主機已有的系統資源,同時又完美地隔離了不一樣的容器,因此實現起來很是輕,也便於被標準化。有同窗會說,這跟傳統虛擬機也沒什麼本質差異啊,新的虛擬機罷了。其實否則,正是這種「輕量級」的特性,使其有機會成爲新的標準化的應用發佈方式。
上世紀五六十年代出現了集裝箱,看上去也沒什麼技術含量。但正是由於集裝箱是一種標準化的物流方式,從而全球的海陸空運輸、碼頭裝卸等都圍繞着集裝箱造成了整個一個高效的物流體系,最終改變了世界貿易,促成了全球化。
Google的 Kubernetes(K8)如今已經成爲即成容器編排標準了,另外主流的容器編排工具還有 Docker Swarm 以及 Marathon/Mesos 。
什麼是Docker?
終於回到咱們今天的正題了,究竟什麼是 Docker ?Docker 是使用 Go 語言開發的一種 Linux 容器封裝,提供簡單易用的使用接口,是目前最流行的 Linux 容器解決方案。
Docker 的使用場景
Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫爲 CE)和企業版(Enterprise Edition,縮寫爲 EE)。企業版包含了一些收費服務,我的開發者通常用不到。下面的介紹都針對社區版。
Docker 經常使用命令
查看 Docker 版本
docker version
拉取 Docker 鏡像
咱們能夠去 Docker Hub 站點拉取公共的 Docker 鏡像。好比:搜索 nginx ,拉取官方的 nginx 鏡像。
docker pull nginx
查看 Docker 鏡像
docker images
運行 Docker 鏡像
docker run -it -v /Users/kwang/docker:/usr/share/nginx/html/hello -p 80:80 -d nginx:latest
-i以交互模式運行容器,一般與 -t 同時使用; -t爲容器從新分配一個僞輸入終端,一般與 -i 同時使用; -p本機端口:容器端口 映射; -d後臺運行,並返回容器ID; -v能夠將本機目錄映射到容器內。好比這裏我就把我本機的/home/kwang/docker目錄映射到/usr/share/nginx/html/hello/目錄下;
我在/home/kwang/docker/目錄下建立了一個靜態頁面index.html,內容僅僅輸出hello world!。而/usr/share/nginx/html/目錄是容器內的 nginx 網頁根目錄,這樣設置的目的是爲了演示目錄映射。
運行成功後,命令行返回一個 Docker 容器的 ID(這個ID是隨機生成的,因此你看到的確定跟個人不同)。
查看運行中的 Docker 容器
docker ps -a
能夠看到咱們剛纔的鏡像已經成功啓動起來了,而且本機0.0.0.0:80端口已經成功映射到容器裏的80端口了,該容器ID的前幾位是7fcac910ad6a
打開本機瀏覽器,輸入:http://localhost:80,能夠看到nginx已經啓動好了
若是更改瀏覽器地址:http://localhost/hello/,則能夠看到我事先準備好的index.html。
暫停運行中的 Docker 容器
docker stop 7fcac910ad6a
7fcac910ad6a是要暫停的容器ID,能夠看到容器狀態已經變成Exited退出狀態了。
啓動已暫停的 Docker 容器
docker start 7fcac910ad6a
刪除運行中的 Docker 容器
docker rm -f 7fcac910ad6a
-f參數是強行刪除。
以命令行模式進入容器
你能夠用命令行模式進入到容器內部,就好像登陸到一臺新的 Linux 同樣。
docker exec -it 9ca4f91d4027 bash
exec是在運行中的容器中運行一個命令,該命令須要接受兩個參數。第一個是容器ID(這裏是9ca4f91d4027),第二個參數是要執行的命令(這裏是bash)。執行完畢後,咱們就以bash命令行模式進入到了容器內部。
固然,你隨時能夠用exit命令從容器中退出。
從運行中的 Docker 容器生成 Docker 鏡像
docker commit -m "kenny nginx" -a "kenny" 9ca4f91d4027 kenny/nginx:1.0
-m 是說明信息 -a 是用戶信息 kenny/nginx:1.0 分別是鏡像的用戶名、倉庫名和tag信息
能夠看到 Docker 鏡像已成功生成。
基於 Dockerfile 生成 Docker 鏡像
咱們能夠建立一個名爲Dockerfile的文件,編輯內容以下:
# 基於哪一個Docker鏡像生成新鏡像
FROM nginx:latest
# 構建者的基本信息
MAINTAINER kenny.wang
# 在build這個鏡像時執行的操做
RUN apt-get update
# 拷貝本地文件到鏡像中
COPY ./index.html /usr/share/nginx/html/
執行build命令生成 Docker 鏡像。
docker build -t="kenny/nginx:2.0" .
-t 用來指定用戶信息、tag等 . 是當前目錄,用來尋找 Dockerfile
再次用docker images查看,新的鏡像已成功生成。
刪除 Docker 鏡像
docker rmi -f 83a85d2939a2
-f 表示強行刪除 83a85d2939a2 是 docker image id
將 Docker 鏡像保存成 tar 文件
docker save -o kenny_nginx.tar kenny/nginx:2.0
加載 Docker 鏡像
docker load -i kenny_nginx.tar
結語
Docker 是個好東西,以上僅僅是一些經常使用基本操做,但它就像通往新世界的大門,爲大規模集羣化部署提供了可能