Docker自從誕生以來就一直備受追捧,學習Docker是一件很炫酷、很有意思的事情。我希望通過這篇文章能夠讓大家快速地入門Docker,並有一些學習成果來激發自己的學習興趣。我也只是一個在Docker這條巨鯨上玩耍的小孩,全文如有不明確、不正確的地方,還請斧正。
Docker簡介
思想
-
集裝箱
-
標准化
- 運輸方式
- 存儲方式
- API接口
-
隔離
Docker鏡像
所謂鏡像就是程序運行的環境的只讀版本。其包含了所有程序的依賴軟件和配置。構建鏡像的過程有些類似於在常規部署當中裝系統、配環境的過程。注意,鏡像是只讀的,因此在構建鏡像過程中不應該放入需要頻繁修改的文件和配置。比如我們自行開發的應用程序可能需要不斷的升級,則不適合放入鏡像中。
- 鏡像的分層
鏡像是分層的。任何鏡像都是基於一個基本鏡像(如:linux某個版本的內核)逐步構建而成。鏡像是只讀的,在構建自定義鏡像的過程中,每一步安裝和配置都是在上一個鏡像的基礎上疊加一層形成新的鏡像的過程。
- 獲取基礎鏡像
可以從Docker Hub上下載自己需要的基礎鏡像,其中包含大量的官方鏡像。具體使用方法可參照Docker命令一節。
Docker容器
容器是鏡像本身和疊加於鏡像之上的一個讀寫層。應用程序僅能運行於容器之中。應用程序在容器中對系統所做的修改將僅體現在讀寫層,而並不會影響到其下面的鏡像層。值得注意的是,一個容器的存儲空間是受限的。所以並不適合將應用程序的持久化功能放入容器當中。可以通過掛載外部路徑的方式將持久化數據保存在容器以外。
Docker倉庫
Ubuntu上安裝Docker
Docker的基礎是Linux容器技術,因此學習Docker最好是使用Linux。這里推薦64位Ubuntu系統。
在Ubuntu中只需要運行一行命令即可實現Docker的安裝:
sudo apt-get install docker.io
運行完后,可以在終端輸入docker看到下面的界面證明我們安裝成功了(注:提示權限問題就添加sudo,下文同):
從上圖可以看到,Docker的命令並不多,只有三十幾個。例如我們可以輸入docker info
來查看我們安裝的Docker信息:
運行容器
安裝好之后,我們就可以來開始Docker之旅了,
我們現在的Docker還是一個”裸”Docker,上面沒有容器,等一下,什么是容器?所謂容器就是Docker中用來運行應用的,Docker的容器很輕量級,但功能卻強悍的很。也沒有鏡像。鏡像?鏡像簡單理解就是容器的只讀版本,用來方便存儲與交流。此時,我們可以通過官方提供給我們的鏡像來進行學習。比如我們想在Docker中運行一個Ubuntu系統,很簡單,Docker中得pull命令是用來獲取鏡像的,執行下面的命令,就會從官方倉庫里獲取nginx版本的鏡像:
docker pull nginx:14.04
images命令用來查看本機Docker中存在哪些鏡像,運行 docker images
就會看到我們剛才獲取的Ubuntu14.04系統:
現在,我們把剛剛的鏡像運行起來,運行起來的鏡像就叫做容器了,容器是可讀寫的,這樣我們就可以在容器里做很多有意思的事情了。run
命令就是將鏡像運行起來的,運行:
docker run -it ubuntu:14.04
仔細看,你會發現終端交互的用戶名變掉了,說明我們進入到了容器的內部,效果如下:
現在我們所做的任何操作都是針對於目前容器而言的,不會影響到原來的系統,例如,我們在里面安裝下nginx服務器,運行如下命令:
sudo apt-get install -y nginx
完成后執行nginx -v
就會發現我們已經將nginx安裝成功:
將容器轉化為鏡像
在上一小節中,我們已經在容器里安裝好了nginx,接下來我們希望將這個容器內容保存下來,這樣我們下次就無需再次安裝了。這就是Docker中將容器轉換為鏡像的技術。
如果您還在剛剛的安裝了nginx的終端里,執行exit
退出此終端,回到系統本身的終端:
ps
命令可以查看我們當前都運行了哪些容器,加上-a
參數后就表示運行過哪些容器,因為我們剛剛已經退出了安裝nginx的容器,因此我現在想查看它的話,需要使用-a參數,執行如下命令:
docker ps -a
此時,就會顯示出我們剛剛運行的容器,並且Docker會很貼心的隨機給每個容器都起個Names方便標示。效果如下:
commit
命令用來將容器轉化為鏡像,運行下面的命令,我們可以講剛剛的容器轉換為鏡像:
sudo docker commit -m "Added nginx from ubuntu14.04" -a "saymagic" 79c761f627f3 saymagic/ubuntu-nginx:v1
其中,-m
參數用來來指定提交的說明信息;-a
可以指定用戶信息的;79c761f627f3
代表的是容器的id;saymagic/ubuntu-nginx:v1
指定目標鏡像的用戶名、倉庫名和tag 信息。創建成功后會返回這個鏡像的ID信息。注意的是,你一定要將saymagic改為你自己的用戶名。因為下文還會用到此用戶名。
這是我們再次使用docker images
命令就會發現此時多出了一個我們剛剛創建的鏡像:
此時,如果運行 docker run -it saymagic/ubuntu-nginx:v1
就會是一個已經安裝了nginx的容器:
存儲鏡像
我們剛剛已經創建了自己的第一個鏡像,盡管它很簡單,但這已經非常棒了,現在,我們希望它能夠被更多的人使用到,此時,我們就需要將這個鏡像上傳到鏡像倉庫,Docker的官方Docker Hub應該是目前最大的Docker鏡像中心,所以,我們就將我們的鏡像上傳到Docker Hub。
首先,我們需要成為Docker Hub的用戶,前往 https://hub.docker.com/ 進行注冊。需要注意的是,為了方便下面的操作,你需要將你的用戶名設為和我剛剛在上文提到的自定義用戶名相同,例如我的剛剛將鏡像的名字命名為是saymagic/ubuntu-nginx:v2,
所以我的用戶名為saymagic、注冊完成后記住用戶名、密碼、郵箱。
login
默認是用來登陸Docker Hub的,因此,輸入如下命令來嘗試登陸Docker Hub:
docker login
此時,就會輸出交互,讓我們輸入Username、Password、Email,成功輸入我們剛才注冊的信息后就會返回Login Success提示:
運行命令:
docker push saymagic/ubuntu-nginx:v1
這就是我們為什么將剛剛的鏡像命名為saymagic/ubuntu-nginx:v1
的原因,如果你上面步驟都操作正確的正確的話,是會得到下面的內容:
此時,不出意外的話,我們的鏡像已經被上傳到Docker Hub上面了,去Docker Hub上面看看:
果然,我們在Docker Hub上有了我們的第一個鏡像,此時,其它的用戶就可以通過命令docker pull saymagic/ubuntu-nginx
來直接獲取一個安裝了nginx的ubuntu系統了。不信?那就自己實踐一下吧!
Dockerfile使用
通過上面的學習,我們掌握了如何創建鏡像、獲取鏡像、上傳鏡像、運行容器等等內容。有了上面的知識,我們來次實戰。
我們剛剛使用了commit
命令創建了一個安裝nginx的鏡像,但其實Docker創建鏡像的命令還有build,``build
命令可以通過指定一個Dockerfile文件來實現將鏡像創建過程自動化。Dockerfile文件有着特定的編寫規則,但語法都還比較容易理解。這次我們不僅使用Dockerfile文件來創建一個像上文一樣安裝nginx的ubuntu鏡像,DockFile可以很輕松的完成這個問題。首先將新建一個名字為www
的文件夾,文件夾下面可以放一些HTML網頁,
在www
的同級目錄下新建一個名為Dockerfile
的文件,將DockerFile文件改寫如下:
from hub.c.163.com/library/tomcat
MAINTAINER lijiaqi sev7e0@163.com
COPY jpress.war /usr/local/tomcat/webapps
我來整體的解釋下這個Dockerfile文件,第一行是用來聲明我們的鏡像是基於什么構建的,這里我們指定為tomcat,第二行的作用在於告訴別人你的大名。第三行和第四行的RUN
命令用來在容器內部的shell里執行命令。不理解沒關系,因為這都是固定的語法,感興趣可以多看相關內容。此時我們通過build
命令來構建鏡像,運行:
docker build -t="jpress:latest" .
注意,最后的.
表示Dockerfile在當前目錄,也可指定其它目錄。此時,再次運行docker images
就會看到剛剛生成的鏡像:
現在我們就可以運行剛剛的鏡像了,和前面運行稍有不同,此時我們需要對外指定80端口,該行為通過-p參數指定,運行:
docker run -d -p 8888:8080 jpress
此時,終端會卡住,這是正常的,因為Docker的思想是每個容器最好只開一個線程做一件事,此時我們打開了服務器,所以終端卡住也沒關系(當然是有辦法來解決這個問題,但這里不做介紹)。現在我們可以通過瀏覽器訪問localhost查看效果,如果是虛擬主機則需輸入主機ip地址,然后就能看到了如下的頁面:
接下來拉取MySQL鏡像
dcoker pull hub.c.163.com/library/mysql:latest
接下來運行MySQL鏡像
重啟Dcoker服務
到此為止 我的第一個Dcoker化的Java應用 已經完成
寫在最后
Docker能做的事情遠不止這些,更多有意思的事情還請讀者慢慢用心去發現。
引用:http://kb.cnblogs.com/page/536115/