网上关于Docker的介绍很多,我就不复制粘贴了,大家可以自己找。为什么要使用Docker?总的来说就是保证开发和线上环境一致,保证机器干净,不会安装一堆依赖。顺便说一句,我在开发EOS的时候安装了一堆依赖和动态库,差点让我强迫症想重装电脑。。。后来写了一个docker镜像来清理一下,但它被改变了。文件无法恢复。构建最小Go应用程序镜像的官方建议是使用alpine镜像。在实际使用过程中,发现还是少了一些东西。以下是补充后的新形象。FROMalpine:latest#官方推荐的镜像大小只有5MRUNapkupdate\&&apkupgrade\#更新源和应用程序&&apk--no-cacheaddtzdata\#只要在go中使用时间包,就一定是installed&&apk--no-cacheaddopenssl\#如果使用rsa加解密,还需要安装&&apk--no-cacheaddca-certificates\#ca证书,这个也是需要的&&rm-rf/var/cache/apk/\#清空安装包&&ln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime\&&echo"Asia/Shanghai">/etc/timezone#这个是设置默认时间zoneWORKDIR/mnt/work#最后设置一个工作目录,可以自己打包,命名为go-alpine:$dockerbuild-tgo-alpine.上面的镜像构建只有9M左右。我没有在其中添加go-compiled服务。这是有原因的,下面会提到。Docker运行之前在实际开发过程中,我们经常会编译go服务然后运行。每次编译都需要重新构建镜像吗?当然不是,下面是开始前的准备:$mkdir-p/mnt/work/service$dockervolumecreate--driverlocal\--opttype=none\--optdevice=/mnt/work/service\--opto=bind\--name=service-data-volume为services创建一个目录,并为它创建一个volumeDockerRun将编译好的go服务放入volume中,然后docker启动时加载volume,并运行service在目录中:$dockerrun-d-vservice-data-volume:/mnt/work\--namelocal_service\-p8000:8000\go-aplpine./go_service这样每次更新只需要替换volumeservices内,无需重新打包图像。上面说的Docker-compose是单个服务的情况。在实际开发中,我们可能会用到微服务,所以服务不止一种。官方建议是一个服务运行一个docker容器,所以我们需要使用docker-compose管理多个服务。原理类似,因为我比较懒,就上传到github上了,大家都是程序员,就不多说了,大家用代码交流吧,哈哈哈。go_docker
