先說說什么是鏡像(image),什么是容器吧?
這兩者有點像《奇異博士》里的那個鏡像。鏡像就是虛擬出來的世界, 那么我們?nèi)绾芜M入到鏡像里呢?電影里法師會念咒語,啟動程序,才能進入鏡像。docker也是一樣,啟動image,我們就能進去了,進去后的鏡像世界就稱為容器。
簡單點說,沒啟動的是鏡像,啟動的是容器。
docker是一種容器打包技術(shù),和虛擬機有點類似,區(qū)別不同的是:
1,虛擬機虛擬的是整個計算機,包括CPU,內(nèi)存等等。而docker虛擬的是操作系統(tǒng)的內(nèi)核,(可以理解成:它能讓你在虛擬的操作系統(tǒng)上自由玩耍,和真的操作系統(tǒng)一樣)。
2,docker不只虛擬一個,它可以虛擬N多個,數(shù)字很嚇人,而且N多
個之間互不干>擾,它們之間具有進程級別的隔離,且享受底層資源。
那么,docker怎么玩呢?
1,很簡單,首先要先安裝docker(我這里是在centos下安裝的),因為我用了阿里88的yum源,所以一個命令就搞定yum install docker
2,安裝成功后,需要一個基本image,你才能啟動起來玩,所以這一步需要下載一個基本image??梢栽赿ockerHub下找一個官方的pull下來,我的基本image是centOs。也可以通過命令docker search (你要找的image)。
3,看了很多資料,有兩種方法:1,通過dockerfile來構(gòu)建 2,通過commit 方式來構(gòu)建。本人用的是第2種方法。這里貼下步驟吧:

我的基本image是docker.io/centos。有了image,我就可以啟動它,并且進入到容器里去玩耍。
docker run -i -t -v /web/:/web/ 67591570dd29 /bin/bash(這是啟動命令)
其中,相關(guān)參數(shù)包括:
-i:表示以“交互模式”運行容器
-t:表示容器啟動后會進入其命令行
-v:表示需要將本地哪個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>
假設(shè)我們的所有安裝程序都放在了宿主機的/web/目錄下,現(xiàn)在需要將其掛載到容器的/web/目錄下。
需要說明的是,不一定要使用“鏡像 ID”,也可以使用“倉庫名:標(biāo)簽名”,例如:docker.io/centos:latest
初始命令表示一旦容器啟動,需要運行的命令,此時使用“/bin/bash”,表示什么也不做,只需進入命令行即可。
4,此時就進入容器內(nèi)部了,進去后命令頭就是這樣的 [root@fcd41e085baf /]#
在容器里,你想怎么瘋都可以,就像電影里一樣,玩瘋了都影響不到外面的世界,大不了把這個容器Kill掉。
想在容器里搭建一個開發(fā)環(huán)境怎么辦?剛才啟動image時我把主機里/web下的所有內(nèi)容(jdk,tomcat)都掛載到容器的/web下了。(有人會問,你怎么知道容器里有個web目錄呢)
簡單分析一下:我啟動的image是centos,那么它的目錄結(jié)構(gòu)和centos是一樣的,命令操作方式也是一樣的。當(dāng)然centos根目錄下是沒有web目錄的,掛載到容器時自動生成的。
5,這個時候,容器里就有了jdk,tomcat了(都是以壓縮包的形式傳送的),解壓配置環(huán)境變量:
設(shè)置環(huán)境變量
首先,編輯.bashrc文件
vi ~/.bashrc
然后,在該文件末尾添加如下配置:
export JAVA_HOME-/jdk
export PATH=$PATH:$JAVA_HOME
最后,需要使用source命令,讓環(huán)境變量生效:
source ~/.bashrc
編寫運行腳本
我們需要編寫一個運行腳本,當(dāng)啟動容器時,運行該腳本,啟動 Tomcat,具體過程如下:
首先,創(chuàng)建運行腳本:vi /root/run.sh
然后,編輯腳本內(nèi)容如下:
!/bin/bash
source ~/.bashrc
sh /tomcat/bin/catalina.sh run
注意:這里必須先加載環(huán)境變量,然后使用 Tomcat 的運行腳本來啟動 Tomcat 服務(wù)。
最后,為運行腳本添加執(zhí)行權(quán)限:chmod u+x /root/run.sh
6,exit退出容器,這時就從虛擬世界出來了??梢酝ㄟ^docker ps -a查看容器

7,到了這一步,就可以通過容器(帶有JDK,tomcat的)來構(gòu)建一個新的image,有人問,為什么要再構(gòu)建一個image呢?沒有JDK,tomcat,你的應(yīng)用程序能在容器里自由的玩耍嗎?
docker commit 9169b9b235e2 wjb/javaweb:0.1 這個命令可以把剛才帶有JDK,tomcat的容器構(gòu)建成一個新的image。
9169b9b235e2 是剛才那個容器的ID,wjb/javaweb:0.1是我給這個新的image起的名字。
8,可以通過docker images查看你擁有的所有鏡像,沒出錯的話,應(yīng)該能看到剛才新構(gòu)建的image了。
與上次啟動容器不同的是,我們現(xiàn)在不再進入容器的命令行,而是直接啟動容器內(nèi)部的 Tomcat 服務(wù)。這里有另一種方式:
docker run -d -p 8090:8080 --name javaweb wjb/javaweb:0.1 /root/run.sh
稍作解釋:
-d:表示以“守護模式”執(zhí)行/root/run.sh腳本,此時 Tomcat 控制臺不會出現(xiàn)在輸出終端上。
-p:表示宿主機與容器的端口映射,此時將容器內(nèi)部的 8080 端口映射為宿主機的 8090 端口,這樣就向外界暴露了 8090端口,可通過 Docker 網(wǎng)橋來訪問容器內(nèi)部的 8080 端口了。
--name:表示容器名稱,用一個有意義的名稱命名即可。
關(guān)于 Docker 網(wǎng)橋的內(nèi)容,需要補充說明一下。實際上 Docker 在宿主機與容器之間,搭建了一座網(wǎng)絡(luò)通信的橋梁,我們可通過宿主機 IP 地址與端口號來映射容器內(nèi)部的 IP 地址與端口號,
在一系列參數(shù)后面的是“鏡像名”或“鏡像 ID”,怎么方便就怎么來。最后是“初始命令”,它是上面編寫的運行腳本,里面封裝了加載環(huán)境變量并啟動 Tomcat 服務(wù)的命令。
當(dāng)運行以上命令后,會立即輸出一長串“容器 ID”,我們可通過docker ps命令來查看當(dāng)前正在運行的容器。
9,此時新的鏡像啟動了,并且啟動了容器內(nèi)部的tomcat命令,可以在宿主機輸入http://localhost:8090訪問,沒錯的話,應(yīng)該是tomcat首頁。
再介紹點基本命令:
1,docker stop 你要停止的容器ID
2,docker start 你要啟動的容器ID
3,直接進入容器的命令 docker exec -t -i 你的容器ID /bin/bash
4, 刪除容器 docker rmi 你的容器ID
5,停止所有的容器,才能對image進行刪除操作。docker stop $(docker ps -a -q)