2019-10-17-Docker完整打包一个项目

Docker完整打包项目

使用Docker打包一个完整的项目,开箱即用的那种 包含以下内容:

  1. MySQL,完整数据库
  2. Tomcat
  3. web系统mqtt

项目背景

说明: 这个项目是我以前做的一个项目,关于物联网Iot的项目,包含web端和设备端; web端运行在浏览器,是系统的后台,设备端运行在智能设备上(智能香薰仪);项目使用阿里云的IotSDK和其提供的云端api; 项目不够成熟,希望大家指点

示意图:

设备端 <=> 阿里云 <=> 服务端

已经实现的功能:

  1. 全局消息广播
  2. 产品的信息查询,从产品新增设备
  3. 设备的状态查询,历史记录追踪,设备的上线、下线控制
  4. 设备监控,上线提醒,下线提醒
  5. 设备属性修改
  6. 用户登录

待实现功能:

  1. 用户权限模块

  2. 设备的ecahrts展示

    。。。

步骤

  1. 编写DockerFile
  2. 打包镜像
  3. 上传

编写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

遇到的问题:

  1. 多个FROM的问题

我在同一个DockerFile中写了FROM mysql 以及FROM tomcat,意思是MySQL和tomcat同时打包,并且在同一层,但是测试结果是后一个会将前一个覆盖

源码地址:

码云 GIthub

其他相关脚本:

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完整打包一个项目