先说我的目标
项目中要用到MySQL、Redis、RabbitMQ等,会部署到不同客户的服务器中。
为了简化部署,我希望在一台“母机”的Docker上配置好对应的服务器(以MySQL为例),并进行初始化(创建表、存储过程,还有初始的数据之类的),然后将容器打包成镜像,导出镜像,再在客户机上导入镜像,创建容器,运行
再说问题
1、如果用先后用 commit 、save 命令直接将“母机”上初始化好数据库的容器打包成镜像并导出,那么在客户机上 load、run 之后,发现数据库并没有初始化好
2、如果用 export 直接把“母机”上初始化好的容器导出,再导入到客户机时,总是提供要运行命令,加上命令 /bin/bash 导出虽然成功,但是不知道 mysql 有没有运行,而在“母机”上用 docker ps -a --no-trunc 查到的命令,又说找不到文件
还是说,Docker不是我这么用的?
Docker确实不是这么用的! Docker主打一个简单和纯粹,一个Image启动一个docker实例,就应该干一件事。
您这种多个有先后关联顺序的任务,是需要“编排”的,比如使用Kubernetes。 “编排”可以让几个容器先后完成几个任务,比如初始化容器做创建表和初始数据之类,数据库容器运行MySQL。
这样可以有利于镜像分工,您做好自己的初始化容器的镜像的制作和优化迭代,数据库则使用社区的公共镜像,未来假如出现新的CVE漏洞,只需要更新数据库镜像的tag就可以完成修补,而不必要自己再封装一次。
如果觉得Kubernetes太复杂,可以考虑使用简化后的K3S;如果不懂Kubernetes那一套,最起码也要学习使用docker-compose. 有了编排后,您的目标才算是找到正确的方向。
那这样的话,使用docker和我直接在linux上安装所需要的软件,似乎也没有什么太大的优势了。
无非就这么两点,一是docker上可能稍微简单那么一点点;二是,隔离性吧,如果一台linux主机上部署 redis, rabbitmq, tomcat…… docker 能够让它们相互之间的干扰变得更少。
还有其它优势吗