Docker学习笔记之二:web开发和Tomcat部署

本期实践的主要目标是开发一个简单的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,可以满足我们的要求了,所以就用它吧,执行如下命令行即可下载镜像:

docker pull tomcat:7.0.75

命令执行有可能执行失败,多重试几次才行,pull成功后用docker images命令可以看到镜像:

来快速体验一下镜像的效果,执行命令:

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文件,替换成下面这样:

<?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文件内容如下:

<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文件,文件路径如下:

该文件的源码:

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文件,内容如下:

<?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文件复制到这个目录下,再在控制台执行以下命令:

docker run --name helloworldwebapp -p 8888:8080 -d -v /Users/bolingcavalry/temp/201703/10/share:/usr/Downloads tomcat:7.0.75

这样就启动了一个容器,执行以下命令进入容器

docker exec -it helloworldwebapp /bin/bash

进入容器后再执行以下命令将war包复制到tomcat容器目录下:

cp /usr/Downloads/helloworldwebapp.war /usr/local/tomcat/webapps/

这时候再打开浏览器,输入http://localhost:8888/helloworldwebapp/firstview试试吧,如下图,符合预期:

此时,我们今天测试tomcat部署的目的已经达到了,接下来再试试提交镜像,在容器中输入exit 退出容器,再执行”docker stop helloworldwebapp”停止容器,然后执行以下命令把容器作为镜像保存在本地:

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,接下来按照提示输入用户名和密码,执行一下命令提交镜像:

docker push bolingcavalry/helloworldwebapp:0.0.1

有点费时,需要等待:

等上传成功后,再去hub.docker.com上看看吧,自己的仓库下面已经可以看到刚刚提交的镜像了:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT笔记

svnant不支持svn版本1.7

看了标题进来的吧,话说事情是这个样子的。以前SVN服务版本是1.6,svnant版本是1.3.1,官网明确说明只支持到1.6.x。由于升级了SVN版本到1.7,...

3126
来自专栏数据结构笔记

Django搭建博客(五):为博客添加后台管理功能

上一篇我们还留了一个小问题没有解决,其实这个问题我是特意留到这一篇来讲的,请往下看 ⇩

1204
来自专栏无原型不设计

[桌面版] 在 Mockplus 2.1 (预览版)中使用切换面板

1、添加切换面板 2、双击编辑切换面板当前页。 3、退出当前页编辑,点击组件上工具条上的加号,增加一个内容页并编辑内容 4、添加响应用户事件的组件。...

2645
来自专栏Java技术栈

Spring Boot - Profile不同环境配置

Profile是什么 Profile我也找不出合适的中文来定义,简单来说,Profile就是Spring Boot可以对不同环境或者指令来读取不同的配置文件。 ...

3304
来自专栏IMWeb前端团队

webpack2 终极优化

? webpack是当下最流行的js打包工具,这得益于网页应用日益复杂和js模块化的流行。webpack2增加了一些新特性也正式发布了一段时间,是时候告诉大...

33411
来自专栏SpringBoot 核心技术

第二十三章:SpringBoot项目多模块打包与部署

2183
来自专栏码神联盟

框架 | SpringBoot项目发布到自动化容器Docker步骤

2853
来自专栏vue学习

5.vue-router之什么是编程式路由

首先我们来讲讲简单的,上面两个方法记住,等效的。 ① 还是在test.vue组件里面写个div并给它添加一个click跳转事件:

883
来自专栏醉梦轩

修复Linux内核文件丢失问题

1542
来自专栏性能与架构

nginx虚拟主机配置

虚拟主机的概念 虚拟主机,就是把一台物理服务器划分成多个“虚拟”的服务器,每一个虚拟主机都可以有独立的域名和独立的目录 nginx虚拟主机的配置 nginx的虚...

4685

扫码关注云+社区