网上关于Docker的介绍有不少,我就不复制粘贴了,你们能够自行查找。为何用Docker?,通常来讲是为了保证开发和线上环境一致,并能保证机器的干净,不会被安装一堆依赖。说下题外话,以前开发EOS的时候,就被装了一堆依赖和动态库,差点让强迫症的我想重装电脑...后来写了个docker镜像才算是整理干净,惋惜被改过的文件是没办法还原了。git
官方建议是用alpine镜像,在实际使用过程当中,发现仍是会缺一些东西,下面是补充以后的新镜像程序员
FROM alpine:latest # 官方推荐镜像大小才5M RUN apk update \ && apk upgrade \ # 更新源和应用 && apk --no-cache add tzdata \ # 只要go里面用到time的包,那就必装 && apk --no-cache add openssl \ # 若是用到rsa加密解密,也须要装 && apk --no-cache add ca-certificates \ # ca证书,这个也是必装的 && rm -rf /var/cache/apk/ \ # 清除安装包 && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone # 这个是设置默认时区 WORKDIR /mnt/work # 最后设定一个工做目录,这个能够本身定
打包出这个镜像并命名go-alpine:github
$ docker build -t go-alpine .
上面的镜像build完才9M左右,我没有把go编译好的服务加进去,这是有缘由的,下面会讲到。docker
在实际开发过程当中,咱们会常常编译go的服务而后运行,难道每次编译都要从新Build一个镜像?固然不,下面是启动前的准备:shell
$ mkdir -p /mnt/work/service $ docker volume create --driver local \ --opt type=none \ --opt device=/mnt/work/service \ --opt o=bind \ --name=service-data-volume
建立了一个放服务的目录并为它建立一个volume微服务
把编译出来的go服务放入volume里面,而后让docker启动的时候加载这个volume,并运行目录内的服务:ui
$ docker run -d -v service-data-volume:/mnt/work \ --name local_service \ -p 8000:8000 \ go-aplpine ./go_service
这样每次更新都只须要替换volume内的服务,而不须要从新打包镜像了。加密
上面说的都是单个服务的状况,实际开发中咱们可能用到微服务,那么服务就不止一个了,官方是建议一个服务跑一个docker容器,这样咱们就须要用到docker-compose管理多个服务。
原理是差很少的,由于懒,我上传到github了,你们都是程序员,我就很少说了,用代码交流吧,哈哈哈。
go_dockercode