windows環境 springboot+docker開發環境搭建與hello word

1,下載安裝 docker toolbox java

  下載地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/linux

  docker toolbox 是一個工具集,它主要包含如下一些內容:web

Docker CLI 客戶端,用來運行docker引擎建立鏡像和容器
Docker Machine. 可讓你在windows的命令行中運行docker引擎命令
Docker Compose. 用來運行docker-compose命令
Kitematic. 這是Docker的GUI版本
Docker QuickStart shell. 這是一個已經配置好Docker的命令行環境
Oracle VM Virtualbox. 虛擬機

下載完成以後直接點擊安裝,安裝成功後,桌邊會出現三個圖標,入下圖所示:spring

點擊 Docker QuickStart 圖標來啓動 Docker Toolbox 終端。docker

boot2docker用戶和密碼
用戶 密碼 進入方式
docker tcuser ssh
root   command:sudo -i (docker用戶下執行)

配置中國版加速器shell

在當前用戶文檔下面有一個.docker文件夾中machine\machines\default下的config.json文件apache

修改配置文件"HostOptions"下子節點json

"RegistryMirror": [
    "https://9pwp8psv.mirror.aliyuncs.com"
],

或在docker toolbox終端中執行windows

#先刪除默認建立的VM鏡像
docker-machine rm virtualbox default
#從新建立一個阿里加速器的鏡像
docker-machine create --engine-registry-mirror=https://9pwp8psv.mirror.aliyuncs.com -d virtualbox default

 

2,新建一個springboot項目tomcat

 添加一個默認的controller    

@RestController
public class DefaultController {

    @RequestMapping("/")
    public String home() {
        return "Hello Docker World ";
    }
}

  啓動這個項目檢查是否在我docker狀況下正常訪問

3,修改pox.xml改成docker編譯

   properties屬性節點加入:

<!--properties節點中設置docker鏡像的前綴「springboot」-->
<docker.image.prefix>springio</docker.image.prefix>

   build節點修改成

 <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- Docker maven plugin -->
            <plugin>
                <!-- https://mvnrepository.com/artifact/com.spotify/docker-maven-plugin -->
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.war</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
            <!-- Docker maven plugin -->
        </plugins>
    </build>

4,添加Dockerfile

目錄結構

文件內容

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD demo-docker-0.0.1-SNAPSHOT.war app.war
RUN sh -c 'touch /app.war'
RUN echo "Asia/Shanghai" > /etc/timezone
ARG active="prod"
ENV JAVA_OPTS=""
ENV spring.profiles.active="dev"
#ENV spring.profiles.active=${active}
ENTRYPOINT ["sh", "-c","java -Dspring.profiles.active=prod $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.war"]
#ENTRYPOINT ["java","-jar","/app.war"]

解釋下這個配置文件:

  • 1,使用 openjdk 8 alpine 版本,alpine版爲精簡版,也可使用完整版 openjdk:8-jdk或java:8
  • 2,VOLUME 指定了臨時文件目錄爲/tmp。其效果是在主機 /var/lib/docker 目錄下建立了一個臨時文件,並連接到容器的/tmp。這個步驟是可選的,若是涉及到文件系統的應用就頗有必要了。/tmp目錄用來持久化到 Docker 數據文件夾,由於 Spring Boot 使用的內嵌 Tomcat 容器默認使用/tmp做爲工做目錄
  • 3,項目的 war/jar 文件做爲 "app.war" 添加到容器的
  • 4,執行linux腳本,設置一下文件(這句話沒有什麼太大意義,主要是驗證文件中)
  • 5,修改時區爲北京時間
  • 6,ARG 構建參數,Dockerfile文件中臨時變量
  • 7,8,項目啓動參數JAVA_OPTS,spring.profiles.active爲參數名,後面爲參數值,能夠直接將值傳遞給spring項目,如傳遞給配置文件,使用${spring.profiles.active}接收,能夠在啓動時使用「-env --spring.profiles.active=prod」 覆蓋此值,也能夠在ENTRYPOINT啓動指令中覆蓋此值
  • 9,帶入環境變量
  • 10,ENTRYPOINT 項目啓動指令:執行項目 app.war。爲了縮短 Tomcat 啓動時間,快隨機數產生過程,添加一個系統屬性指向 "/dev/urandom" 做爲 Entropy Source

 5,添加maven編輯命令進行編輯 

mvn package docker:build

點擊execute開始執行編譯成docker image,正常狀況下,會看到下面的步驟信息

[INFO] Building image springio/demo-docker
Step 1/6 : FROM openjdk:8-jdk-alpine

 ---> 2cfb1dc1f0c8
Step 2/6 : VOLUME /tmp

 ---> Using cache
 ---> 0641ab6474fc
Step 3/6 : ADD demo-docker-0.0.1-SNAPSHOT.war app.war

 ---> c01da61fbe6d
Step 4/6 : RUN sh -c 'touch /app.war'

 ---> Running in c8946506f292
Removing intermediate container c8946506f292
 ---> 12383d2f8329
Step 5/6 : ENV JAVA_OPTS=""

 ---> Running in 07d5bebe9e00
Removing intermediate container 07d5bebe9e00
 ---> e8f8f4242553
Step 6/6 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.war" ]

 ---> Running in 39ce4bf989ba
Removing intermediate container 39ce4bf989ba
 ---> dca2a0984c5d
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built dca2a0984c5d
Successfully tagged springio/demo-docker:latest
[INFO] Built springio/demo-docker
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.386 s
[INFO] Finished at: 2019-01-23T16:56:36+08:00
[INFO] Final Memory: 57M/470M
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

6, 運行項目

  啓用「Docker Quickstart Terminal」或直接從"Oracle VM VirtualBox"界面進入default虛擬機,不須要輸入密碼便可進入root環境

  輸入下列命令查看已存在的image   

docker images

 獲得結果

輸入下面命令啓動項目

docker run -p 8080:8080 -t springio/demo-docker
  -a, --attach=[]            登陸容器(以docker run -d啓動的容器)  
  -c, --cpu-shares=0         設置容器CPU權重,在CPU共享場景使用  
  --cap-add=[]               添加權限,權限清單詳見:http://linux.die.net/man/7/capabilities  
  --cap-drop=[]              刪除權限,權限清單詳見:http://linux.die.net/man/7/capabilities  
  --cidfile=""               運行容器後,在指定文件中寫入容器PID值,一種典型的監控系統用法  
  --cpuset=""                設置容器可使用哪些CPU,此參數能夠用來容器獨佔CPU  
  -d, --detach=false         指定容器運行於前臺仍是後臺   
  --device=[]                添加主機設備給容器,至關於設備直通  
  --dns=[]                   指定容器的dns服務器  
  --dns-search=[]            指定容器的dns搜索域名,寫入到容器的/etc/resolv.conf文件  
  -e, --env=[]               指定環境變量,容器中可使用該環境變量  
  --entrypoint=""            覆蓋image的入口點  
  --env-file=[]              指定環境變量文件,文件格式爲每行一個環境變量  
  --expose=[]                指定容器暴露的端口,即修改鏡像的暴露端口  
  -h, --hostname=""          指定容器的主機名  
  -i, --interactive=false    打開STDIN,用於控制檯交互  
  --link=[]                  指定容器間的關聯,使用其餘容器的IP、env等信息  
  --lxc-conf=[]              指定容器的配置文件,只有在指定--exec-driver=lxc時使用  
  -m, --memory=""            指定容器的內存上限  
  --name=""                  指定容器名字,後續能夠經過名字進行容器管理,links特性須要使用名字  
  --net="bridge"             容器網絡設置,待詳述  
  -P, --publish-all=false    指定容器暴露的端口,待詳述  
  -p, --publish=[]           指定容器暴露的端口,待詳述  
  --privileged=false         指定容器是否爲特權容器,特權容器擁有全部的capabilities  
  --restart=""               指定容器中止後的重啓策略,待詳述  
  --rm=false                 指定容器中止後自動刪除容器(不支持以docker run -d啓動的容器)  
  --sig-proxy=true           設置由代理接受並處理信號,可是SIGCHLD、SIGSTOP和SIGKILL不能被代理  
  -t, --tty=false            分配tty設備,該能夠支持終端登陸  
  -u, --user=""              指定容器的用戶  
  -v, --volume=[]            給容器掛載存儲卷,掛載到容器的某個目錄  
  --volumes-from=[]          給容器掛載其餘容器上的卷,掛載到容器的某個目錄  
  -w, --workdir=""           指定容器的工做目錄  

啓動信息以下:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.1.RELEASE)

2019-01-23 09:02:49.987  INFO 1 --- [           main] c.e.demodocker.DemoDockerApplication     : Starting DemoDockerApplication v0.0.1-SNAPSHOT on 740b53e853e9 with PID 1 (/app.war started by root in /)
2019-01-23 09:02:50.001  INFO 1 --- [           main] c.e.demodocker.DemoDockerApplication     : No active profile set, falling back to default profiles: default
2019-01-23 09:02:53.582  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-01-23 09:02:53.685  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-01-23 09:02:53.692  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/9.0.13
2019-01-23 09:02:53.722  INFO 1 --- [           main] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64/server:/usr/lib/jvm/java-1.8-openjdk/jre/lib/amd64:/usr/lib/jvm/java-1.8-openjdk/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]
2019-01-23 09:02:54.560  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-01-23 09:02:54.561  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 4389 ms
2019-01-23 09:02:55.178  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-01-23 09:02:55.671  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-01-23 09:02:55.681  INFO 1 --- [           main] c.e.demodocker.DemoDockerApplication     : Started DemoDockerApplication in 6.796 seconds (JVM running for 7.909)

使用docker ps查看已運行的容器進程

表格字段說明

CONTAINER_ID      表示容器ID
IMAGE             表示鏡像名稱
COMMAND           表示啓動容器時運行的命令
CREATED           表示容器的建立時間
STATUS            表示容器運行的狀態。UP表示運行中,EXITED表示已中止
PORTS             表示容器對外的端口號
NAMES             表示容器名稱,該名稱默認由Docker自動生成,也可以使用docker run 命令的 -name 選項自行指定

幾個docker命令

docker start [CONTAINER_ID] :啓動一個或多個已經被中止的容器
docker stop [CONTAINER_ID] :中止一個運行中的容器
docker restart [CONTAINER_ID]:重啓容器

 

7,測試:

 訪問你虛擬就ip地址+啓動時指定的端口號訪問spring boot項目

 能夠在虛擬機中經過 ifconfig查看 

 輸入ifconfig命令能夠看到default有三個網段的IP地址,分別爲:

docker0: 172.17.0.1,這個是docker的網橋。
eth0:10.0.2.15,這個網段在Ubuntu環境中是沒有的,暫不知道爲何會多這一個。
eth1:192.168.99.100,這個數宿主機的IP地址。

另外也能夠在本地cmd中,使用 docker-machine env   docker info 查看docker環境

Docker inspect [容器id] 命令可查看容器運行信息

相關文章
相關標籤/搜索