探索學習:網紅容器引擎Docker

近兩年容器技術成爲開源社區中的網紅,輕便易用,集開發、持續集成、交付和運行於一體。本文將按照如下結構與大家一起進行探索和學習。

1. Docker的起源

Docker容器引擎由Docker Inc(前身是dotCloud)開發並開源,2014年6月9日,Docker 1.0版本正式發佈,基於 Go 語言並遵從 Apache2.0 協議開源。
Docker 允許開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的 Linux 機器上,也可以實現虛擬化。容器使用沙箱機制,相互之間不會有任何接,且性能開銷極低。
Docker從17.03 版本之後分爲CE(Community Edition: 社區版)和 EE(Enterprise Edition: 企業版),本文的探索中使用CE版本進行演示。

2. Docker虛擬容器的優勢

早在Docker出現的幾十年間,虛擬機就盛行一時,在我上本科的時候使用最多的當屬VMWare和VirtualBox,但是這類虛擬機運行時耗費極大的內存空間,還記得當年夏天每次開啓VM之後,電腦風扇就開始呼呼大叫:我受不了了…
那麼同樣是虛擬化容器,Docker與他們有何區別呢?
在這裏插入圖片描述
上圖(此圖非原創)表示的是傳統虛擬機的運行結構,雖然每臺機器可以創建很多虛擬系統,但是這樣會佔用極大的空間,每次運行起來就像一輛綠皮火車,等的人心碎,吵的人暴躁。而Docker容器技術恰好沒有這些缺點,它不需要虛擬出整個操作系統,只需要虛擬一個小規模的環境,是一種輕量級的虛擬機。
Docker創建的容器啓動時間很快,幾秒鐘就能完成。而且,它對資源的利用率很高(一臺主機可以同時運行幾千個Docker容器)。此外,它佔的空間很小,虛擬機一般要幾GB到幾十GB的空間,而容器只需要MB級甚至KB級。
Docker容器包含三個關鍵概念:
鏡像(Image):是一個 root 文件系統。比如官方鏡像 ubuntu就包含了完整的一套最小系統的 root 文件系統。
容器(Container):鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義-類,容器是鏡像運行時的實體-對象。容器可以被創建、啓動、停止、刪除、暫停等。
倉庫(Repository):倉庫可看作一個代碼控制中心,用來保存鏡像。

3. Docker基操

使用Docker創建容器,需要熟悉常用的命令。
Docker鏡像管理命令大全:

查看鏡像列表:
docker images
docker image ls
​
導出鏡像:
docker image save centos > docker-centos6.9.tar.gz
導入鏡像:
docker image load -i docker-centos6.9.tar.gz
刪除鏡像:
docker image rm centos:latest
docker image rm 578c3
​
搜索鏡像   docker search + 鏡像名字
​
給源中鏡像打標籤:
​
docker tag nginx:latest 10.0.0.11:80/nginx:latest
​
推送指定鏡像到docker鏡像源服務器
​
docker push 10.0.0.11:80/nginx:latest
​
獲取鏡像 (下載)  docker pull image_name
​
官方pull  docker pull centos:6.8(沒有指定版本,默認會下載最新版) 私有倉庫pull  docker pull daocloud.io/huangzhichong/alpine-cn:latest
​
docker history image_name   顯示一個鏡像的歷史
​
docker build -t <image-name> .   *(點一定不能去掉)#使用當前目錄下的Dockerfile構建鏡像

Docker容器管理命令大全:

docker -v         #查看版本
​
docker info     #查看docker信息
​
運行容器
docker run --name 容器名 -d -p 3306:3306 mysql  docker 啓動容器
docker run image_name
docker run -d -p 80:80 nginx:latest
run(創建並運行一個容器) 
-d 放在後臺 
-p 端口映射 :docker的容器端口
-P 隨機分配端口
-v 源地址(宿主機):目標地址(容器)
docker run -it --name centos6 centos:6.9 /bin/bash 
-it 分配交互式的終端 
--name 指定容器的名字 
/bin/sh覆蓋容器的初始命令
​
docker run image_name  啓動容器***
​
docker stop container_id  停止容器
​
docker kill container_name   殺死容器
​
docker ps (-a -l -q)    查看容器列表
​
docker container rm  'docker ps -a -q'   刪除所有容器
​
docker rm -f  'docker ps -a -q`      #刪除所有容器
​
docker ps -a  #查看容器列表
​
docker exec -it 77cd6bef4dc9 /bin/bash   #進容器
​
docker start/stop container-id||container-name 開啓/停止 指定容器id或者容器名稱的容器
​
docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest
​
docker logs container-name/container-id     #查看容器日誌
​
docker ps | grep ${CONTAINER_ID}    #查看容器狀態
​
docker commit ID new_image_name     #鏡像打包 (保存對容器的修改)
docker commit -m="提交的描述信息" -a="作者" 容器id  要創建的目標鏡像名:[標籤名]
​
docker inspect <id/container_name>   #查看容器內部詳情細節
​
docker login #登錄
​
Ctrl+P+Q     #退出而不關閉容器

本文中我們簡單進行幾個命令的示範:

docker run ubuntu:15.10 /bin/echo "Hello world"

在這裏插入圖片描述
可以看到,當輸入上述命令後,Docker會先去本體的鏡像倉庫尋找ubuntu 15.10鏡像源,當發現沒有時會出現圖中的情況,先進行簡單的下載,然後再執行後面的命令,相比於傳統虛擬機是不是方便太多了。

docker images

在這裏插入圖片描述
完成第一條命令的執行後,再運行上述命令,就可以看到在本地倉庫中已經有了一個ubuntu 15.10的鏡像源。
接下來直接通過命令行的方式進行展示:

appledeair-5:var apple$ docker pull httpd 
Using default tag: latest
latest: Pulling from library/httpd
5b54d594fba7: Pull complete 
4b53bced9ee8: Pull complete 
33abd7401e3d: Pull complete 
8fb831f2b4d7: Pull complete 
f26db3b1c783: Pull complete 
Digest: sha256:e6c5f0e078ed56afccb343ad81c8eceb1bdc335206b1f3bf695362b74cf2ebaf
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest

上述命令完成了httpd鏡像的下載。

[appledeair-5:var apple$ docker run -i -t ubuntu:15.10 /bin/bash
root@cfe950dd0196:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

上面這條命令通過交互式的方式列出了ubuntu 15.10根目錄下的文件。

[appledeair-5:var apple$ docker run -itd ubuntu:15.10 /bin/bash
17433e89aac4e85a1457bccd7218046020854df9db919ec2750e4e421e1e24b3
appledeair-5:var apple$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
17433e89aac4        ubuntu:15.10        "/bin/bash"         7 seconds ago       Up 6 seconds                            bold_fermat

上述命令講一個容器置於後臺運行,然後通過ps命令查看其運行狀態。

appledeair-5:var apple$ docker stop 17433e89aac4
17433e89aac4
appledeair-5:var apple$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
appledeair-5:var apple$ 

上述命令通過容器ID關閉後臺運行的容器,然後再次查看時已經沒有運行的容器了。

到此爲止,Docker初探索的旅程要畫上句號了,其實Docker還有很多值得探討的用法和命令,希望以後有機會能一起學習和討論。

如果覺得本文寫的還不錯的夥伴,可以給個關注一起交流進步,如果有在找工作且對阿里感興趣的夥伴,也可以發簡歷給我進行內推:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章