利用Docker搭建开发环境

一、 前言

随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖。这些现象导致开
发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现并行开发的情况特别是针对数据库的变动或数据的更改常常会
导致其他开发人员无辜增加问题的排查时间,导致整体的开发效率降低,同时对于远程协助也造成了巨大的障碍。为了解决上述存在的问
题,将会利用Docker Compose技术辅助开发人员对于开发环境的搭建,最终实现开发人员只要装有Docker就可以完成整个开发环境的搭
建。

二、 基本操作

为了标准化这一过程,需要开发人员新建docker-compose.yml在项目跟目录下,并按照其规范的格式进行填写,考虑到许多的系统均需
要依赖存在基本数据的数据库所以建议在跟目录下新建dbinit文件夹,将数据库初始化等相关的文件放入其中,后期对于存在依赖多数
据的情况将考虑在dbinit下新建二级目录以区别不同的数据库。

对于基本的使用方式这里以Sino.BackgroundJobService为例进行说明:

  1. 打开cmd并进入项目根目录
cd /D G:SinoOschinaGit	msackjob
  1. 启动Docker Compose
docker-compose up  #在前端执行
docker-compose up -d  #在后台执行

注意:需要确保Docker for Windows是否开启。

  1. 停止Docker Compose
docker-compose stop
  1. 删除Docker Compose
docker-compose rm

三、 MySql开发环境

我司大量业务系统均依赖MySql做为核心业务数据库,且业务系统均需要依赖基本的原始数据支持基本的运行,所以不能单纯的直接利
用MySql镜像而是需要进行数据库的初始化后使用,所以要求在dbinit文件夹下需要用户新建Dockerfile文件以及my.cnf文件对数据
库进行自定义,其中Dcokerfile的文件内容要求如下:

FROM mysql:5.5.54

ENV TZ "Asia/Shangehai"
ENV MYSQL_ROOT_PASSWORD=5802486  #root连接密码
ENV MYSQL_DATABASE=tmsystem #数据库名

ADD my.cnf /etc/mysql/conf.d/my.cnf

ADD autoinit.sql /docker-entrypoint-initdb.d/  #需要执行的初始化SQL,注意实际运行会按照字母进行排序执行

EXPOSE 3306
CMD ["mysqld"]

如上其中有几处需要开发者根据其中的注释进行对应的调整。对应的my.cnf配置文件如下:

[mysqld]
lower_case_table_names=1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
table_cache = 614
innodb_buffer_pool_size = 1G
innodb_thread_concurrency = 4
innodb_file_io_threads = 4
innodb_flush_log_at_trx_commit = 0
thread_concurrency     = 4
open_files_limit=10240
max_connections=3000
max_connect_errors=60000
external-locking=FALSE
sort_buffer_size=2M
join_buffer_size=2M
transaction_isolation = READ-COMMITTED
tmp_table_size = 256M
key_buffer              = 512M
max_allowed_packet      = 100M
thread_stack            = 192K
thread_cache_size       = 300
query_cache_limit       = 4M
query_cache_size        = 64M
init_connect = 'SET NAMES utf8'
character_set_server = utf8

以上配置开发者可以根据MySql的具体要求自行调整。完成以上的基本配置后需要到docker-compose.yml中进行
编写,考虑到MySql并不是直接使用原始镜像而是需要进行独立的镜像构建,所以需要build指令,最终的结果如
下:

  mysqldb:
    build: ./dbinit/
    ports:
      - 3306:3306

其中将3306端口直接暴露到宿主的3306端口上,需要开发者确认当前宿主的该端口是否被占用,如果被占用则需
要调整这里实际映射的端口。

四、 Redis开发环境

业务系统对于用户会话以及部分常用的数据存储已经逐渐采用Redis这种高速的键值对存储技术,考虑到实际并不
需要进行相关的数据初始化工作,这里直接使用image启动相关镜像即可:

  redis:
    image: index.alauda.cn/library/redis:3.2.1
    ports:
      - 6379:6379
    environment:
      - REDIS_PASS:**None**

其中通过环境变量指定无需密码即可。

五、RabbitMQ开发环境

对于大型系统来说,为了降低系统的耦合度,越来越频繁的使用事件总线技术分离服务的客户端和服务端,所以
在我们实际的开发过程中即使不需要最终的服务方存在或者提供客户服务需要连接对应的基础组件保证平台的正
常运作,所以这里需要利用Docker启动相关的镜像服务,具体如下:

  eventbus:
    image: index.alauda.cn/library/rabbitmq:3.4-management
    ports:
      - 5672:5672
      - 15672:15672

这里不仅仅开放了实际服务的端口,也将其组件的Web UI开放出去,方便开发人员进行查看。基于以上几个服
务最终完整的docker-compose.yml如下所示:

version: '2'
services:
  mysqldb:
    build: ./dbinit/
    ports:
      - 3306:3306
  redis:
    image: index.alauda.cn/library/redis:3.2.1
    ports:
      - 6379:6379
    environment:
      - REDIS_PASS:**None**
  eventbus:
    image: index.alauda.cn/library/rabbitmq:3.4-management
    ports:
      - 5672:5672
      - 15672:15672

当然随着系统不断发展底层的基础组件也在发生了改变,所以该文档将会逐渐进行完善,最终希望开发者可以
自行完善对于Docker相关技术的提升,从而能够提升实际生产中效率。

原文地址:https://www.cnblogs.com/yaozhenfa/p/13679888.html