├── .gitignore ├── Dockerfile ├── README.md ├── pom.xml └── src └── main └── java └── com └── bingohuang └── hello └── Application.java /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /.idea 3 | *.iml 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM hub.c.163.com/bingohuang/jdk8:latest 2 | 3 | MAINTAINER Bingo Huang 4 | 5 | COPY target/spring-boot-docker-cloudcomb-0.1.0.jar app.jar 6 | 7 | ENTRYPOINT ["java","-jar","/app.jar"] 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 一步步带你构建 Spring Boot + Docker 应用 2 | 3 | 本文将一步步带你构建一个基于 `Spring Boot` 和 `Docker` 的单体应用,并通过 Docker 镜像将该应用部署在`网易蜂巢`,创建容器服务,实现在线运行。 4 | 5 | ## 前置知识 6 | ### Spring Boot 简介 7 | Spring Boot 是 Spring 社区发布的一个开源项目,旨在帮助开发者快速简单的构建可独立运行的项目。Spring Boot 会选择最适合的 Spring 子项目和第三方开源库进行整合。大部分 Spring Boot 应用只需要非常少的配置就可以快速运行起来。 8 | 9 | 官网地址:http://projects.spring.io/spring-boot/ 10 | 11 | ### Docker 简介 12 | Docker 是一套以容器技术为核心的,用于应用的构建、分发和执行的体系和生态。官网地址: 13 | 14 | 官网地址:https://docker.com 15 | 16 | ### 单体应用 17 | 通俗地讲,“单体应用(monolith application)”就是将应用程序的所有功能都打包成一个独立的单元,可以是JAR、WAR、EAR或其它归档格式。 18 | 19 | ### 网易蜂巢简介 20 | 由网易公司推出的专业的容器云平台,深度整合了 IaaS、PaaS 及容器技术,提供弹性计算、DevOps 工具链及微服务基础设施等服务,帮助企业解决 IT、架构及运维等问题,使企业更聚焦于业务,是新一代的云计算平台。 21 | 22 | 官网地址:https://c.163.com 23 | 24 | ## 前置条件 25 | * 操作系统:64位,系统不限(需支持Docker),Windows 上建议安装 [Git 客户端](https://git-scm.com/download/win),方便支持 Linux 命令行操作 26 | * JDK 1.8 + :推荐一款 Java 环境管理工具 [jenv](http://jenv.io/) 27 | * Maven 3.0 + :建议用杭研的 [Maven](http://mvn.hz.netease.com/) 仓库 28 | * Docker 29 | * Linux安装教程参考:https://docs.docker.com/engine/installation/linux/ 30 | * 如果你使用的是Mac或Windows,官方已有原生应用支持,下载地址:https://docs.docker.com/ 31 | * Git及Github:文中源码通过 Git 做版本管理,并托管在 Github:https://github.com/163yun/spring-boot-docker-cloudcomb 32 | * 一个你喜欢的编译器或IDE,推荐 [Atom](https://atom.io/) 或 [Intellij IDEA](https://www.jetbrains.com/idea/download/) 33 | * 15分钟空挡时间(在以上环境准备好的情况下) 34 | 35 | ## 一步步来 36 | 37 | ### 第一步:新建工程目录 38 | 新建一个文件夹,名字就是你的项目名,这里以 `spring-boot-docker-cloudcomb` 为例。 39 | ```shell 40 | mkdir spring-boot-docker-cloudcomb 41 | ``` 42 | 43 | 在根目录下创建 pom.xml 文件 44 | ```shell 45 | touch pom.xml 46 | ``` 47 | 48 | 在当前目录下新建子目录: 49 | ```shell 50 | mkdir -p src/main/java/com/bingohuang/hello 51 | ``` 52 | 53 | 一个典型的 **Maven** 项目结构如下: 54 | ```shell 55 | spring-boot-docker-cloudcomb 56 | ├── pom.xml 57 | └── src 58 | └── main 59 | └── java 60 | └── com 61 | └── bingohuang 62 | └── hello 63 | ``` 64 | 65 | ### 第二步:配置 pom 文件 66 | 在 pom.xml 中添加内容如下: 67 | ```xml 68 | 69 | 71 | 4.0.0 72 | 73 | bingohuang.com 74 | spring-boot-docker-cloudcomb 75 | 0.1.0 76 | jar 77 | Spring Boot + Docker + Cloudcomb 78 | 一步步带你构建 Spring Boot + Docker 应用及网易蜂巢服务 79 | 80 | 81 | org.springframework.boot 82 | spring-boot-starter-parent 83 | 1.3.3.RELEASE 84 | 85 | 86 | 87 | 88 | 1.8 89 | 90 | 91 | 92 | 93 | org.springframework.boot 94 | spring-boot-starter-web 95 | 96 | 97 | org.springframework.boot 98 | spring-boot-starter-test 99 | test 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | org.springframework.boot 108 | spring-boot-maven-plugin 109 | 110 | 111 | 112 | 113 | 114 | ``` 115 | 以上 pom 文件并不复杂,是一个 Spring Boot 的标准配置,Spring Boot 的 Maven 插件会提供以下功能: 116 | - 收集的类路径上所有 jar 文件,并构建成一个单一的、可运行的 jar 文件,这使得它更方便地执行和传输服务。 117 | - 搜索 `public static void main()` 方法来标记为可运行的类。 118 | - 提供了一个内置的依赖解析器,用于设置版本号以匹配 Spring Boot 的依赖。你可以覆盖任何你想要的版本,但它会默认使用 Spring Boot 所设置的版本集。 119 | 120 | ### 第三步:编写 Spring Boot 应用 121 | 创建一个简单的 Java 应用程序: 122 | ```shell 123 | touch src/main/java/com/bingohuang/hello/Application.java 124 | ``` 125 | ```java 126 | package com.bingohuang.hello; 127 | 128 | import org.springframework.boot.SpringApplication; 129 | import org.springframework.boot.autoconfigure.SpringBootApplication; 130 | import org.springframework.web.bind.annotation.RequestMapping; 131 | import org.springframework.web.bind.annotation.RestController; 132 | 133 | /** 134 | * Sprint Boot 主应用入口 135 | * @author bingohuang.com 136 | * @date 2016.11.15 137 | */ 138 | @SpringBootApplication 139 | @RestController 140 | public class Application { 141 | 142 | @RequestMapping("/") 143 | public String home() { 144 | return "Hello Spring Boot, Docker and CloudComb!"; 145 | } 146 | 147 | 148 | public static void main(String[] args) { 149 | SpringApplication.run(Application.class, args); 150 | } 151 | 152 | } 153 | ``` 154 | 代码核心就是处理了根路径(/)的 web 请求,并包含可执行的 main 方法,比较好理解,解释一下其中几个关键点: 155 | - 用 @SpringBootApplication 和 @RestController 注解类, 表示可用 Spring MVC 来处理 Web 请求 156 | - @RequestMapping 将 / 映射到 home() 方法,并返回相应文本 157 | - main() 方法使用 Spring Boot 的 SpringApplication.run() 方法来启动应用 158 | 159 | ### 第四步:本地运行程序 160 | 161 | #### Maven 构建 162 | 该应用的核心代码就已完成,也就两个文件,可见 Spring Boot 非常简单,目录结构如下: 163 | ```shell 164 | spring-boot-docker-cloudcomb 165 | ├── pom.xml 166 | └── src 167 | └── main 168 | └── java 169 | └── com 170 | └── binghuang 171 | └── hello 172 | └── Application.java 173 | ``` 174 | 在根目录执行: 175 | ```shell 176 | mvn package 177 | ``` 178 | 之后会在根目录下生成一个 target 目录,并在 target 目录下包含一个可执行的 jar 包。 179 | 180 | #### 运行 jar 包 181 | Spring Boot 的强大之处是将应用打成一个可独立运行的 jar 文件: 182 | ```shell 183 | java -jar target/spring-boot-docker-cloudcomb-0.1.0.jar 184 | ``` 185 | 不出意外,输出日志,应用启动,默认会监听 8080 端口。 186 | ``` 187 | . ____ _ __ _ _ 188 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ 189 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 190 | \\/ ___)| |_)| | | | | || (_| | ) ) ) ) 191 | ' |____| .__|_| |_|_| |_\__, | / / / / 192 | =========|_|==============|___/=/_/_/_/ 193 | :: Spring Boot :: (v1.3.3.RELEASE) 194 | 195 | 2016-11-15 22:21:26.789 INFO 91932 --- [ main] hello.Application : Starting Application v0.1.0 on BingoHuang.local with PID 91932 (/Users/bingo/Git/springboot/spring-boot-docker-cloudcomb/target/spring-boot-docker-cloudcomb-0.1.0.jar started by bingo in /Users/bingo/Git/springboot/spring-boot-docker-cloudcomb) 196 | ``` 197 | 198 | #### 访问应用 199 | 应用正常启动后,浏览器访问 `http://127.0.0.1:8080/`,即可看到页面输出字样: 200 | ```shell 201 | Hello Spring Boot, Docker and CloudComb! 202 | ``` 203 | 204 | ### 第五步:容器化构建及运行 205 | #### 书写 Dockerfile 206 | 在项目根目录下创建一个 Dockerfile 文件,内容如下: 207 | ```shell 208 | touch Dockerfile 209 | ``` 210 | ```dockerfile 211 | FROM hub.c.163.com/bingohuang/jdk8:latest 212 | 213 | MAINTAINER Bingo Huang 214 | 215 | COPY target/spring-boot-docker-cloudcomb-0.1.0.jar app.jar 216 | 217 | ENTRYPOINT ["java","-jar","/app.jar"] 218 | ``` 219 | 此 Dockerfile 并不复杂,核心功能就是将可执行文件拷贝到镜像中,并在容器启动时默认执行启动命令 `java -jar /app.jar` 220 | 221 | 此时项目所有源文件编写完成,共三个文件,目录结构如下: 222 | ```shell 223 | spring-boot-docker-cloudcomb 224 | ├── Dockerfile 225 | ├── pom.xml 226 | └── src 227 | └── main 228 | └── java 229 | └── com 230 | └── bingohuang 231 | └── hello 232 | └── Application.java 233 | ``` 234 | #### docker 构建 235 | 在项目根目录下执行 docker 构建镜像命令: 236 | ``` 237 | docker build -t spring-boot-docker-cloudcomb:0.1.0 . 238 | ``` 239 | 详情请查看 [docker build](https://docs.docker.com/engine/reference/commandline/build/) 命令详解。 240 | 241 | #### docker 运行 242 | 运行 docker 容器: 243 | ``` 244 | docker run -p 8080:8080 -t spring-boot-docker-cloudcomb:0.1.0 245 | ``` 246 | 详情请查看 [docker run](https://docs.docker.com/engine/reference/commandline/run/) 命令详解。 247 | 248 | #### 访问项目 249 | 同样,会输出日志(略有不同),监听 8080 端口,浏览器访问 `http://127.0.0.1:8080/`,输出文本。 250 | ``` 251 | . ____ _ __ _ _ 252 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ 253 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 254 | \\/ ___)| |_)| | | | | || (_| | ) ) ) ) 255 | ' |____| .__|_| |_|_| |_\__, | / / / / 256 | =========|_|==============|___/=/_/_/_/ 257 | :: Spring Boot :: (v1.3.3.RELEASE) 258 | 259 | 2016-11-15 14:18:54.889 INFO 1 --- [ main] hello.Application : Starting Application v0.1.0 on 509da1aefb69 with PID 1 (/app.jar started by root in /) 260 | ``` 261 | ```shell 262 | Hello Spring Boot, Docker and CloudComb! 263 | ``` 264 | 265 | ### 第六步:推送镜像到网易蜂巢 266 | 首先,需要有一个网易蜂巢的账号,可在[蜂巢首页](https://c.163.com/)注册。 267 | 268 | 接下来,在命令行中登录蜂巢镜像仓库: 269 | ```shell 270 | docker login hub.c.163.com 271 | Username (me@bingohuang.com): me@bingohuang.com 272 | Password: 273 | Login Succeeded 274 | ``` 275 | 276 | 接着,统一标记本地镜像: 277 | ```shell 278 | docker tag spring-boot-docker-cloudcomb:0.1.0 hub.c.163.com/bingohuang/spring-boot-docker-cloudcomb:0.1.0 279 | ``` 280 | 281 | 最后,推送镜像到蜂巢镜像仓库: 282 | ```shell 283 | docker push hub.c.163.com/bingohuang/spring-boot-docker-cloudcomb:0.1.0 284 | ``` 285 | 286 | ### 第七步:在网易蜂巢上创建服务 287 | 打开蜂巢控制台:https://c.163.com/dashboard ,点击左侧菜单栏服务管理,可以使用默认空间,点击创建服务: 288 | 289 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-1.jpg) 290 | 291 | 创建服务总共分三步,可进可退。 292 | 293 | 第一步:设置服务名,服务状态,公网 IP 及计费模式设置,再点击下一步: 294 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-2.jpg) 295 | 296 | 第二步:选择镜像,设置容器名称即可,SSH秘钥用于远程登录,对于一个服务来说,可以不选,点击下一步: 297 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-3.jpg) 298 | 299 | 第三步:选择规格,默认SSD云硬盘,配置容器到服务的端口映射(对有状态的服务,对外暴露的端口默认还是容器端口),副本数限制为1,不到 5 分钱一个小时,非常实惠,立即创建: 300 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-4.jpg) 301 | 302 | 不到一分钟,服务创建成功: 303 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-5.jpg) 304 | 305 | 再点击详细信息,查看基本信息中的公网IP,此服务是:`59.111.114.43` 306 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-6.jpg) 307 | 308 | 打开浏览器,访问服务:`http://59.111.114.43:8080/`,发现同样输出了: 309 | 310 | ![image](http://163yun.nos-eastchina1.126.net/image%2Fspring-boot-docker-cloudcomb-7.jpg) 311 | 312 | *注:此镜像我已经在蜂巢上公开,地址是:https://c.163.com/hub#/m/repository/?repoId=41359 (你也可以直接在[蜂巢镜像中心](https://c.163.com/hub#/m/home/)搜索:`spring-boot-docker-cloudcomb`),打开收藏,即可直接基于该镜像创建 Spring Boot + Docker 的应用服务。* 313 | 314 | 至此,一个基于 Spring Boot 和 Docker 的应用就构建完成,并演示了如何在蜂巢上快速创建该应用的在线服务,希望对你有所帮助。 315 | 316 | ## 参考: 317 | - ☛ 源代码:https://github.com/163yun/spring-boot-docker-cloudcomb 318 | - ☛ Spring Boot:http://projects.spring.io/spring-boot/ 319 | - ☛ Docker: https://docker.com 320 | - ☛ 网易蜂巢: https://c.163.com 321 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | bingohuang.com 7 | spring-boot-docker-cloudcomb 8 | 0.1.0 9 | jar 10 | Spring Boot + Docker + Cloudcomb 11 | 一步步带你构建 Spring Boot + Docker 应用及网易蜂巢服务 12 | 13 | 14 | org.springframework.boot 15 | spring-boot-starter-parent 16 | 1.3.3.RELEASE 17 | 18 | 19 | 20 | 21 | 1.8 22 | 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-web 28 | 29 | 30 | org.springframework.boot 31 | spring-boot-starter-test 32 | test 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | org.springframework.boot 41 | spring-boot-maven-plugin 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /src/main/java/com/bingohuang/hello/Application.java: -------------------------------------------------------------------------------- 1 | package com.bingohuang.hello; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | * Sprint Boot 主应用入口 10 | * @author bingohuang.com 11 | * @date 2016.11.15 12 | */ 13 | @SpringBootApplication 14 | @RestController 15 | public class Application { 16 | 17 | @RequestMapping("/") 18 | public String home() { 19 | return "Hello Spring Boot, Docker and CloudComb!"; 20 | } 21 | 22 | 23 | public static void main(String[] args) { 24 | SpringApplication.run(Application.class, args); 25 | } 26 | 27 | } 28 | --------------------------------------------------------------------------------