一、应用场景
在做项目的过程中,服务器端的部署是一个非常重要的场景,当客户的服务器是Linux/Unix系统时,用Docker容器来部署最方便不过了,Windows场景下Docker的支持也比较完善了,使用Docker部署能够给我们带来方便、快捷的体验。
二、应用项目综述
本文中项目的开发环境是基于spring+springMVC+mybatis的maven项目。开发的IDE是IntelliJ IDEA 2017.1.4,服务器是使用Tomcat 9.0.0.M21,数据库使用MySQL 5.7。最后部署测试环境是MacOS Sierra 10.12.3
三、安装Docker
工欲善其事,必先利其器。首先我们应该在开发机器上安装Docker。关于Docker的安装,这里就不详细叙述了,官网的步骤都很详细,给大家搬运一下网址:
1、Docker官网:https://www.Docker.com/
2、Mac安装方式:http://docs.Docker.com/mac/started/
3、Linux安装方式:http://docs.Docker.com/linux/started/
4、Windows安装方式:http://docs.Docker.com/windows/started/
四、部署正式开始
好了,做好了前三步准备工作,我们假定项目已经开发完毕,Docker也正确安装在了你的测试机器上,你也学习了一些Docker的操作命令,不是一个完全的小白了,我们就可以开始部署应用了。
1、创建MySQL容器
下载MySQL镜像
启动Docker的情况下,在终端中输入 docker search mysql命令可以搜索到各式各样的MySQL镜像,我们选择star最多的MySQL官方镜像。
然后输入:docker pull mysql命令,将这个镜像拉到本地(有可能会比较慢,可以使用阿里云加速或者fanqiang)。
拉取完成后,在本地输入:docker images 查看镜像可以看到如下图中所示,说明你的镜像已经拉取成功。
创建MySQL容器
启动容器:MySQL可以直接把端口地址映射到宿主机上,但是在生产环境中映射宿主主机有可能会造成端口冲突等一系列问题,所以我们用容器互联的方法,让MySQL的端口只暴露给Tomcat服务器,命令如下:
docker run --name health-tomcat -v /home/mysql_data:/var/lib/mysql --restart=always -e MYSQL_ROOT_PASSWORD=123456 -d
-v:容器的/var/lib/mysql目录挂载在主机的/home/mysql_data目录
-e 设置默认参数,支持参数:
• MYSQL_ROOT_PASSWORD
• MYSQL_DATABASE
• MYSQL_USER, MYSQL_PASSWORD
• MYSQL_ALLOW_EMPTY_PASSWORD
• MYSQL_RANDOM_ROOT_PASSWORD
• MYSQL_ONETIME_PASSWORD
我们用MYSQL_ROOT_PASSWORD=123456是给默认的root用户设置密码为123456.
进入容器:
使用命令 docker exec -it health-mysql mysql -uroot -p进入MySQL容器,在Enter password:输入你刚刚设置的密码。进入之后的操作跟你在自己电脑上安装MySQL后的操作一样。
导入宿主机.sql文件到MySQL容器的数据库中:
先查看MySQL运行名称:docker ps, NAMES栏底下为名称
进入刚刚创建的容器:docker exec -it health-mysql mysql -uroot -p
创建一个数据库:create database health_data
退出MySQL环境
将宿主机文件导入:MySQL容器名称为:health-mysql, 容器中数据库名称为:health_data
执行:docker exec -i health-mysql mysql -u root -p123456 health_data < /Users/jacob/Desktop/health_data.sql
2、创建Tomcat容器并且用--link连接到MySQL容器
1、下载镜像:docker pull tomcat
2、创建一个本地目录:/Users/jacob/Desktop/tomcat_data,把项目的war包放到这个本机文件夹。需要注意的是,在容器互联的时候需要为MySQL容器创建一个别名,在项目的jdbc.properties中jdbc.url=jdbc:mysql://tomysql:3306/guotai?useUnicode=true&characterEncoding=utf-8,3306端口前的tomysql就是通过数据库别名,这样才能访问项目,他相当于localhost/你的IP地址。所以在导出war包之前,先想好你的数据库别名,然后把3306前面的名称和你的数据库别名设置成一致然后导出(很关键!!!)
3、创建Tomcat容器并连接到MySQL
直接线上命令,然后解释
docker run -d -p 8888:8080 -v /Users/jacob/Desktop/tomcat_data:/usr/Downloads --name health-tomcat --link health-mysql:tomysql tomcat
1、-p后面是把Tomcat的8080端口映射到8888端口,部署后用8888来访问。
2、-v /Users/jacob/Desktop/tomcat_data:/usr/Downloads 把/usr/Downloads目录挂载到你的房war包的本地目录,为一会拷贝war包到Tomcat容器做准备。
3、--name health-tomcat 为你的Tomcat容器起一个名字
4、--link health-mysql:tomysql 这步就是实现互联,health-mysql就是你一开始第一步创建的MySQL容器的名称,冒号后面就是MySQL容器在Tomcat容器中的别名,这个别名要和你项目的jdbcurl 3306端口前的名称一致,这样才可以建立数据库连接(谨记)
5、tomcat 这个就是你的镜像名称
执行完容器创建后,我们需要把war包从本机拷贝到Tomcat服务器中。
首先:执行以下命令进入容器:docker exec -it health-tomcat /bin/bash
进入容器后再执行以下命令将war包复制到tomcat容器目录下:cp /usr/Downloads/Demo.war /usr/local/tomcat/webapps/
/usr/Downloads/Demo.war是你刚刚挂在的本地存放war报的目录
/usr/local/tomcat/webapps/是Tomcat容器中你要把war包拷贝到这里
此时,准备工作已经全部结束,享受成果吧!
在浏览器输入URL:http://localhost:8888/Demo/
8888是你刚刚在创建容器时给8080端口映射的端口值,Demo是你的war包的名字,在访问你的API的时候要加上war包名字这个路径。
好了,这是我部署的一些经验。每个项目具体的差异会造成操作步骤和命令上的差异,才疏学浅,错误在所难免,希望大家批评指正!