Docker學習總結(17)——學會使用Dockerfile
Docker、Dockerfile、Docker映象、容器這些都是什麼鳥?
老生常談,再再再……普及一下:
- Docker: 最早是dotCloud公司出品的一套容器管理工具,但後來Docker慢慢火起來了,連公司名字都從dotCloud改成Docker。
- Dockerfile: 它是Docker映象的描述檔案,可以理解成火箭發射的A、B、C、D……的步驟。
- Docker映象: 通過Dockerfile做出來的,包含作業系統基礎檔案和軟體執行環境,它使用分層的儲存方式。
- 容器: 是執行起來的映象,簡單理解,Docker映象相當於程式,容器相當於程序。
講了這麼多,大家可能已經意識到了,想玩轉Docker必須先要搞定Docker映象,映象又來自於Dockerfile
如何通過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 "true"
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?,