docker 是一個基于linux容器(lxc-linux container)的進階容器引擎,基于go語言開發,
源代碼托管在 github 上, 遵從apache2.0協定開源。docker的目标是實作輕量級的作業系統虛拟化解決方案。
學習docker首先要了解幾個概念:
鏡像—docker的鏡像和常見的系統iso鏡像類似,包含了應用程式的資訊;
容器—容器相當于一個可以運作起來的虛拟機,應用程式運作在容器中,docker運作在“docker”上;
倉庫—倉庫是存放鏡像的地方,有類似git的版本控制,同樣分為公開倉庫(public)和私有倉庫(private)兩種形式;
docker支援大部分的linux發行版,通過使用docker容器,就可以在不同的作業系統,不同的機器上運作自己的應用,不用關心硬體、運作環境之類的配置,應用程式的遷移變得非常簡單。
相比傳統虛拟機技術,docker資源占用少,啟動更快,很大的友善了項目的部署和運維。
docker是在作業系統層面上實作虛拟化,複用本地主機的作業系統,傳統方式是在硬體的基礎上,虛拟出多個作業系統,然後在系統上部署相關的應用。
這張圖檔很形象的說明了docker和vm之類的傳統虛拟化技術的差別:

vs
我使用的是ubuntu 14.04,在這上面安裝docker服務。
14.04版本的ubuntu倉庫中已經支援docker的安裝,可以使用快速安裝的方式,
sudo apt-get update
sudo apt-get install docker.io
service docker.io status
service docker.io start
這種方式安裝通常不是docker的最新版本,
如果想要安裝最新版本,可以去docker官網下載下傳安裝。
建構docker鏡像的一般過程是首先建立一個容器,
并在容器裡修改鏡像,配置相關環境等,最後将修改送出為一個新鏡像。
下載下傳用于制作鏡像的系統,
sudo docker pull index.alauda.cn/alauda/ubuntu
這裡我從靈雀雲的鏡像中心拉取。
或者也可以直接從docker的鏡像中心拉取,不過貌似非常慢:
sudo docker pull ubuntu
下載下傳成功後,使用images指令檢視本地的鏡像清單:
docker images
這裡需要注意,使用docker的時候請添加sudo。
預設安裝完 docker 後,每次執行 docker 都需要運作 sudo 指令,如果不跟 sudo,直接執行 docker 指令會報一些權限錯誤。
鏡像下載下傳到本地以後,就可以使用docker運作,
通過下面的指令參數啟動容器,
docker run <相關參數> <鏡像 id> <初始指令>
-i:表示以“互動模式”運作容器
-t:表示容器啟動後會進入其指令行
-v:表示需要将本地哪個目錄挂載到容器中,
格式:-v <主控端目錄>:<容器目錄>
我的相關程式都在目前機器的/data/software/目錄下,并且想把它挂載到容器的相同目錄下:
sudo docker run -i -t -v /data/software/:/data/software/ ae983d5e88ce /bin/bash
“鏡像 id”,也可以使用“倉庫名:标簽名”,例如:index.alauda.cn/alauda/ubuntu :latest。
上面的指令,可以使用指定的鏡像運作一個shell,如果想退出該終端,可以使用exit指令,
或者依次按下ctrl -p+ctrl -q,即可切換到主控端器。不過這種方式,容器依然在後天運作。
啟動終端後,進入/data/software/目錄,可以發現目前機器目錄下的檔案已經同步過來:
安裝相關的jdk等程式,這裡全部安裝到/data/目錄:
tar -zxvf jdk-7u25-linux-x64.tar.gz -c /data/
mv jdk1.7.0_25 jdk
unzip apache-tomcat-7.0.54.zip -d /data/
mv apache-tomcat-7.0.54 tomcat
配置環境變量
vi /etc/profile
添加下面的配置:
#set java environment
export java_home=/data/jdk
export jre_home=${java_home}/jre
export classpath=.:javahome/lib:javahome/lib:{jre_home}/lib
export path=javahome/bin:javahome/bin:path
export catalina_home=/data/tomcat
export catalina_base=/data/tomcat
儲存并退出,設定立即生效:
source /etc/profile
啟動tomcat時必須通過tomcathome/bin/catalina.sh實作,不能使用tomcathome/bin/catalina.sh實作,不能使用tomcat_home/bin/startup.sh啟動,否則腳本執行後容器會馬上退出。
vi /data/start.sh
添加以下内容:
#!/bin/bash
# export environment variable
# start tomcat
bash /data/tomcat/bin/catalina.sh run
添加可執行權限:
chmod u+x /data/start.sh
使用docker建構鏡像的兩種方法:
使用docker commit 指令,更直覺一些;
使用docker build指令和dockerfile檔案,可以模闆化鏡像建構過程;
這裡使用docker commit的方式建立鏡像。
檢視容器清單:
sudo docker ps -a
1
2
<code>container id image command created status ports names</code>
<code>39b2cf60a4c1 ae983d5e88ce:latest </code><code>"/bin/bash"</code> <code>5 hours ago exited (0) 9 seconds ago dreamy_euclid</code>
送出一個新的鏡像:
sudo docker commit 39b2cf60a4c1 bingyue/docdemo
如果有docker賬号,可以将鏡像推送到docker hub或資金的私有registry中。
現在檢視本地的docker鏡像,
sudo docker images
可以看到本地倉庫已經有剛剛建立的docker鏡像。
3
<code>repository tag image id created virtual size</code>
<code>bingyue/docdemo latest bfc7ed316d42 about a minute ago 528.2 mb</code>
<code>index.alauda.cn/alauda/ubuntu latest ae983d5e88ce 10 months ago 255.1 mb</code>
docker inspect可以檢視新建立的鏡像的詳細資訊:
sudo docker inspect bingyue/docdemo
docker run -d -p 18080:8080 --name docdemo bingyue/docdemo /data/start.sh
-p:表示主控端與容器的端口映射,此時将容器内部的 8080 端口映射為主控端的 18080 端口,
這樣就向外界暴露了 18080 端口,可通過 docker 網橋來通路容器内部的 8080 端口了。
檢視背景是否啟動成功:
docker ps
測試通路:
如果有docker倉庫的賬戶,可以将本地建立的鏡像送出至倉庫。
到這一步,差不多完成了docker的初體驗,一步一步部署下來,docker相比傳統的虛拟機技術要簡單了很多,真正複雜的應該是背後的虛拟化技術,還需要繼續深入學習。
# 下載下傳一個ubuntu鏡像
# 使用ubuntu運作一個互動性的shell
sudo docker run -i -t ubuntu /bin/bash
#docker ps指令
sudo docker ps #列出目前所有正在運作的container
sudo docker ps -l #列出最近一次啟動的,且正在運作的container
sudo docker ps -a #列出所有的container
#port指令
docker run -p 80:8080 <image> <cmd> #映射容器的8080端口到主控端的80端口
#删除容器指令
sudo docker rm `sudo docker ps -a -q`#删除所有容器
sudo docker rm $container_id#删除容器id為container_id的容器
#其他指令快速參考:
sudo docker images #檢視本地鏡像
sudo docker attach $container_id #啟動一個已存在的docker執行個體
sudo docker stop $container_id #停止docker執行個體
sudo docker logs $container_id #檢視docker執行個體運作日志,確定正常運作
sudo docker inspect $container_id #檢視container的執行個體屬性,比如ip等等