1. 程式人生 > >Docker學習總結(17)——學會使用Dockerfile

Docker學習總結(17)——學會使用Dockerfile

Docker、Dockerfile、Docker映象、容器這些都是什麼鳥?

老生常談,再再再……普及一下:

  • Docker: 最早是dotCloud公司出品的一套容器管理工具,但後來Docker慢慢火起來了,連公司名字都從dotCloud改成Docker。
  • Dockerfile: 它是Docker映象的描述檔案,可以理解成火箭發射的A、B、C、D……的步驟。
  • Docker映象: 通過Dockerfile做出來的,包含作業系統基礎檔案和軟體執行環境,它使用分層的儲存方式。
  • 容器: 是執行起來的映象,簡單理解,Docker映象相當於程式,容器相當於程序。

講了這麼多,大家可能已經意識到了,想玩轉Docker必須先要搞定Docker映象,映象又來自於Dockerfile

 ,因此本文從Dockerfile編寫開始,與您分享Docker映象的製作過程,裡面有 經驗 ,有 技巧 ,還有 彩蛋 ~!

如何通過Dockerfile快速構建映象

接下來,我們通過構建一個Tomcat映象,來演示Dockerfile的使用方法,當然前提是你的電腦安裝了Docker環境,如何安裝Docker環境就不在此贅述了。

1、建立一個Dockerfile

Dockerfile命名必須為“Dockerfile”,Docker映象構建時,會查詢指定目錄中的Dockerfile。

2、編寫Dockerfile

(1)環境配置

首先,我們需要指定一個基礎映象,為了方便,我們從Ubuntu映象開始。

bash

FROM ubuntu:14.04

通過FROM指令,Docker編譯程式能夠知道通過哪個基礎映象執行來進行編譯。所有的Dockerfile都必須以FROM指令開始。通過該指令,我們相當於有了一個最基本的Ubuntu系統。

(2)其他環境配置

我們可以像這樣指定Dockerfile的作者。

bash

MAINTAINER example <[email protected]>

另外我們需要指定時區,否則我們做出的映象可能會跟當前時間不符。

bash

RUN echo "Asia/Shanghai" > /etc/timezone;dpkg-reconfigure -f noninteractive tzdata

我們可以像在電腦上安裝Tomcat一樣,把Tomcat安裝在Docker容器中。

(3)Tomcat必要軟體安裝。

我們此時使用的Ubuntu系統其實是很簡陋的系統,上面很多系統都沒有。所以我先安裝一些必要的軟體。

bash

RUN apt-get update && apt-get install -y curl vim net-tools && \

    rm -rf /var/lib/apt/lists/* && mkdir -p /app

RUN指令用來在Docker的編譯環境中執行指定命令。這裡我安裝了 curl 、 vim 、 net-tools ,其中 curl 用來獲取 java 和 tomcat 的安裝包, vim 和 net-tools 用來除錯,並建立了 /app 目錄。

(4)指定工作目錄

使用 WORKDIR /app 可以將工作目錄定位到/app 目錄下

(5)獲取安裝軟體

我們使用 第 (3)步 安裝的 curl 工具來獲取安裝包。

bash

RUN  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz \

    && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz

以上命令將會從指定地址下載安裝包,並解壓到當前目錄(上一步我們指定了工作空間為/app,所以會解壓到此目錄下)

(6)指定執行指令碼

截止到上一步,我們已經將需要的準備工作都做好了,剩下的還有Java環境變數的設定,Tomcat環境變數設定(非必須)和Tomcat的啟動。

bash

COPY tomcat7.sh /app/tomcat7.sh

RUN chmod +x /app/tomcat7.sh

上面的兩行命令會將與Dockerfile同級目錄的tomcat7.sh檔案上傳到docker容器中的/app目錄下,並且給該檔案賦予可執行的許可權。

看一眼該指令碼的內容便一目瞭然了。

```bash

Java環境變數配置

export JAVA_HOME=/app/jdk1.7.0_65

export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

Tomcat環境變數配置

export TOMCAT_HOME=/app/apache-tomcat-7.0.8

export PATH=$TOMCAT_HOME/bin:$PATH

啟動 Tomcat

exec $TOMCAT_HOME/bin/catalina.sh run

(7)指定埠

bash

EXPOSE 8080

```

通常情況下,Tomcat啟動後會監聽8080埠,在容器中也一樣。

EXPOSE指令用於標明,這個映象中的應用將會偵聽某個埠,並且希望能將這個埠對映到主機的網路介面上

(8)指定指令碼的執行

至此,我們要做的準備工作就做完了。使用下面這條命令,執行我們在第6步建立的指令碼,一個簡單的Tomcat的Dockerfile就編寫完成了。

bash

ENTRYPOINT [“/app/tomcat7.sh"]

ENTRYPOINT 用於標明一個映象作為容器執行時,最後要執行的程式或命令。

3.構建映象

進入Dockerfile所在目錄,執行命令 docker build -t mytomcat . (注意最後有個點用來表示當前目錄,初次構建速度會比較慢,需要多等一會。)

出現如下資訊就構建成功了

4.執行Docker容器

bash

docker run -i -t -p 5000:8080 mytom

其中,docker run 用於執行一個容器

  • -t 在容器指定一個偽終端或者終端;
  • -i 進行命令互動;
  • -p 匹配映象內的網路埠號,即我們可以通過宿主機中訪問5000埠來達到訪問容器8080埠的目的。

5.檢視構建好的映象和執行的容器

bash

docker images  #檢視映象

bash

docker ps -a #檢視所有的容器

6.檢視服務是否執行

在宿主機中我們輸入localhost:5000訪問,出現如下介面,表示Tomcat成功執行。

至此,我們就成功的建立了一個Tomcat映象了,當然這裡只是為了簡單演示,所以映象做的比較簡單,官方的Tomcat映象比這複雜的多,在熟悉了Dockerfile後可以去看看官方的做法。

6.其他

在做映象的時候有那麼多步驟,根本不可能一次將所有的步驟完成,所以,這裡教給大家一個 小技巧 。

在編寫完Dockerfile到第二步的時候,其實可以先使用一個指令碼先執行著,然後進入容器內部進行操作。筆者在編寫Dockerfile時先使用如下命令

bash

COPY run.sh /app/run.sh

RUN chmod +x /app/run.sh

ENTRYPOINT [“/app/run.sh"]

run.sh指令碼的內容如下

bash

!/bin/bash

sleep 15

while true

do

echo &quot;true&quot;

sleep 180

done

其實就是一段死迴圈程式碼代替原有的tomcat7.sh,接著就可以build和run我們的容器了。容器執行起來後使用docker exec -it container_id bash 進入docker容器。此時就和我們平時裝軟體的方式一樣了,做完一個步驟,在Dockerfile中記錄一條,這樣Dockerfile也就做出來了。(ps:exit退出容器。)

特別注意的一點,如果做好映象以後,在映象中有需要儲存的資料(持久化目錄)需要我們在Dockerfile中指定持久化目錄。為了能夠儲存(持久化)資料以及共享容器間的資料,Docker提出了Volume的概念。簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在於宿主機上。並且我們執行容器的時候需要使用使用 -v 來宣告Volume,如:

bash

docker run -it -v /home/dock/logs:/usr/logs tomcat /bin/bash

冒號前為宿主機目錄,必須為絕對路徑,冒號後為映象內掛載的路徑,這樣容器內更改的資料就被寫到宿主機上了。

擁有了Tomcat伺服器後,就可以跑寫好的java-web程式了,如何執行java-web程式就不在此詳述了,跟普通執行java-web程式一樣。

同樣的,如果你有一個web應用,將其放入Docker容器中,寫好Dockerfile,構建好應用執行需要的環境後,就可以很快的使用應用了。

相關推薦

Docker學習總結17——學會使用Dockerfile

Docker、Dockerfile、Docker映象、容器這些都是什麼鳥? 老生常談,再再再……普及一下: Docker: 最早是dotCloud公司出品的一套容器管理工具,但後來Docker慢慢火

Docker學習總結3——Docker實戰之入門以及Dockerfile

應用映象 csphere/wordpress:4.2 # cd docker-training/wordpress/ # ls -a . license.txt wp-config-sample.php wp-login.

Docker學習總結31——使用Maven外掛構建docker映象

Maven是一個強大的專案管理與構建工具。如果可以使用Maven構建Docker映象,以下幾款Maven的Docker外掛比較常用。外掛名稱官方地址docker-maven-pluginhttps://github.com/spotify/docker-maven-plugindocker-maven-plu

Docker學習總結21——Docke網路bridge詳解

Docker 安裝時會建立一個 命名為 docker0的 linux bridge。如果不指定--network,建立的容器預設都會掛到docker0上。 當前 docker0 上沒有任何其他網路

Docker學習總結22——Docke run命令詳解

在Docker中,run應該是使用者使用最多的命令了,很多讀者反饋不是很明白run命令的用法,而且相關的書籍、中文資料中對run命令的描述也不是非常完整,所以DockerOne組織翻譯了Docker官方的文件,以饗讀者。注意,本文基於最新的Docker 1.4文件翻譯。Docker會在隔離的容器中執行程序。當

Docker學習總結13——從零開始搭建Jenkins+Docker自動化整合環境

本文只簡單標記下大概的步驟,具體搭建各個部分的細節,還請自行搜尋。第一、二部分只是對Jenkins和Docker的簡單介紹,熟悉的同學請直接跳到第三部分。 一、關於Jenkins Jenk

Docker學習總結41——三個技巧,將Docker映象體積減小90%

一、前言 在構建Docker容器時,應該儘量想辦法獲得體積更小的映象,因為傳輸和部署體積較小的映象速度更快。但RUN語句總是會建立一個新層,而且在生成映象之前還需要使用很多中間檔案,在這種情況下,該如何獲得體積更小的映象呢?你可能已經注意到了,大多數Dockerfiles都

Docker學習總結10——10分鐘玩轉Docker

1、前言 進入雲端計算的時代,各大雲提供商AWS,阿里雲紛紛推出針對Docker的服務,現在Docker是十分火爆,那麼Docker到底是什麼,讓我們來體驗一下。 2、Docker是什麼 Dock

Docker學習總結29——Docker核心技術與實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐大。同樣,由於

Docker學習總結33——Docker環境下搭建 MySQL 主從複製

搭建環境Centos 7.2 64位MySQL 5.7.13Docker 1.13.1接下來,我們將會在一臺伺服器上安裝docker,並使用docker執行三個MySQL容器,分別為一主兩從。安裝doc

Docker學習總結19——Google開源的容器叢集管理系統Kubernetes介紹

Kubernetes是Google開源的容器叢集管理系統。它構建Ddocker技術之上,為容器化的應用提供資源排程、部署執行、服務發現、擴容縮容等整一套功能,本質上可看作是基於容器技術的mini-P

Docker學習總結12——非常詳細的 Docker 學習筆記

Usage of docker: --api-enable-cors=false Enable CORS headers in the remote API # 遠端 API 中開啟 CORS 頭 -b, --bridge=""

Docker學習總結23——Docker搭建大規模測試環境的實踐

內容來源:2017年4月8日,第四正規化資深測試開發工程師孫高飛在“餓了麼技術沙龍【第四彈】北京研發中心測試專場”進行《docker搭建大規模測試環境的實踐》演講分享。IT大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。 摘要 Docker是一個開源的應用容器

Docker學習總結42——Docker Compose 入門學習

一、Docker Compose介紹 Compose 是 Docker 公司推出的一個工具軟體,可以管理多個 Docker 容器組成一個應用(稱為一個 project,即專案)。Compose 定位是“Define and run multi-container applications w

Docker學習總結39——簡析容器、無伺服器和虛擬機器的安全性差異

外文翻譯:英文原文 前言 在三十多年前,虛擬化僅適用於擁有大型機和眾多小型計算機的使用者,而安全問題僅僅是物理上的。 二十年前,VMware釋出了其第一款產品,網路邊界安全性仍處於起步階段,依賴於防火牆。 十二年前,AWS推出,網路安全成為一個問題。 五年前,由於Dock

Docker學習總結7——雲端基於Docker的微服務與持續交付實踐

本文根據〖2016 全球運維大會•深圳站〗現場演講嘉賓分享內容整理而成 講師簡介 易立 畢業於北京大學,獲得學士學位和碩士學位;目前負責阿里雲容器技術相關的產品的研發工作。 加入阿

Docker學習總結26——Docker 管理工具的選擇:Kubernetes 還是 Swarm?

Docker 容器技術已經成為推動雲技術發展最重要的技術之一。如果你還沒有使用容器技術,那麼你很可能很快就會使用到它,不管以什麼樣的方式。 使用這種技術有兩個步驟。首先,你需要理解容器的概念。然後你需要有一個編排工具來處理容器的排程和管理。最終選擇誰取決於技術偏好和需求。 Docker是一種高階技術,能給使用

Docker學習總結14——從程式碼到上線, 雲端Docker化持續交付實踐

2016雲棲大會·北京峰會於8月9號在國家會議中心拉開帷幕,在雲棲社群開發者技術專場中,來自阿里雲技術專家羅晶(瑤靖)為在場的聽眾帶來《從程式碼到上線,雲端Docker化持續交付實踐》精彩分享。

Docker學習總結40——Docker常見應用場景再總結

前言 Docker提供了輕量級的虛擬化,它幾乎沒有任何額外開銷,這個特性非常酷。首先你在享有Docker帶來的虛擬化能力的時候無需擔心它帶來的額外開銷。其次,相比於虛擬機器,你可以在同一臺機器上建立更多數量的容器。Docker的另外一個優點是容器的啟動與停止都能在幾秒中內完

MyBatis學習總結17——Mybatis分頁外掛PageHelper

<!-- plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?,