Docker完整打包项目
使用Docker打包一个完整的项目,开箱即用的那种 包含以下内容:
-
MySQL,完整数据库
-
Tomcat
-
web系统mqtt
项目背景
说明: 这个项目是我以前做的一个项目,关于物联网Iot的项目,包含web端和设备端; web端运行在浏览器,是系统的后台,设备端运行在智能设备上(智能香薰仪);项目使用阿里云的IotSDK和其提供的云端api; 项目不够成熟,希望大家指点
示意图:
设备端 <=> 阿里云 <=> 服务端
已经实现的功能:
- 全局消息广播
- 产品的信息查询,从产品新增设备
- 设备的状态查询,历史记录追踪,设备的上线、下线控制
- 设备监控,上线提醒,下线提醒
- 设备属性修改
- 用户登录
待实现功能:
- 用户权限模块
- 设备的ecahrts展示 。。。
步骤
- 编写DockerFile
- 打包镜像
- 上传
编写DockerFile
tomcatDocFile
[root@localhost ~]# cat tomcatDocFile
FROM tomcat
ADD mqtt2.war /usr/local/tomcat/webapps/
CMD ["catalina.sh","run"]
MAINTAINER linjinbao666@gmail.com
EXPOSE 8080
EXPOSE 80
[root@localhost ~]#
mysqlDocFile
[root@localhost ~]# cat mysqlDocFile
FROM mysql:5.7
MAINTAINER linjinbao666@gmail.com
#设置免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
#将所需文件放到容器中
COPY setup.sh /mysql/setup.sh
COPY schema.sql /mysql/schema.sql
COPY privileges.sql /mysql/privileges.sql
#设置容器启动时执行的命令
CMD ["sh", "/mysql/setup.sh"]
EXPOSE 3306
[root@localhost ~]#
打包镜像
docker build -f tomcatDockerFile -t linjinbao66/mqtt-web:1.0
docker build -f ......
运行镜像
docker run -dit -p8080:8080 linjinbao66/mqtt-web:1.0
docker run ......
上传到仓库
docker push linjinbao66/mqtt-web:1.0
遇到的问题:
- 多个FROM的问题
我在同一个DockerFile中写了FROM mysql
以及FROM tomcat
,意思是MySQL和tomcat同时打包,并且在同一层,但是测试结果是后一个会将前一个覆盖
源码地址:
其他相关脚本:
schema.sql
[root@localhost ~]# cat schema.sql
create database `mqtt3` default character set utf8 collate utf8_general_ci;
use mqtt3;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL,
`userid` varchar(255) NULL DEFAULT NULL,
`username` varchar(255) NULL DEFAULT NULL,
`userpass` varchar(255) NULL DEFAULT NULL,
`roleid` int(11) NULL DEFAULT NULL,
`login_name` varchar(255) NULL DEFAULT NULL,
`mobile` varchar(255) NULL DEFAULT NULL,
`email` varchar(255) NULL DEFAULT NULL,
`gen_time` varchar(255) NULL DEFAULT NULL,
`last_login_time` varchar(255) NULL DEFAULT NULL,
`login_count` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '1151301118', 'admin', '123321', 1, 'admin', '1519 5355289', '1576654308@qq.com', '', NULL, NULL);
[root@localhost ~]#
privileges.sql
[root@localhost ~]# cat privileges.sql
use mysql;
select host, user from user;
-- 因为mysql版本是5.7,因此新建用户为如下命令:
create user docker identified by '123456';
-- 将docker_mysql数据库的权限授权给创建的docker用户,密码为123456:
grant all on docker_mysql.* to docker@'%' identified by '123456' with grant option;
-- 这一条命令一定要有:
flush privileges;
update user set authentication_string = password('Gepoint'), password_expired = 'N', password_last_changed = now() where user = 'root';
flush privileges;
setup.sh
[root@localhost ~]# cat setup.sh
#!/bin/bash
set -e
#查看mysql服务的状态,方便调试,这条语句可以删除
echo 'service mysql status'
echo '1.启动mysql....'
#启动mysql
service mysql start
sleep 3
echo 'service mysql status'
echo '2.开始导入数据....'
#导入数据
mysql < /mysql/schema.sql
echo '3.导入数据完毕....'
sleep 10
echo `service mysql status`
#重新设置mysql密码
echo '4.开始修改密码....'
mysql < /mysql/privileges.sql
echo '5.修改密码完毕....'
sleep 3
echo `service mysql status`
echo `mysql容器启动完毕,且数据导入成功`
service mysql status
sleep 10
tail -f /dev/null
[root@localhost ~]#
备注:
我已经打包到镜像仓库了,你们可以直接pull
下来,命令:
docker pull linjinbao66/mqtt-web:1.0 && docker run -dit -p8080:8080 linjinbao66/mqtt-web:1.0
本文同步发布在个人博客上,docker完整打包一个项目