docker构建微服务

在suframe/think 和 suframe/think-admin大致开发接近尾声的时候,如何让这些业务代码顺利跑起来就是一个重要的工作了。

在传统模式下,一般是写脚本,把文件同步到n台机器,机器环境也是通过脚本一台台去创建,然后就是去改无数多的配置。那真的是痛不欲生,一旦出了问题,就通宵达旦,头发掉光。

docker的出现,改变了这种情况。

docker 可以看作一个集装箱,里面有你服务运行的所需环境,并且,这个环境可以快速的进行复制和管理。一个php的容器也就几十m,加上你所需的库,扩展和业务代码,也就百来兆,想想以前一个虚拟机的大小,没有对比就没有伤害。

其实我用docker一直都是单机,当成开发环境容器来用,并没有做线上集群和应用。正好借此机会撸一把。

那到底如何使用docker进行开发和生产环境的部署和运维呢?

通过收集大量的文档和实践,理清楚了一些思路,整理下来备以后使用。

微服务开发中,docker所涉及的东西

  • 1.docker基础
    包括:容器,镜像,仓库等概念,基本概念理清楚了,才有后面的更进一步的。至少你得知道你怎么安装docker,怎么拉查找和拉去一个php或者nginx镜像,运行一个容器,如何映射端口和目录,如何停止,删除容器或镜像等,总之在单机上你得会用docker的相关命令。 从0开始的当然看菜鸟教程比较合适:https://www.runoob.com/docker/docker-tutorial.html
  • 2.dokcerfile
    在会使用了的情况下,你现在都是用的别人的镜像,而实际中,你会需要根据自己的业务情况,构建自己的镜像。dockerfile就是用于构建镜像的文件, 他其实命令比较少,也比较好理解,可以概括为: 选一个基础镜像,设置环境变量,加入自己的库和文件,执行命令,我构建的一个基于php:7.4-cli-alpine的dockerfile,装了swoole扩展,https://github.com/suframe/think-docker/blob/master/Dockerfile。 alpines操作系统是一个面向安全的轻型 Linux 发行版,很小,很适合作为容器的系统。

通过dickerfile,我们可以快速的docker build -t [名字]:[版本] . 构建一个镜像

  • 3.Docker Compose
    当我们的dockerfile越来越多,比如php,nginx,mysql,redis,memcache...等等,还有些业务的dockerfile,难道我们得一个个去build? 当然不是,Docker Compose可以通过yml配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务
  • 4.Docker Machine
    好了,现在你手上有10台甚至上百台机器或者虚拟机了,如何管理这些机器就需要使用到docker machine了,使用 docker-machine 命令,您可以启动,检查,停止和重新启动托管主机,也可以升级 Docker 客户端和守护程序,以及配置 Docker 客户端与您的主机进行通信。 比如你机器上装了virtualbox ,就可以通过 docker-machine create --driver virtualbox test快速创建一台虚拟机,并且通过docker-machine进行管理。其他非虚拟及主机一样。
  • 5.swarm 集群管理
    服务准备好了,主机准备好了,需要把这些主机整合起来,把服务快速的部署和维护,swarm就是docker的集群管理工具,它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

以上就是人称的docekr三剑客machine、compose、swarm。
Docker Machine:预配机器,可以是虚拟机器也可以是物理机器,并可以在若干纯物理机器上运行Docker容器
Docker Compose:用户可以快速定义Dockerfile,通过简单但是强大的YAML语法描述行为,并且只需要把这些文件“组合”起来就可以启动应用程序
Docker Swarm:强大的集群工具,让用户以为自己管理的是单个巨大的Docker宿主机,而这个宿主机是由很多Docker宿主机组成的

当然还有更强大的k8s后面慢慢撸。

网上docker集群集群搭建的教程比较多,这里就不赘述了

  • 6.微服务化后,业务代码到底放哪里
    其实这个问题没有标准答案,只能说不同场景适合不同的方案,只能结合你自身业务和需求来决定,网上摘抄了3种场景,但也不是标准答案。

场景一:如果做好了所有代码,想分发给其他使用者,这种无疑代码放到image是最佳的,包括数据库初始化脚本等。

场景二:如果是开发环境,代码是用于调试,代码不应该在image里面,代码最好是在本机电脑上,如MacOS,Windows,Linux的个人PC上,那么就通过volume方式进行挂载是最方便的,修改代码直接就可以进行调试。如果开发环境在服务器上,可以通过远程mount的方式,mount到本机进行开发修改。

场景三:如果是测试环境,建议使用git方式,代码不在image中,通过docker exec到容器内pull对应测试tag的代码。当然也可以在宿主机pull,然后docker cp到对应的测试容器。

好了,接下来就是去实践了

参考资料:
菜鸟教程
Docker入门总结
alpine
docker-machine介绍和使用
swarm构建虚拟主机集群
docker发布项目的一般性步骤
从代码到上线, 云端Docker化持续交付实践
我应该在部署时将代码添加到Docker镜像中么?
代码放在Docker里面还是外面?
docker之DockerSwarm调整微服务及服务配置
使用Docker Machine管理阿里云ECS

安装

docker-machine(速度超慢最好科学上网)

base=https://github.com/docker/machine/releases/download/v0.16.0 &&   curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&   sudo mv /tmp/docker-machine /usr/local/bin/docker-machine &&   chmod +x /usr/local/bin/docker-machine

docker-machine -v

virtualbox

curl -L https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo > /etc/yum.repos.d/virtualbox.repo
curl -L https://download.virtualbox.org/virtualbox/6.1.0/VirtualBox-6.1-6.1.0_135406_el7-1.x86_64.rpm > /etc/yum.repos.d/VirtualBox-6.1-6.1.0_135406_el7-1.x86_64.rpm 

yum update
yum clean all
yum makecache
yum search VirtualBox
#选一个版本
yum install VirtualBox-6.1

创建虚拟机:

docker-machine create --driver virtualbox test

之间除了点小问题

Error with pre-create check: "We support Virtualbox starting with version 5. Your VirtualBox install is \"WARNING: The vboxdrv kernel module is not loaded. Either there is no module\\n         available for the current kernel (3.10.0-514.el7.x86_64) or it failed to\\n         load. Please recompile the kernel module and install it by\\n\\n           sudo /sbin/vboxconfig\\n\\n         You will not be able to start VMs until this problem is fixed.\\n5.2.0r118431\". Please upgrade at 

解决:

/etc/init.d/vboxdrv setup
#看到错误是 Please install the Linux kernel "header" files matching the current kernel
yum install gcc perl make
yum install kernel-devel
#然后重启服务器!!!!!

标签: 无

发表评论: