zoukankan      html  css  js  c++  java
  • windows环境 springboot+docker开发环境搭建与hello word

    1,下载安装 docker toolbox

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

      docker toolbox 是一个工具集,它主要包含以下一些内容:

    Docker CLI 客户端,用来运行docker引擎创建镜像和容器
    Docker Machine. 可以让你在windows的命令行中运行docker引擎命令
    Docker Compose. 用来运行docker-compose命令
    Kitematic. 这是Docker的GUI版本
    Docker QuickStart shell. 这是一个已经配置好Docker的命令行环境
    Oracle VM Virtualbox. 虚拟机

    下载完成之后直接点击安装,安装成功后,桌边会出现三个图标,入下图所示:

    点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。

    boot2docker用户和密码
    用户密码进入方式
    docker tcuser ssh
    root   command:sudo -i (docker用户下执行)

    配置中国版加速器

    在当前用户文档下面有一个.docker文件夹中machinemachinesdefault下的config.json文件

    修改配置文件"HostOptions"下子节点

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

    或在docker toolbox终端中执行

    #先删除默认创建的VM镜像
    docker-machine rm virtualbox default
    #重新创建一个阿里加速器的镜像
    docker-machine create --engine-registry-mirror=https://9pwp8psv.mirror.aliyuncs.com -d virtualbox default

    2,新建一个springboot项目

     添加一个默认的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] 命令可查看容器运行信息

  • 相关阅读:
    数据库(六)
    数据库(五)
    数据库(四)
    数据库(三)
    数据库(二)
    数据库
    函数 枚举和递归
    数据类型(四) 集合
    数据库基础
    特殊集合 结构体
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/10310207.html
Copyright © 2011-2022 走看看