本期实践的主要目标是开发一个简单的web应用,打包部署到Docker的tomcat容器中去; 第一期为了快速上手,获取docker是从国内的daocloud获取的,本期开始,为了更好的熟悉和了解Docker技术,我们的查找,pull和push都改为在Docker Hub上进行,即网站:hub.docker.com,建议各位去上面注册一个账号,这样就有自己的仓库可以保存镜像了。
在hub.docker.com上搜索tomcat,搜索结果的第一个就是官方镜像,如下图:
点击Detail按钮,进入详情页,可以发现有好多个tag,例如7.0.75这个,就是tomcat7.0.75版本:
这么多版本,究竟选哪个呢?我们还是先看看几个具体版本的差异吧,打开tomcat官网下的这个链接:http://tomcat.apache.org/whichversion.html
可以看到具体的差异:
可以看到,tomcat7 支持servlet3.0,可以满足我们的要求了,所以就用它吧,执行如下命令行即可下载镜像:
代码语言:javascript复制docker pull tomcat:7.0.75
命令执行有可能执行失败,多重试几次才行,pull成功后用docker images命令可以看到镜像:
来快速体验一下镜像的效果,执行命令:
代码语言:javascript复制docker run -it --rm -p 8888:8080 tomcat:7.0.75
–rm参数表示container结束时,Docker会自动清理其所产生的数据。
可以看到tomcat启动的日志全部打印在终端了,
因为我们用-p 8888:8080将容器的8080端口映射到当前电脑的8888端口,所以打开当前电脑的浏览器,输入:localhost:8888,可以看到熟悉的大猫:
接下来我们开发一个最简单的spring mvc应用,然后部署到docker的tomcat容器中试试,这我用的是IntelliJ IDEA CE,创建maven工程:
GAV信息如下:
如下图所示,通过这里增加一个mvn命令:
增加mvn命令:
配置命令如下:
接下来我们给web工程添加spring mvc支持,首先是web.xml文件,替换成下面这样:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1" metadata-complete="true">
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
完整的pom文件内容如下:
代码语言:javascript复制<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bolingcavalry</groupId>
<artifactId>helloworldwebapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>helloworldwebapp Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>helloworldwebapp</finalName>
</build>
</project>
在编译的时候遇到了一点小问题需要在此提一下,在工程上点击右键查看module属性,如下图:
此时看到的信息如下图所示:
注意在上图的绿色框框位置,如果你的工程中没有看到绿色框框中的内容,就用鼠标右键点击红色框框位置,在弹出的菜单中点击"Sources",这样就把java目录加入到工程的编译目录中去了。
这时候去执行mvn命令依然无法编译java文件,在工程上点击右键,执行mvn的reimport命令,如下图,执行完毕后就可以用mvn命令编译java文件了:
现在开始添加测试代码,先增加一个view目录,里面放个jsp文件,文件结构和jsp文件的内容如下:
再增加一个java文件,文件路径如下:
该文件的源码:
代码语言:javascript复制package com.bolingcavalry.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class FirstController {
@RequestMapping(value = "firstview", method = RequestMethod.GET)
public String index() {
return "firstview";
}
}
最后在webapp/WEB-INF目录下增加spring-servlet.xml文件,内容如下:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置扫描的包 -->
<context:component-scan base-package="com.bolingcavalry.*" />
<!-- 注册HandlerMapper、HandlerAdapter两个映射类 -->
<mvc:annotation-driven />
<!-- 访问静态资源 -->
<mvc:default-servlet-handler />
<!-- 视图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
好了,代码已经写完,可以打包了,执行我们刚才配置好的命令,如下图:
命令执行后,可以在target目录下看到war包:
现在我们把文件部署到tomcat上去,先建一个目录,例如我建了这个目录:/Users/bolingcavalry/temp/201703/10/share,然后把helloworldwebapp.war文件复制到这个目录下,再在控制台执行以下命令:
代码语言:javascript复制docker run --name helloworldwebapp -p 8888:8080 -d -v /Users/bolingcavalry/temp/201703/10/share:/usr/Downloads tomcat:7.0.75
这样就启动了一个容器,执行以下命令进入容器
代码语言:javascript复制docker exec -it helloworldwebapp /bin/bash
进入容器后再执行以下命令将war包复制到tomcat容器目录下:
代码语言:javascript复制cp /usr/Downloads/helloworldwebapp.war /usr/local/tomcat/webapps/
这时候再打开浏览器,输入http://localhost:8888/helloworldwebapp/firstview试试吧,如下图,符合预期:
此时,我们今天测试tomcat部署的目的已经达到了,接下来再试试提交镜像,在容器中输入exit 退出容器,再执行"docker stop helloworldwebapp"停止容器,然后执行以下命令把容器作为镜像保存在本地:
代码语言:javascript复制docker commit -a "bolingcavalry" -m "from tomcat 7.0.75,with a demo webapp" helloworldwebapp bolingcavalry/helloworldwebapp:0.0.1
-a : 作者 -m :提交时的说明文字 0.0.1:tag
执行完毕后,输入docker images,可以看到新增的镜像:
接下来我们试着把本地镜像提交到hub.docker.com去(前提是已经在这个网站上注册过),输入命令docker login,接下来按照提示输入用户名和密码,执行一下命令提交镜像:
代码语言:javascript复制docker push bolingcavalry/helloworldwebapp:0.0.1
有点费时,需要等待:
等上传成功后,再去hub.docker.com上看看吧,自己的仓库下面已经可以看到刚刚提交的镜像了: