一個簡單的Java EE&Docker示例
學習Docker的最好辦法就是迅速在工作中應用它,本文作者使用Docker部署了一個Java EE應用,非常簡單和方便。需要注意的是,由于作者寫作時本地網絡有問題,所以Dockerfile中很多的資源都沒有從網絡下載,你再實踐時,可以嘗試 修改。學習快樂 :)
本文中,我們將會把Java EE和Docker結合,具體內容如下:
- 創建、構建并運行一個Docker鏡像;
- 通過鏡像啟動一個Wildfly服務器,并部署了一個JavaEE示例應用;
- 展示一些常用的Docker命令;
- 啟動多個容器,并讓同一應用運行于不同端口。 </ul>
- Docker用戶指南;
- 使用Docker鏡像;
- Docker終極指南(譯者注:已翻譯);
- Arun Gupta的技術技巧:#39、#57、#61和#65。 </ul>
- 有一個運行于宿主機上的Docker后臺進程
- 安裝Docker后,在etc\default\docker文件中添加一行:DOCKER_OPTS="-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
- 此后重啟機器并嘗試運行這個命令:docker -H tcp://127.0.0.1:2375 –version,輸出應該類似這樣的:Docker version 1.4.1, build 5bc2ff8 </ul> </li>
- 一個Wildfly 8.2.0的安裝程序(解壓后的);
- jdk-8u25-linux-x64.tar.gz文件;
- 在此下載 car-service.war;
- 在此下載 Dockerfile。 </ul>
- wildfly-8.2.0.Final:應用服務器
- car-service.war:要部署的應用
- Dockerfile:描述容器的文件
- jdk-8u25-linux-x64.tar.gz:要在容器里安裝的java版本 </ul>
創建Docker鏡像
Docker鏡像展現/描述了容器本身。由于我的網絡帶寬有限(手機3G),在這里我使用本機資源創建了一個鏡像。因此,這個鏡像只有在包含如下文件的目錄下構建才能使用:
注意:不推薦在Docker容器中使用本地資源,因為只有當所有文件都存在時鏡像才可以正常構建。最好的辦法是從頭安裝所有東西并下載必要的文件。
這是Dockerfile的內容:
FROM ubuntu MAINTAINER Rafael Pestano <rmpestano@gmail.com>
setup WildFly
COPY wildfly-8.2.0.Final /opt/wildflyinstall example app on wildfy
COPY car-service.war /opt/wildfly/standalone/deployments/setup Java
RUN mkdir /opt/javaCOPY jdk-8u25-linux-x64.tar.gz /opt/java/
change dir to Java installation dir
WORKDIR /opt/java/RUN tar -zxf jdk-8u25-linux-x64.tar.gz
setup environment variables
RUN update-alternatives --install /usr/bin/javac javac /opt/java/jdk1.8.0_25/bin/javac 100RUN update-alternatives --install /usr/bin/java java /opt/java/jdk1.8.0_25/bin/java 100
RUN update-alternatives --display java
RUN java -version
Expose the ports we're interested in
EXPOSE 8080 9990Set the default command to run on boot
This will boot WildFly in the standalone mode and bind to all interface
CMD ["/opt/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-b", "0.0.0.0"]</pre>
鏡像繼承自Ubuntu——一個安裝了Ubuntu操作系統的鏡像。Docker 安裝教程中就安裝了Ubuntu鏡像。
接著,我們將服務器復制到容器的/opt/wildfly目錄。COPY是Dockerfile的一個指令。 我們可以在這里找到所有命令。
我們隨后將應用的war包復制到服務器中:COPY car-service.war /opt/wildfly/standalone/deployments/。
然后,我們將Java解壓安裝到容器的/opt/java目錄并設置一些環境變量。最好的辦法是使用apt-get,不過這要求有互聯網接入,而我寫作時不具備這個條件。我使用RUN命令來執行java -version,(如果Java正確安裝的話)它將在鏡像構建時打印版本號。
之后,我使用EXPOSE 8080 9990來告訴Docker容器要暴露的端口號。容器其實是鏡像的實例,運行鏡像(docker run)時,我們可以指定允許宿主訪問的端口。
最后,我們指定了默認命令: CMD ["/opt/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-b", "0.0.0.0"]。每次容器啟動時都會運行這個命令。
構建鏡像
在描述完鏡像之后,我們需要構建它。在包含Dockerfile的父目錄運行以下命令:
docker -H tcp://127.0.0.1:2375 build -t javaee_sample java_ee/
- -H參數指定了Docker后臺地址(使用TCP與后臺通訊);
- build是命令本身;
- -t指定了用于識別鏡像的標簽名稱(這里是javaee_sample);
- java_ee/是包含用于描述鏡像的Dockerfile的目錄。 </ul>
可 在此找到更多Docker命令。上述命令的輸出如下:
然后我們可以通過列出鏡像命令(譯者注:docker images命令)來確認剛創建的鏡像:docker -H tcp://127.0.0.1:2375 images:
啟動容器
使用這一命令啟動容器:
docker -H tcp://127.0.0.1:2375 run -p 8180:8080 javaee_sample
- -p指定容器端口到主機端口的映射;
- run是命令本身;
- javaee_sample是鏡像名。 </ul>
容器啟動過程中會輸出Wildfly啟動日志,這是因為我們將其設置為初始命令(CMD Dockerfile命令):
運行多個容器
我們可以實例化多個容器,因為它們的端口在宿主上不會發生沖突。我將再啟動兩個容器并將8080端口分別暴露為8280和8380:
docker -H tcp://127.0.0.1:2375 run -p 8280:8080 javaee_sample docker -H tcp://127.0.0.1:2375 run -p 8380:8080 javaee_sample
要列出啟動的容器,我們可以使用命令:docker -H tcp://127.0.0.1:2375 ps,這是輸出結果:
rmpestano@rmpestano-ubuntu:~/docker /images$ docker -H tcp://127.0.0.1:2375 ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b9079806e69 javaee_sample:latest "/opt/wildfly/bin/st 27 seconds ago Up 27 seconds 9990/tcp, 0.0.0.0:8280->8080/tcp suspicious_lovelace d4975e825751 javaee_sample:latest "/opt/wildfly/bin/st 28 seconds ago Up 28 seconds 9990/tcp, 0.0.0.0:8380->8080/tcp loving_hopper 96e58eb65126 javaee_sample:latest "/opt/wildfly/bin/st 42 seconds ago Up 42 seconds 9990/tcp, 0.0.0.0:8180->8080/tcp clever_cori
現在我們可以在瀏覽器中同時訪問這三個應用:
你可以通過容器的ID或名字來停止容器:
docker -H tcp://127.0.0.1:2375 stop suspicious_lovelace
記住,在容器刪除時所有數據將消失。請使用 Docker卷來持久化數據。
原文:A SIMPLE JAVA EE DOCKER EXAMPLE (翻譯:梁曉勇 校對:李穎杰)
來自:http://dockerone.com/article/146
引言
在這里我不再介紹Docker,因為已經有太多的介紹性的文章。寫本文之前,我閱讀了如下教程:前提條件
要完成本教程,你需要: 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!