Note: golang with docker

Docker 這幾年對於各種運維很流行,實際上在開發各種嵌入式裝置與Android BSP維護上也會遇到很多相依性問題,這一兩年也看到越來越多公司開始採用 Docker 去維護開發環境了,尤其當你需要多地協同開發時,與第三方客戶或是夥伴開發更是如此,可以透過設定好的Dockerfile 去做開發環境的維護,降低各種溝通與反覆試誤的成本。

這裡舉一個 台灣工控一哥的例子 可以看到連結內有許多不同OS版本對應的不同開發環境,這樣你開發的環境不用去管理各種不同版本的套件相依性問題,對客戶跟第三方合作廠商都可以快速的發布,對於有多樣客戶是一個相對省力的支援方式

因為IoT Era 的到來,今天測試一下Docker 做Golang 開發

底下是一個 golang with git, gcc and make 的Dockerfile,用的是Alpine distribution, 要改成其他Distribution 也可以, 官方有Debian可選 , 可以直接用Docker pull golang:$tagname 之類的方式去拉下image
下面是我新增git & make & gcc 的開發用Dockerfile

FROM golang:1.10.1-alpine

RUN apk add --no-cache git make gcc

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH

RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
WORKDIR $GOPATH

然後可以參考官方文件的Docker-compose 去結合其他service 像是資料庫PostgreSQL
這樣可以開發一些Microservice 來做一些應用,需要水平擴展時可以加上反向代理等等,做現在所謂雲端的開發

如果想放像DockerHub 讓大家都可以使用你的Dockerfile 也可以參考工控一哥的這篇

透過上面的Dockerfile 可以用docker build 變成image 我這裡用 docker tag 改成 mygolang
透過docker image ls 可以看到下面狀況

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mygolang            latest              2da237294097        2 hours ago         475MB
golang              1.10.1-alpine       52d894fca6d4        5 days ago          376MB
postgres            9.6.8-alpine        b27674feae2a        6 weeks ago         38MB

然後建一個 docker-compose.yml 如下, golang 那區塊應該有點問題還需要更正

# Use postgres with golang
version: '3'

services:
    db:
        image: postgres:9.6.8-alpine
        restart: always
        ports:
            - "5432:5432"
        environment:
            POSTGRES_DB: dev
            POSTGRES_PASSWORD: IdQuivgebobr9Dra
            POSTGRES_USER: postgres
    go:
        image: mygolang:latest
        ports:
            - "8080:8080"
        working_dir: /go
        depends_on:
            - db
        links:
            - db

然後下 docker-compose up -d 這樣會出現

Starting mydocker_db_1 ... done
Creating mydocker_go_1 ... done

在接著用 docker-compose run go 重跑一次mygolang 這樣就可以開始開發相關service
透過 docker-compose ps 可以觀察到下面 container status

      Name                     Command              State            Ports         
-----------------------------------------------------------------------------------
mydocker_db_1       docker-entrypoint.sh postgres   Up       0.0.0.0:5432->5432/tcp
mydocker_go_1       /bin/sh                         Exit 0                         
mydocker_go_run_1   /bin/sh                         Up

Update: 這篇還沒整理完,參考 Where and how to persist application data 可以知道應該透過Volume/Bind 跟Host的目錄連結,這樣才能持續開發並且不增加container 需要在花一些時間整理
至於一些使用Docker 快速提示可以參考這個 docker cheatsheet

廣告