網上關於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