Docker - 通往新世界的大門
來自專欄 鋼鋼更新
引言
相信很多技術同學在開發時都會使用虛擬機,配置好一個開發環境,以後使用時只需要啟動虛擬機就好了。但虛擬機動輒幾個GB,大一點兒的甚至幾百個GB,而且只要其中任意的虛擬機文件損壞,整個虛擬機就沒辦法啟動了。你可能說應該經常備份,這的確是個好主意。但有沒有更好的辦法呢?今天鋼哥就帶著大家了解一下Docker(容器),看看它是否比傳統的虛擬機更適合我們。
什麼是容器?
顧名思義,容器就是用來裝東西的。我們平時喝水的杯子就是容器,只不過杯子這個「容器」是用來裝水的,而我們這裡的容器裝的是應用程序。
容器有什麼特點?
- 自包含性:它打包了應用程序的所有依賴,可以直接運行;
- 可移植性:容器可以在幾乎任何地方以相同的方式運行,這就確保了在開發、測試和生產環境都可以擁有完全一樣的運行環境;
- 相互隔離性:多個容器間默認是相互隔離的,即使運行在同一台主機上;
- 輕量級特性:秒級啟動,佔用資源少;
容器與虛擬機有什麼區別?
很多同學會覺得,容器能做的事虛擬機也能做啊,到底有什麼區別呢?
虛擬機
的缺點
- 佔用資源多;
- 冗餘步驟多;
- 啟動慢;
容器
的優點
- 佔用資源少;
- 體積小;
- 啟動快;
下面是 Docker 官網截圖(後文會解釋什麼是 Docker)
從這張圖我們可以看出,傳統的虛擬機非常重,每一個虛擬機都是一台獨立的操作系統。而 Docker 則不同,它會重用宿主機已有的系統資源,同時又完美地隔離了不同的容器,所以實現起來非常輕,也便於被標準化。有同學會說,這跟傳統虛擬機也沒什麼本質差別啊,新的虛擬機罷了。其實不然,正是這種「輕量級」的特性,使其有機會成為新的標準化的應用發布方式。
上世紀五六十年代出現了集裝箱,看上去也沒什麼技術含量。但正是因為集裝箱是一種標準化的物流方式,從而全球的海陸空運輸、碼頭裝卸等都圍繞著集裝箱形成了整個一個高效的物流體系,最終改變了世界貿易,促成了全球化。
Google的 Kubernetes(K8)現在已經成為即成容器編排標準了,另外主流的容器編排工具還有 Docker Swarm 以及 Marathon/Mesos 。
什麼是Docker?
終於回到我們今天的正題了,究竟什麼是 Docker ?Docker 是使用 Go 語言開發的一種 Linux 容器封裝,提供簡單易用的使用介面,是目前最流行的 Linux 容器解決方案。
Docker 的使用場景
- 創建一致的開發、測試、生產環境;
- 創建資源隔離的運行時環境;
- 創建多用戶的平台即服務(PaaS)的基礎設施;
- 創建軟體即服務(SaaS)的應用程序;
- 高性能、超大規模宿主機部署;
如何安裝 Docker
Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫為 CE)和企業版(Enterprise Edition,縮寫為 EE)。企業版包含了一些收費服務,個人開發者一般用不到。下面的介紹都針對社區版。
Docker CE 的安裝非常簡單,具體步驟可參考官方文檔。
Mac Windows Ubuntu Debian CentOSFedora
* 其他 Linux 發行版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 是個好東西,以上僅僅是 Docker 的一些常用基本操作。它就像通往新世界的大門,為大規模集群化部署提供堅實的基礎,後面會再寫一下容器編排的文章,敬請關注!
http://weixin.qq.com/r/Cy91bTrEnWfirX4O93oZ (二維碼自動識別)
推薦閱讀:
※Docker?Rkt?Lxd?細說K8S容器進行時的又一選項Containerd
※CentOS6.5下安裝docker
※怎樣往Docker:Onlyoffice里添加中文字體
※從0到1進行服務docker化
※【技術總結】一起聊聊Kubernetes
TAG:Docker |