1. 程式人生 > >基於Dockerfile搭建JAVA Tomcat執行環境

基於Dockerfile搭建JAVA Tomcat執行環境

前言

在第一篇文字中,我們完全人工方式,一個命令一個命令輸入,實現一個java tomcat執行環境,雖然也初見成效,但很累人。如果依靠依靠指令碼構建一個Tomcat容器例項,一個命令可以搞定,何樂而不為呢。好在Docker提供了Dockerfile作為構建Docker映象指令碼,避免人們一行一行的輸入,真是善莫大焉。Dockerfile指令碼可以做到隨時維護修改,即可以分享,更有利於在模板化,更不用說傳輸了,好處那是一大籮筐!

最終目的:打造一個支援SSH終端登入、Tomcat7自動執行的Docker映象。

編寫一個Dockerfile

所有環境,同第一篇文字。在ubuntu下安裝好vim之後(吐槽一下,ubuntu系統內建vi命令十分難用,只好求助於vim ):

sudo vim Dockerfile

編輯一個Dockerfile檔案了,下面就是具體檔案內容:

# VERSION 0.0.1
# 預設ubuntu server長期支援版本,當前是12.04
FROM ubuntu
# 簽名啦
MAINTAINER yongboy "[email protected]"

# 更新源,安裝ssh server
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd

# 設定root ssh遠端登入密碼為123456
RUN echo "root:123456" | chpasswd 

# 新增orache java7源,一次性安裝vim,wget,curl,java7,tomcat7等必備軟體
RUN apt-get install python-software-properties
RUN add-apt-repository ppa:webupd8team/java
RUN apt-get update
RUN apt-get install -y vim wget curl oracle-java7-installer tomcat7

# 設定JAVA_HOME環境變數
RUN update-alternatives --display java
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/environment
RUN echo "JAVA_HOME=/usr/lib/jvm/java-7-oracle">> /etc/default/tomcat7

# 容器需要開放SSH 22埠
EXPOSE 22

# 容器需要開放Tomcat 8080埠
EXPOSE 8080

# 設定Tomcat7初始化執行,SSH終端伺服器作為後臺執行
ENTRYPOINT service tomcat7 start && /usr/sbin/sshd -D

需要注意:

  1. ENTRYPOINT,表示映象在初始化時需要執行的命令,不可被重寫覆蓋,需謹記
  2. CMD,表示映象執行預設引數,可被重寫覆蓋
  3. ENTRYPOINT/CMD都只能在檔案中存在一次,並且最後一個生效 多個存在,只有最後一個生效,其它無效!
  4. 需要初始化執行多個命令,彼此之間可以使用 && 隔開,但最後一個須要為無限執行的命令,需切記!

ENTRYPOINT/CMD,一般兩者可以配合使用,比如:

ENTRYPOINT ["/usr/sbin/sshd"]
CMD ["-D"]

在Docker daemon模式下,無論你是使用ENTRYPOINT,還是CMD,最後的命令,一定要是當前程序需要一直執行的,才能夠防容器退出。

以下無效方式:

ENTRYPOINT service tomcat7 start #執行幾秒鐘之後,容器就會退出
 CMD service tomcat7 start #執行幾秒鐘之後,容器就會退出

這樣有效:

ENTRYPOINT service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out
# 或者
CMD service tomcat7 start && tail -f /var/lib/tomcat7/logs/catalina.out

這樣也有效:

ENTRYPOINT ["/usr/sbin/sshd"]
 CMD ["-D"]

具體請參考官方文件:Dockerfiles for Images

構建映象

指令碼寫好了,需要轉換成映象:

docker build -t yongboy/java7 .

-t: 為構建的映象制定一個標籤,便於記憶/索引等

. : 指定Dockerfile檔案在當前目錄下

網速不太好,會等待很長時間。很多操作可能需要科學上網,逼得我只能一直掛著VPN,方能暢通無阻。

構建映象完成之後,看看執行效果:

docker run -d -p 22 -p 8080:8080 yongboy/java7

在執行命令中,還得需要顯式指定 -p 22 -p 8080:8080,否則在Docker 0.8.1版本中不會主動對映到宿主機上。據悉在Docker 0.4.8版本時,就不擔心這個問題。 或者,您要有好的方式,不妨告知於我,謝謝。

在Dockerfile中,若沒有使用ENTRYPOINT/CMD指令,若執行多個命令,可以這樣做:

docker run -d -p 22 -p 8080 yongboy/java7 /bin/sh -c "service tomcat7 start && /usr/sbin/sshd -D"

提交/儲存映象

建立好的映象,可以儲存到索引倉庫中,便於下次使用(當然,我們直接共享Dockerfile,是最簡單的事情,:)) ),但畢竟映象可以做到開箱即用。

  1. https://index.docker.io/ 註冊一個賬號,例如yongboy
  2. 構建映象

    docker build -t yongboy/java7 .

    上面已經構建OK的話,可省略此步。

  3. 登陸

    docker login
  4. 提交到Docker索引倉庫

    docker push yongboy/java7

    現在可以起來喝杯熱水,出去溜達會,也不一定能夠上傳完畢,那叫一個慢啊!

    上傳OK的話,可以得到類似地址:https://index.docker.io/u/yongboy/java7/

  5. 如何使用映象

    docker pull yongboy/java7

    剩下的步驟,就很簡單了。