Docker-Compose 踩坑实录

为什么使用Docker-Compose

    经常在项目开发完成交付部署的时候由于部署的服务器环境配置各不相同, 同时各个服务部署分开维护成本略高, 开始倾向于容器化部署来解决各种可能出现的问题; 同时Docker-Compose能够减少部署时候操作的步骤(也就减少了运维人员出错的机会);

Docker-Compose的安装

    具体的安装不再赘述, 只说目前在Docker-Compose安装中遇到的问题; 在版本的时候还是要从官网获取推荐的release版, 截止到当前(2021年11月17日)推荐的版本为1.29.2, 推荐的下载地址可以参考官网sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose;
    由于个人的臭毛病, 习惯使用最新的从Github上直接找到的Latest版本为2.1.1, 然后再执行docker-compose up -d 之后无论成功与否都会出现大量的临时容器(Dockerfile在构建镜像过程中每一步所创建的临时容器), 在检查完自身的docker-compose.yml和Dockerfile没有问题之后发现Latest版本并非是当前的release版... 最终切换回1.29.2版本之后问题解决;

Docker-Compose.yml

    具体的书写内容格式和标签可以直接参考官网https://docs.docker.com/compose/compose-file/, 目前主要的版本为2和3, 区别还是比较大的;
    由于发布的服务涉及到使用nvidia-docker来部署, 所以docker创建容器时需要用到--runtime=nvidia扩展参数,在version: "3"的版本格式中发现runtime被官方定义为了DEPRECATED, 目前之后2.X版本还在支持这个标签; 同时由于想要对容器的使用资源有所限制, 需要cpu以及memory方面的limit控制, 在核对文档时候悲剧的发现相关的限制被移到了deploy的标签下面并同时标注写到" This only takes effect when deploying to a swarm with docker stack deploy, and is ignored by docker-compose up and docker-compose run", 简单来说就是除非用的是docker swarm或者docker stack的时候其他的时候不会生效, 比如docker-compose up和docker-compose run.这就导致了目前3.X版本的配置无法满足当前的需求... 所以最终定板为2.X的版本.
     知道了版本之后对于docker-compose.yml的书写方面没有什么东西好赘述的就不再细说了, 本文只记录遇到的问题;

踩完了Docker-Compose之前Dockerfile留下的坑

之前由于多数环境并不是容器化的在本次容器化部署的时候就遇到了相关的问题(欠的坑总是要还的...).

MySQL

    MySQL只是简单部署的话问题不大, 只是在初始化数据库数据的时候并没有注意到本身提供了初始化脚本的存放位置, 固执的在Dockerfile中写了一个CMD命令去执行mysqlimport命令. 但是这就遇到了一个问题... 众所周知CMD只会执行最后一条脚本,如果CMD去执行导入的话就无法去执行mysqld这个启动命令...如果重新写一个ENTRYPOINT的话mysqlimport执行完成之后主进程就会停止...然后容器也会被停止.万幸最后在Docker Hub上发现了有这个docker-entrypoint-initdb.d这个文件夹只要配置好MYSQL_DATABASE这个参数就会到指定数据库中去执行里面的脚本;

Redis

    Redis遇到的问题来自官方...由于Redis的官方镜像中有一个描述: 如果需要使用cluster来部署的话--network需要设置为host, 即完全使用主机的网络. 如果不在意的话问题也不是很大, 但是就部署而言我更希望的是整个服务暴露出来的就只有页面对应的一个端口这就导致了redis的官方镜像无法满足我的需求. 索性在Docker Hub上搜索redis cluster找到了一个下载量和官方不相上下的bitnami/redis. 是的就是他成功的满足了我完全不暴露任何软件端口的需要(enen 实名表扬一下);

     至此本次服务容器化一键部署的问题就全部解决了, 当然里面肯定有地方不是最优处理办法不过后续找到了很好的解决方案再说, 作为第一次Docker-Compose部署就算是完成了.如果里面有什么问题欢迎看到的大佬帮忙指出来;

共勉!

posted @ 2021-11-17 19:11  Hugiee  阅读(695)  评论(0)    收藏  举报