使用Docker技术快速搭建服务
前言
-
先说几句废话
Docker是一个开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 本文不再赘述Docker的意义和基础内容,不了解的同学可以先去看一些Docker的基础使用以及这门技术出现的意义。我们废话不多说,直接进入正题,如何快速搭建属于我们自己的服务。
-
说一下使用的工具和技术的版本
-
Spring boot版本是2.x
-
Java版本是JDK8
-
远程工具使用的是Xshell 6
-
使用的远程服务器是阿里云ECS
-
Maven版本是3.0.5
-
代码仓库是github
-
版本控制工具是Git
-
Docker版本是1.13.1
-
开发工具是Intellj IDEA旗舰版
建议使用版本不低于博主的版本。教程源码已托管到github,可以查看项目根目录下的README.md快速开始。
-
项目搭建
-
打开Idea,选择新建项目。
选择
Spring Initializr
,然后next
,填写“groupId”和“ArtifactId”之后,继续next
,勾选web
模块,不选也没关系,后面修改pom就行了,然后next
,然后finish
。 -
修改pom
打开
pom.xml
,主要修改Spring boot版本,这里只做一个hello world的demo,所以只需要web模块的依赖就够了。<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="xml" cid="n38" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies></pre> -
编写application.yaml
将application.properties修改为application.yml或者application.yaml,别问我为什么非要用yml格式,因为我想用这个格式。 这里只定义一下port就行了,我们先设置为9001,可以根据自己需要再进行修改。
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="sh" cid="n42" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> server:
port: 9001</pre> -
接口编写
新建一个TestController,内容如下:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n46" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> package com.yuhangma;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**- @author XinAnzzZ
- @date 2018/12/03 22:04
*/
@RestController
public class TestController {
@GetMapping("/test/docker")
public String testDocker() {
return "Hello Docker !";
}
}</pre>
-
启动测试
直接运行main函数,然后浏览器访问http://127.0.0.1/test/docker,浏览器正常显示,ok,进入下一步。
代码托管
-
新建仓库
进入Github,登录账户,需要注册的伙伴,自行百度。 新建一个仓库,名字自定义即可,建议不要勾选
Initialize this repository with a README
选项,否则推代码的时候有点麻烦。 为了避免出现不必要的麻烦,还是别勾选了,本文核心是Docker的操作,不是git,所以这里不想多bb。 -
代码上传
git的安装,自行百度,这个没难度,下载下来双击安装,然后无脑点击“下一步”就行了。 进入项目文件夹根目录,也就是
pom.xml
所在的目录,打开命令行,执行以下命令:<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="sh" cid="n58" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> // 初始化为git项目,此时文件夹中会多一个名为".git"隐藏文件夹
git init
// 添加到远程仓库 其中https://github.com/XinAnzzZ/test-domain-name是你刚刚新建的仓库地址,替换成你的就行了
git remote add origin https://github.com/XinAnzzZ/test-domain-name
// 将全部文件添加到git管理
git add .
// 提交到本地仓库
git commit -m "init"
// 推代码 期间可能出现让输入用户名密码,输入注册的github账号密码即可
git push origin master</pre>这时候去github刷新一下,应该就能看到推上去的代码了。
Docker部署服务
注意,这一步的前提是你的环境都已经准备好了。Jdk8 + Maven + Git + Docker + Docker-Compose。安装过程自行百度或者私聊博主,有时间的话博主专门出个安装教程。
-
拉取镜像
进入Docker官方仓库,搜索“maven”,选择最多下载量的就对了,然后选择合适的版本, 不知道选啥?那就看我选啥你选啥吧。 回到Xshell,执行
git pull maven:[版本号]
,博主的版本是git pull maven:[3.5.4-jdk-8-alpine]
。 等待完成,执行docker images
,会发现已经拉取下来了maven的镜像。 也可以不做这一步,因为启动容器的时候,如果docker发现没有对应的镜像会自动去拉取。 -
拉取代码
进入自己的工作目录,这里我们起名叫“/docker/java-service”。 然后进入这个目录,执行
git clone https://github.com/XinAnzzZ/test-domain-name
,完成。 -
脚本编写
进入/docker/java-service/test-domain-name目录,执行
vim docker-entrypoint.sh
新建docker端点文件。<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="sh" cid="n72" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> #!/bin/bash
cd /usr/src/mymaven
mvn clean install -Dmaven.test.skip
cd ./target
java -jar -Dserver.port=9001 test-domain-name-0.0.1-SNAPSHOT.jar</pre><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="sh" cid="n75" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Monaco, Consolas, "Andale Mono", "DejaVu Sans Mono", monospace; margin-top: 0px; margin-bottom: 20px; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; white-space: normal; position: relative !important; padding: 10px 30px 10px 0px; border: 1px solid; width: inherit; background-position: inherit inherit; background-repeat: inherit inherit;"> version: '2'
services:
java_service_test_domain_name:
container_name: java-service-domain
image: maven:3.5.4-jdk-8-alpine
volumes:- /root/.m2:/root/.m2
- /docker/java-service/test-domain-name:/usr/src/mymaven
ports: - "9001:9001"
command: "/bin/sh /usr/src/mymaven/docker-entrypoint.sh"</pre>
volumes
指的是目录映射,这个算是docker里面比较难理解的概念。我们可以暂时这么理解,我们操作/docker/java-service/test-domain-name目录就等于操作/usr/src/mymaven目录。 比如说,我们在/docker/java-service/test-domain-name里面新建了一个文件,那么docker容器里面/usr/src/mymaven目录下就会也新建同样的文件。 那么/docker/java-service/test-domain-name里面放的是什么呢?其实就是我们项目的源代码,这样一来,相当于我们把我们的源代码放到了docker容器的/usr/src/mymaven目录下面。 结合第一个脚本文件,我们发现,容器启动的时候,会进入/usr/src/mymaven目录下执行打包操作,是不是很巧妙呢? 我们做了目录映射将我们的源代码目录映射到了容器的某个特定目录下面,然后启动的时候打包运行,简直完美!命令解释,
container_name
是指定容器名称。image
表示使用的镜像名称。ports
表示端口映射,将linux主机的9001端口映射到docker容器的9001端口。 也就是说外部请求服务器的9001端口,那么等于请求docker容器内的9001端口,而我们的项目又监听了9001端口,这样我们就能够处理外部的请求了。command
指的是运行是执行的命令,这里执行了上面的入口脚本文件。执行
vim docker-compose.yml
新建docker-compose的配置文件。脚本解释,这个是docker-compose的入口脚本文件,简单来讲就是容器启动的时候会执行这个脚本。 我们可以看到,这个脚本首先进入到/usr/src/mymaven目录执行了maven编译打包的操作,其中
-Dmaven.test.skip
表示跳过maven代码测试环节。 打包完成,进入target目录,运行了打包好的jar包。不太明白什么意思?接着往下看,结合下面的解释,你就能看懂。 -
运行容器
进入“docker-compose.yml”文件所在的目录,也就是/docker/java-service/test-domain-name目录下,执行
docker-compose up -d
,容器就启动起来了。 这时候进入浏览器输入http://ip:9001/test/docker,就能访问到我们的项目。注意,linux要开启对应的端口哦。
整个的开发部署过程还是相对麻烦的,需要各位同学对git、maven、linux、docker都要有一定的了解,希望各位想学技术的小伙伴不要放弃,坚持按照教程做下去。 基础不够的同学暂时不用纠结,看看热闹就行了。 各种技术都了解但是一直搞不定的同学,欢迎私聊博主,也许博主不会,但是如果是漂亮妹子,博主还是愿意手把手教的,手动滑稽(我老婆看见会打死我的,2333333...)。 最后,各位加油~~~
网友评论