docker 練習

Docker 是 2014 年最爲火爆的技術之一,幾乎全部的程序員都據說過它。Docker 是一種「輕量級」容器技術,它幾乎動搖了傳統虛擬化技術的地位,如今國內外已經有愈來愈多的公司開始逐步使用 Docker 來替換現有的虛擬化平臺了。做爲一名 Java 程序員,咱們是時候一塊兒把 Docker 學起來了!java

本文會對虛擬化技術與 Docker 容器技術作一個對比,而後引出一些 Docker 的名詞術語,好比:容器、鏡像等,隨後將使用 Docker 搭建一個 Java Web 運行環境,最後將對本文作一個總結。mysql

咱們先來回顧一下傳統虛擬化技術的體系架構:linux

虛擬化技術

可見,咱們在宿主機的操做系統上,可安裝了多個虛擬機,而在每一個虛擬機中,經過虛擬化技術,實現了一個虛擬操做系統,隨後,就能夠在該虛擬操做系統上,安裝本身所需的應用程序了。這一切看似很是簡單,但其中的技術細節是至關高深莫測的,大神級人物都不必定說得清楚。nginx

凡是使用過虛擬機的同窗,應該都知道,啓動虛擬機就像啓動一臺計算機,初始化過程是至關慢的,咱們須要等好久,才能看到登陸界面。一旦虛擬機啓動之後,就能夠與宿主機創建網絡鏈接,確保虛擬機與宿主機之間是互聯互通的。不一樣的虛擬機之間倒是相互隔離的,也就是說,彼此並不知道對方的存在,但每一個虛擬機佔用的都是宿主機的硬件與網絡資源。程序員

咱們再來對比一下 Docker 技術的體系架構吧:web

Docker 技術

可見,在宿主機的操做系統上,有一個 Docker 服務在運行(或者稱爲「Docker 引擎」),在此服務上,咱們可開啓多個 Docker 容器,而每一個 Docker 容器中可運行本身所需的應用程序,Docker 容器之間也是相互隔離的,一樣地,都是佔用的宿主機的硬件與網絡資源。sql

Docker 容器相對於虛擬機而言,除了在技術實現上徹底不同之外,啓動速度較虛擬機而言有本質的飛躍,啓動一個容器只在眨眼瞬間。不論是虛擬機仍是 Docker 容器,它們都是爲了隔離應用程序的運行環境,節省咱們的硬件資源,爲咱們開發人員提供福利。docker

咱們再來看看 Docker 的 Logo 吧:apache

Docker Logo

很明顯,這是一隻鯨魚,它託着許多集裝箱。咱們能夠把宿主機可當作這隻鯨魚,把相互隔離的容器可當作集裝箱,每一個集裝箱中都包含本身的應用程序。這 Logo 簡直的太形象了!centos

> 須要強調的是,筆者並不是否認虛擬化技術,而是想經過本文讓更多的讀者瞭解如何使用 Docker 技術,讓你們知道除了虛擬化技術之外,還有另外一種替代技術,也能讓應用程序隔離起來。

下面,咱們將結合一個 Java Web 應用的部署過程,來描述如何「烹飪」Docker 這份美味佳餚。您準備好了嗎?咱們如今就開始!

原料

前提條件

首先,您要準備一個 CentOS 的操做系統,虛擬機也行。總之,能夠經過 Linux 客戶端工具訪問到 CentOS 操做系統就行。

須要說明的是,Ubuntu 或其它 Linux 操做系統也能玩 Docker,只不過本文選擇了以 CentOS 爲例,僅此而已。

CentOS 具體要求以下:

  1. 必須是 64 位操做系統
  2. 建議內核在 3.8 以上

經過如下命令查看您的 CentOS 內核:

uname -r 

若是執行以上命令後,輸出的內核版本號低於 3.8,請參考下面的方法來來升級您的 Linux 內核。

對於 CentOS 6.5 而言,內核版本默認是 2.6。首先,可經過如下命令安裝最新內核:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm yum -y --enablerepo=elrepo-kernel install kernel-lt 

隨後,編輯如下配置文件:

vi /etc/grub.conf 

default=1修改成default=0

最後,經過reboot命令重啓操做系統。

重啓後若是不出意外的話,再次查看內核,您的 CentOS 內核將會顯示爲 3.10。

若是到這裏,您和咱們所指望的結果是一致的。恭喜您!下面咱們就一塊兒來安裝 Docker 了。

安裝 Docker

只需經過如下命令便可安裝 Docker 軟件:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm yum -y install docker-io 

可以使用如下命令,查看 Docker 是否安裝成功:

docker version 

若輸出了 Docker 的版本號,則說明安裝成功,咱們下面就能夠開始使用 Docker 了。

可經過如下命令啓動 Docker 服務:

service docker start 

作法

就像曾經安裝軟件同樣,咱們首先須要有一張刻錄了該軟件的光盤,若是您使用的是虛擬光驅,那麼就須要運行一種名爲「鏡像」的文件,經過它來安裝軟件。在 Docker 的世界裏,也有一個名爲「鏡像」的東西,已經安裝咱們所需的操做系統,咱們通常成爲「Docker 鏡像」,本文簡稱「鏡像」。

那麼問題來了,咱們從哪裏下載鏡像呢?

Docker 官網 確實已經提供了全部的鏡像下載地址,惋惜在國內倒是沒法訪問的。幸虧國內好心人提供了一個 Docker 中文網,在該網站上能夠下載咱們所需的 Docker 鏡像。

下載鏡像

咱們不妨仍是以 CentOS 爲例,經過如下步驟,下載一個 CentOS 的鏡像。

首先,訪問 Docker 中文網,在首頁中搜索名爲「centos」的鏡像,在搜索的結果中,有一個「官方鏡像」,它就是咱們所需的。

而後,進入 CentOS 官方鏡像頁面,在「Pull this repository」輸入框中,有一段命令,把它複製下來,在本身的命令行上運行該命令,隨後將當即下載該鏡像。

最後,使用如下命令查看本地全部的鏡像:

docker images 

當下載完成後,您應該會看到:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB 

若是看到以上輸出,說明您可使用「docker.cn/docker/centos」這個鏡像了,或將其稱爲倉庫(Repository),該鏡像有一個名爲「centos6」的標籤(Tag),此外還有一個名爲「25c5298b1a36 」的鏡像 ID(可能您所看到的鏡像 ID 與此處的不一致,那是正常現象,由於這個數字是隨機生成的)。此外,咱們能夠看到該鏡像只有 215.8 MB,很是小巧,而不像虛擬機的鏡像文件那樣龐大。

如今鏡像已經有了,咱們下面就須要使用該鏡像,來啓動容器。

啓動容器

容器是在鏡像的基礎上來運行的,一旦容器啓動了,咱們就能夠登陸到容器中,安裝本身所需的軟件或應用程序。既然鏡像已經下載到本地,那麼如何才能啓動容器呢?

只需使用如下命令便可啓動容器:

docker run -i -t -v /root/software/:/mnt/software/ 25c5298b1a36 /bin/bash 

這條命令比較長,咱們稍微分解一下,其實包含如下三個部分:

docker run <相關參數> <鏡像 ID> <初始命令> 

其中,相關參數包括:

  • -i:表示以「交互模式」運行容器
  • -t:表示容器啓動後會進入其命令行
  • -v:表示須要將本地哪一個目錄掛載到容器中,格式:-v <宿主機目錄>:<容器目錄>

假設咱們的全部安裝程序都放在了宿主機的/root/software/目錄下,如今須要將其掛載到容器的/mnt/software/目錄下。

須要說明的是,不必定要使用「鏡像 ID」,也可使用「倉庫名:標籤名」,例如:docker.cn/docker/centos:centos6。

初始命令表示一旦容器啓動,須要運行的命令,此時使用「/bin/bash」,表示什麼也不作,只需進入命令行便可。

安裝相關軟件

爲了搭建 Java Web 運行環境,咱們須要安裝 JDK 與 Tomcat,下面的過程均在容器內部進行。咱們不妨選擇/opt/目錄做爲安裝目錄,首先須要經過cd /opt/命令進入該目錄。

安裝 JDK

首先,解壓 JDK 程序包:

tar -zxf /mnt/software/jdk-7u67-linux-x64.tar.gz -C . 

而後,重命名 JDK 目錄:

mv jdk1.7.0_67/ jdk/ 

安裝 Tomcat

首先,解壓 Tomcat 程序包:

tar -zxf /mnt/software/apache-tomcat-7.0.55.tar.gz -C . 

而後,重命名 Tomcat 目錄:

mv apache-tomcat-7.0.55/ tomcat/ 

設置環境變量

首先,編輯.bashrc文件

vi ~/.bashrc 

而後,在該文件末尾添加以下配置:

export JAVA_HOME=/opt/jdk export PATH=$PATH:$JAVA_HOME 

最後,須要使用source命令,讓環境變量生效:

source ~/.bashrc 

編寫運行腳本

咱們須要編寫一個運行腳本,當啓動容器時,運行該腳本,啓動 Tomcat,具體過程以下:

首先,建立運行腳本:

vi /root/run.sh 

而後,編輯腳本內容以下:

#!/bin/bash source ~/.bashrc sh /opt/tomcat/bin/catalina.sh run 

注意:這裏必須先加載環境變量,而後使用 Tomcat 的運行腳原本啓動 Tomcat 服務。

最後,爲運行腳本添加執行權限:

chmod u+x /root/run.sh 

退出容器

當以上步驟所有完成後,可以使用exit命令,退出容器。

隨後,可以使用以下命令查看正在運行的容器:

docker ps 

此時,您應該看不到任何正在運行的程序,由於剛纔已經使用exit命令退出的容器,此時容器處於中止狀態,可以使用以下命令查看全部容器:

docker ps -a 

輸出以下內容:

CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS                      PORTS               NAMES
57c312bbaad1 docker.cn/docker/centos:centos6 "/bin/bash" 27 minutes ago Exited (0) 19 seconds ago naughty_goldstine 

記住以上CONTAINER ID(容器 ID),隨後咱們將經過該容器,建立一個可運行 Java Web 的鏡像。

建立 Java Web 鏡像

使用如下命令,根據某個「容器 ID」來建立一個新的「鏡像」:

docker commit 57c312bbaad1 huangyong/javaweb:0.1 

該容器的 ID 是「57c312bbaad1」,所建立的鏡像名是「huangyong/javaweb:0.1」,隨後可以使用鏡像來啓動 Java Web 容器。

啓動 Java Web 容器

有必要首先使用docker images命令,查看當前全部的鏡像:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
huangyong/javaweb         0.1                 fc826a4706af 38 seconds ago 562.8 MB docker.cn/docker/centos centos6 25c5298b1a36 7 weeks ago 215.8 MB 

可見,此時已經看到了最新建立的鏡像「huangyong/javaweb:0.1」,其鏡像 ID 是「fc826a4706af」。正如上面所描述的那樣,咱們能夠經過「鏡像名」或「鏡像 ID」來啓動容器,與上次啓動容器不一樣的是,咱們如今再也不進入容器的命令行,而是直接啓動容器內部的 Tomcat 服務。此時,須要使用如下命令:

docker run -d -p 58080:8080 --name javaweb huangyong/javaweb:0.1 /root/run.sh 

稍做解釋:

  • -d:表示以「守護模式」執行/root/run.sh腳本,此時 Tomcat 控制檯不會出如今輸出終端上。
  • -p:表示宿主機與容器的端口映射,此時將容器內部的 8080 端口映射爲宿主機的 58080 端口,這樣就向外界暴露了 58080 端口,可經過 Docker 網橋來訪問容器內部的 8080 端口了。
  • --name:表示容器名稱,用一個有意義的名稱命名便可。

關於 Docker 網橋的內容,須要補充說明一下。實際上 Docker 在宿主機與容器之間,搭建了一座網絡通訊的橋樑,咱們可經過宿主機 IP 地址與端口號來映射容器內部的 IP 地址與端口號,

在一系列參數後面的是「鏡像名」或「鏡像 ID」,怎麼方便就怎麼來。最後是「初始命令」,它是上面編寫的運行腳本,裏面封裝了加載環境變量並啓動 Tomcat 服務的命令。

當運行以上命令後,會當即輸出一長串「容器 ID」,咱們可經過docker ps命令來查看當前正在運行的容器。

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82f47923f926 huangyong/javaweb:0.1 "/root/run.sh" 4 seconds ago Up 3 seconds 0.0.0.0:58080->8080/tcp javaweb 

品嚐

在瀏覽器中,輸入如下地址,便可訪問 Tomcat 首頁:

http://192.168.65.132:58080/ 

注意:這裏使用的是宿主機的 IP 地址,與對外暴露的端口號 58080,它映射容器內部的端口號 8080。

 

 

List Images

列出本地全部Docker image

  1. # docker images  
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE  
  3. centos              centos6             25c5298b1a36        2 weeks ago         215.8 MB  

 

能夠看到,REPOSITORY是image來源庫,此處是centos

TAG:每一個image有本身的tag,此處是centos6

使用該image啓動Docker Container的時候,名字爲:centos:centos6

IMAGE ID:每一個image有本身獨立的ID

查找新的image

衆多Docker的使用者會建立本身的image,有部分image就會上傳到Docker Hub中,咱們能夠直接在Docker Hub中查找合適的image。

也可使用docker search命令查找image

建立新的image

更新現有的image

交互模式啓動centos:centos6,安裝MySQL

  1. # docker run -t -i centos:centos6 /bin/bash  
  2. bash-4.1#   
  3. bash-4.1# yum install -y mysql mysql-serve  

完成後,exit退出交互模式

 

  1. # docker ps -a  
  2. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES  
  3. 2e9de4d9c350        centos:centos6      /bin/bash           2 minutes ago       Exited (0) 7 seconds ago                           mad_colden     

 

能夠看到剛剛關掉的container ID

  1. # docker commit -m="install mysql" -a="Hongtu Zang" 2e9de4d9c350 centos6:hongtu  
  2. 5f3bca7952cac8900e08b5fac11cdd1a4941803edbb5442593a171fe574ed961  

 

-m Message,描述信息

-a author,image的建立者

 

  1. # docker images  
  2. REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE  
  3. centos6             hongtu              5f3bca7952ca        About a minute ago   320.3 MB  
  4. centos              centos6             25c5298b1a36        2 weeks ago          215.8 MB  

 

能夠看到,多出來一個TAG爲hongtu的image,是咱們剛剛建立好的

從Dockerfile建立image

建立一個Dockerfile

 

  1. # mkdir hongtu  
  2. # cd hongtu/  
  3. # touch Dockerfile  

編輯Dockerfile內容:

  1. # This is a comment  
  2. FROM centos:centos6  
  3. MAINTAINER Hongtu Zang <hongtu_zang@chinacloudly.com>  
  4. RUN yum install -y mysql mysql-server  

 

FROM 基礎image

MAINTAINER 做者

RUN 須要執行的命令,此處是安裝mysql-server

 

成功建立新的image

-t 定義image屬性,屬於 hongtu 用戶,repository 爲 centos, tag指定爲 v2

. 指定在當前目錄尋找 Dockerfile

 

  1. # docker images  
  2. REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE  
  3. hongtu/centos6      v2                  4ee0c1aacb0e        2 minutes ago       323.1 MB  
  4. centos6             hongtu              5f3bca7952ca        31 minutes ago      320.3 MB  
  5. centos              centos6             25c5298b1a36        2 weeks ago         215.8 MB  

 

能夠看到新建的image id 爲 4ee0c1aacb0e

向Docker hub上傳 image

  1. # docker push hongtu/centos6  

刪除本地image

  1. # docker rmi -f hongtu/centos6  

 

-f 強制刪除

相關文章
相關標籤/搜索