1. 為什么引入Docker
Docker現(xiàn)在大受追捧,風光無二。Docker是一個輕量級的容器技術,類似于虛擬機技術(xen、kvm、vmware、virtual)。Docker是直接運行在當前操作系統(tǒng)(Linux)之上,而不是運行在虛擬機中,但是也實現(xiàn)了虛擬機技術的資源隔離,性能遠遠高于虛擬機技術。
Docker支持將軟件編譯成一個鏡像,在這個鏡像里做好對軟件的各項配置,然后發(fā)布這個鏡像,使用者可以運行這個鏡像,運行中的鏡像稱之為容器,容器的啟動時非常快的,一般都是以秒為單位。
目前各大主流云計算平臺都支持Docker容器技術,包括阿里云、百度云平臺(資源隔離通過Docker實現(xiàn))、Cloud Foundry(和Spring一家公司的,目前最成熟也最穩(wěn)定)、Heroku等等;連微軟也實現(xiàn)了在Windows Server及其云平臺Azure上支持Docker,這樣看來Docker大有統(tǒng)一云計算的趨勢。
這里的云計算平臺一般指的是PaaS(平臺即服務),它是一個這樣的云計算:平臺提供了存儲、數據庫、網絡、負載均衡、自動擴展等功能,你只需將你的程序交給云計算平臺就可以了。你的程序可以是用不同的編程語言開發(fā)的,而使用的Docker的云計算平臺就是用Docker來實現(xiàn)以上功能及不同程序之間隔離的。
目前主流的軟件以及非主流的軟件大部分都有人將其封裝成Docker鏡像,我們只需下載Docker鏡像,然后運行鏡像就可以快速獲得已配置好并且可運行的軟件。
Docker并不是為開發(fā)測試方便而提供的小工具,而是可以用于實際生產環(huán)境的一種極好的部署方式。
2. Docker的安裝
2.1 Linux下安裝
CentOS安裝命令:
sudo yum update
sudo yum install docker
ubuntu安裝命令:
sudo apt-get update
sudo apt-get docker.io
2.2 Windows下安裝(略)
3. Docker常用命令及參數
基于Docker的鏡像是可以自己編譯的。通常情況下,Docker的鏡像都是放置在Docker的官網上,地址是:https://registry.hub.docker.com
3.1 Docker鏡像命令

(1) Docker鏡像檢索
除了可以在https://registry.hub.docker.com網站檢索Docker鏡像外,還可以使用下面的命令進行檢索:
docker search 鏡像名
例如檢索Redis,輸入 docker search redis
(2) 鏡像下載
docker pull 鏡像名
例如下載Redis,輸入 docker pull redis
(3) 鏡像列表
查看本地鏡像列表:
docker images

其中REPOSITORY是鏡像名,TAG是版本名,IMAGE ID是當前鏡像的唯一標識,CREATE是當前鏡像的創(chuàng)建時間,SIZE是當前鏡像的大小.
(4)鏡像刪除
刪除指定鏡像通過以下命令:
docker rmi image-id|image名稱
或者:docker rm image image-id|image名稱
image-id是鏡像的id
示例:dcoker rmi ubuntu:16.04 根據鏡像名稱刪除鏡像
刪除所有的鏡像:
docker rmi ${docker image -q}
3.2 Docker 容器命令

(1)容器的基本操作
最簡單的運行鏡像為容器的命令如下:
docker run --name container-name -d image-name
運行一個容器只要通過docker run命令即可實現(xiàn),其中,--name代表為容器起的名稱,-d表示detached,意味著執(zhí)行這段命令后控制臺將不會被阻礙,可以繼續(xù)輸入命令操作;最后的image-name是要使用哪個鏡像來運行容器.
例如來運行一個Redis容器:
docker run --name redis-test -d redis
Docker會為我們的容器生成一個唯一的標識
(2)容器列表
通過下面命令,查看運行中容器列表:
docker ps
如圖所示:

其中
CONTAINER_ID是啟動容器的時候生成的ID,IMAGE是該容器使用的鏡像,COMMOND是容器啟動的時候調用的命令,CREATE是容器的創(chuàng)建時間;STATUS是當前容器的啟動狀態(tài);PORTS是容器系統(tǒng)所使用的端口號,Redis默認使用的6379端口,NAMES是剛才在啟動容器的時候給容器指定的名稱(--name后面的),在這里可以看到我們剛剛啟動的redis容器--redis-test通過下面的命令可以查看運行中和停止狀態(tài)的容器:
docker ps -a
(3)停止和啟動容器
- 停止容器
停止容器可以使用下面的命令:
docker stop container-name/container-id
也就是說可以通過指定容器名或者容器的id來停止容器
以停止上面的redis為例:
docker stop redis-test
或者
docker stop 7048692cb777
- 啟動容器
啟動容器通過以下的命令:
docker start container-name/container-id
再次啟動我們剛剛停止的redis容器
docker start redis-test
注意:運行鏡像為容器的命令和運行停止的容器的命令,一個是docker run,一個是docker start
- 端口映射
Docker容器中運行的軟件所使用的端口,在本機和本機的局域網是不能訪問的,所以我們就需要將Docker容器中的端口映射到當前主機的端口上,這樣就可以在本機和本機所在的局域網就能夠訪問該軟件了.
Dokcer的端口映射是通過一個-p參數來實現(xiàn)的。我們以剛才的redis為例,映射容器的6379端口到本機(docker的宿主機)的6378端口,命令如下:
docker run -d -p 6378:6379 --name port-redis redis
-d指的是以守護態(tài)運行,因為很多情況下需要讓容器在后臺運行而不是直接把執(zhí)行命令的結果輸出在當前的宿主機下(控制臺)
-p指定端口
--name指定容器名
- 刪除容器
刪除單個容器:
docker rm container-id
刪除所有容器的命令:
docker rm ${docker ps -a -q}
- 容器日志
查看當前容器日志的命令:
docker
- 登錄容器(進入容器)
運行中的容器其實是一個功能完備的Linux操作系統(tǒng),所以我們可以像常規(guī)的的操作系統(tǒng)一樣登錄并訪問容器。
我們可以使用下面的命令,登錄訪問當前運行中的容器,登錄后我們可以在容器中進行常規(guī)的Linux系統(tǒng)操作指令,還可以使用exit命令退出登錄
docker exec -it container-id/container-name bash
-it:這是兩個命令,i指的是交互式操作,-t指的是終端,這里我們是進入bash執(zhí)行一些命令,并查看返回結果,因此我們需要交互式終端.(可以簡單理解為:主線程是阻塞式的(相當于java中的main線程,而工作線程相當于我們new了一個Thread并start,工作線程的運行我們是交互不了的,而這里的交互式終端就是運行了這個容器))。注意 docker run 是啟動一個鏡像為容器,對于同一個image,每次docker run的時候啟動的是不同的容器。
示例:
doker run -it -rm ubuntu:16.04 bash
以交互式終端的方式運行名為ubuntu:16.04的鏡像為一個容器,-rm表示當退出容器的時候,刪除該容器, bash指的是我們希望有個交互式的shell,因此用的是bash
拓展:鏡像相當于java中的類,而容器相當于創(chuàng)建出來的對象,容器啟動以后,相當于在內存中創(chuàng)建了一個對象,當容器退出的時候,這個對象的狀態(tài)變了,并且可以發(fā)現(xiàn)容器運行時和停止時他們的container_id是不一樣的.有的時候為了節(jié)約空間,在容器停止的時候就將次容器刪除掉,所以就會在run的時候加上-rm的指令
參考:https://www.funtl.com/zh/docker 強烈推薦
參考:《Spring Boot實戰(zhàn)》,感興趣的可以閱讀下這本書,強烈推薦。