Docker Tomcat容器中引用mysql容器

来源:互联网 发布:underscore.js如何 编辑:程序博客网 时间:2024/04/27 21:31

docker 的定义这里就不说了。那种概念性的东西我不太会总结…自己的理解就是它是用来代替装在虚拟机中的服务器的东西,并且对于每一个“虚拟机”,docker中的占用硬盘比虚拟机的少,性能比虚拟机的高。(仅本人理解,具体自己网上搜或到官网看)
我用的ubuntu kylin 15.10 x64的操作系统。安装Docker:
终端中运行:

sudo apt-get install docker.io

Docker支持 LinuxMacWindows 等,具体安装方法详见官网。

安装后Docker之后,下载centos镜像,这里下载的是6.7版本:

sudo docker pull centos:6.7

之后下载mysql,这里下载的是最新版:

sudo docker pull mysql

在 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载对应操作系统的java(jre或jdk)。
这里下载的是 jdk-8u73-linux-x64.tar.gz

在主目录下建立 app 文件夹,即: /home/[用户名]/app,我的用户名为 sccss,则命令为:

mkdir ~/app

或:

mkdir /home/sccss/app

jdk-8u73-linux-x64.tar.gz 所在文件夹下运行:

cp jdk-8u73-linux-x64.tar.gz ~/app

jdk-8u73-linux-x64.tar.gz 复制到app目录下。然后运行:

tar zxvf jdk-8u73-linux-x64.tar.gz

解压后的文件夹为 jdk1.8.0_73 。该文件夹下有 jre 文件夹。运行:

cp -R jdk1.8.0_73/jre .

jre目录复制到 app目录下。
同样的方法,在 http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.32/bin/apache-tomcat-8.0.32.tar.gz 下载tomcat8.0.32,并解压到app目录下。运行:

mv apache-tomcat-8.0.32 tomcat

将文件夹改名为 tomcat ,方便之后使用。
使用使用右键菜单或命令行(touch命令 或 vim 命令)创建文件并编辑内容为(vim介绍起来有点多了,不会使用的可自己网络搜索使用方式 。docker下载的centos:6.7中没有vim命令,只有vi命令。):

文件 env.sh

#!/bin/bash#Set Environmentexport JRE_HOME=/root/app/jreexport PATH=$PATH:$JRE_HOME/bin

文件 run.sh

#!/bin/bash#Run tomcatecho "Set environment..."source /env.shecho "Run tomcat..."exec /root/app/tomcat/bin/catalina.sh runecho "End ..."

文件 start.sh

#!/bin/bash#Start tomcatecho "Set environment..."source /env.shecho "Start tomcat..."sh /root/app/tomcat/startup.sh

文件 stop.sh

#!/bin/bash#Stop tomcatecho "Set environment..."source /env.shecho "Stop tomcat..."sh /root/app/tomcat/shutdown.sh 

env.sh 设置了JRE_HOMEPATH环境变量,以便tomcat可以找到java
run.sh 运行tomcat并显示日志,运行后按下Ctrl+c 停止tomcat。
start.sh 启动tomcat后退出。
stop.sh 关闭启动的tomcat。与 start.sh对应。

再之后,需要准备一个测试的javaWeb项目,用来确认之后是否连接到了Mysql服务器。
这里准备了一个简单的测试项目war包:http://pan.baidu.com/s/1eRjzTbc 密码: qa7h
下载后放入新建立的文件夹,我这里是 /home/sccss/tmp/,即 war 路径为 /home/sccss/tmp/test.war
运行后,访问 http://host:port/test/mysql 来测试,mysql root密码应为 123
对应Servlet代码如下:

public class MySQLServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doPost(request, response);    }    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        PrintWriter out = response.getWriter();        Connection conn = null;        PreparedStatement stat = null;        ResultSet res = null;        try {            Class.forName("com.mysql.jdbc.Driver");            conn = DriverManager.getConnection("jdbc:mysql://mysql-host:3306/mysql", "root", "123");            stat = conn.prepareStatement("select user from user where user='root'");            res = stat.executeQuery();            if (res.first()) {                String name = res.getString("user");                out.println("连接数据库成功! --" + name);            } else {                out.println("连接数据库成功! -but now data-");            }        } catch (ClassNotFoundException e) {            System.err.println("数据库驱动加载失败...");            e.printStackTrace();            out.println("数据库驱动加载失败...");            out.println(e.getMessage());        } catch (SQLException e) {            System.err.println("数据库连接或执行失败...");            e.printStackTrace();            out.println("数据库连接或执行失败...");            out.println(e.getMessage());        } finally {            if(out != null){                out.close();            }            if(res != null){                try {                    res.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if (stat != null) {                try {                    stat.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }            if (conn != null) {                try {                    conn.close();                } catch (SQLException e) {                    e.printStackTrace();                }            }        }    }}

可以看到,连接成功后会打印 连接数据库成功! –root

零件准备好了,下面开始组装。
首先构建一个mysql的运行容器,运行(mysql 镜像的使用说明在 : https://hub.docker.com/_/mysql/):

sudo docker run --name mysql-server -e MYSQL_ROOT_PASSWORD=123 -d mysql

以上命令将会由 mysql:lastest 镜像运行一个mysql root密码为 123 的名为 mysql-server的容器,-d参数表示后台运行且打印容器id。

之后运行以下命令来查看容器列表:

sudo docker ps -a

应该可以看上去一个名为 mysql-server 容器。

现在来创建tomcat的镜像。

首先运行一个tomcat 容器,并挂载 /home/sccss/app 目录到 /app。命令如下:

sudo docker run -ti -v /home/sccss/app:/app centos:6.7 /bin/bash

运行上面的命令后会进入容器的shell。
依次运行以下命令:

#在/root下创建app文件平夹mkdir  /root/app#将jre、tomcat复制到 /root/app下,将env.sh复制到/root下cp -R /app/jre  /root/app/cp -R /app/tomcat  /root/app/cp /app/env.sh  /root/#将 run.sh start.sh stop.sh 复制到 / 下cp /app/run.sh  /cp /app/start.sh  /cp /app/stop.sh  /

运行以下命令退出容器:

exit

运行以下命令查看刚刚配置tomcat环境的容器id

sudo docker ps -a

查看刚刚运行的镜像(IMAGE)为 centos:6.7的容器Id,这里是 849717a506b7
运行以下命令将容器转换为镜像:

sudo docker commit 849717a506b7 sccss/tomcat:v1

这里将其提交为 sccss/tomcat,版本为 v1 ,名字可根据自己喜好起。

运行以下命令查看镜像:

sudo docker images

mysql容器已经配好并运行起来,tomcat镜像也已经准备好了。下面就开始 牵个线,搭个桥,让它们结合:

sudo docker run -ti -v /home/sccss/tmp:/root/app/tomcat/webapps -p 18080:8080 --link mysql-server:mysql-host sccss/tomcat:v1 /bin/bash

解释一下这条命令: 将主机上的 /home/sccss/tmp目录(存放有test.war)映射到容器的 /root/app/tomcat/webapps, 这样的话,运行容器中的tomcat将会读取我们的test.war。将主机的 18080 映射到容器的 8080,这样可以直接访问主机的18080端口来访问容器中的tomcat中的项目。将name为 mysql-server 的容器地址映射到tomcat容器内部,并命名为 mysql-host 。这样就可以在tomcat容器中通过 mysql-host 访问mysql-server了。见上面servlet源码中的数据库连接语句:jdbc:mysql://mysql-host:3306/mysql

万事具备,只欠运行:

sh /start.sh

现在,打开电脑上的浏览器,访问: http://localhost:18080/test/mysql 查看输入。

ps: 以上代码已经在脑子里跑了一遍,没有问题。。。     若你操作时有问题,请留言,我会修改。 docker我也是初学者,哈哈~~~ 
0 0
原创粉丝点击