Docker應用實踐:一個簡單的Java EE&Docker示例
學習Docker的***辦法就是迅速在工作中應用它,本文作者使用Docker部署了一個Java EE應用,非常簡單和方便。需要注意的是,由于作者寫作時本地網絡有問題,所以Dockerfile中很多的資源都沒有從網絡下載,你再實踐時,可以嘗試修改。學習快樂 :)
本文中,我們將會把Java EE和Docker結合,具體內容如下:
- 創建、構建并運行一個Docker鏡像;
- 通過鏡像啟動一個Wildfly服務器,并部署了一個JavaEE示例應用;
- 展示一些常用的Docker命令;
- 啟動多個容器,并讓同一應用運行于不同端口。
引言
在這里我不再介紹Docker,因為已經有太多的介紹性的文章。寫本文之前,我閱讀了如下教程:
- Docker用戶指南;
- 使用Docker鏡像;
- Docker***指南(譯者注:已翻譯);
- Arun Gupta的技術技巧:#39、#57、#61和#65。
前提條件
要完成本教程,你需要:
- 有一個運行于宿主機上的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
- 一個Wildfly 8.2.0的安裝程序(解壓后的);
- jdk-8u25-linux-x64.tar.gz文件。(http://www.oracle.com/technetwork/java/javase/downloads/index.html)
- 下載 car-service.war。(https://github.com/rmpestano/javaee-docker-sample/blob/master/java_ee/car-service.war)
- 下載 Dockerfile。(https://github.com/rmpestano/javaee-docker-sample/blob/master/java_ee/Dockerfile)
創建Docker鏡像
Docker鏡像展現/描述了容器本身。由于我的網絡帶寬有限(手機3G),在這里我使用本機資源創建了一個鏡像。因此,這個鏡像只有在包含如下文件的目錄下構建才能使用:
- wildfly-8.2.0.Final:應用服務器
- car-service.war:要部署的應用
- Dockerfile:描述容器的文件
- jdk-8u25-linux-x64.tar.gz:要在容器里安裝的java版本
注意:不推薦在Docker容器中使用本地資源,因為只有當所有文件都存在時鏡像才可以正常構建。***的辦法是從頭安裝所有東西并下載必要的文件。
這是Dockerfile的內容:
- FROM ubuntu
- MAINTAINER Rafael Pestano <rmpestano@gmail.com>
- setup WildFly
- COPY wildfly-8.2.0.Final /opt/wildfly
- install example app on wildfy
- COPY car-service.war /opt/wildfly/standalone/deployments/
- setup Java
- RUN mkdir /opt/java
- COPY 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 100
- RUN 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 9990
- Set 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"]
鏡像繼承自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的目錄。
上述命令的輸出如下:
然后我們可以通過列出鏡像命令(譯者注: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是鏡像名。
容器啟動過程中會輸出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卷來持久化數據。