<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Docker部署Go程序 閱讀目錄 闡述 1 開始 第一種方式 - 在容器上編譯并運行 第二種方式 - 先編譯再發布到容器 第三種方式 - 多階鏡像構建 總結 闡述 Docker是一種輕量級的容器技術,可以為應用程序的部署提供統一、可移植的運行環境。 1 開始 首先,我們需要一個簡單的示例項目,以演示如何將Go項目部署到Docker容器當中。 運行以下命令創建并初始化一個名稱為GoTest的項目目錄: linux ``` mkdir GoTest cd GoTest go mod init GoTest ``` windows ![](https://img.kancloud.cn/bc/5d/bc5d96ef5bd147b70915e12e880382f1_816x163.png) 接著我們編寫一個簡單的 web 服務,該服務監聽 8080 端口: ``` package main import ( "fmt" "net/http" ) func main() { fmt.Println("服務啟動......") http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "hello world") }) http.ListenAndServe(":8080", nil) } ``` linux 示例項目已經創建好了,項目結構如下: $ tree . ``` ├── go.mod ├── go.sum └── main.go ``` 第一種方式 - 在容器上編譯并運行 創建好了項目之后,要讓項目運行在Docker容器中,我們需要先創建鏡像,這里用Dockerfile文件來定制我們的鏡像,Dockerfile文件代碼如下: ``` # 基礎鏡像 FROM golang:alpine # 環境變量 ENV GOPROXY https://goproxy.cn,direct # 創建目錄 RUN mkdir /app # 將源碼復制到app目錄 ADD . /app/ # 切換到app目錄 WORKDIR /app # 編譯源碼 RUN go build -o main . # 運行 CMD ["./main"] ``` 在項目直接 docker build 命令構建鏡像: ``` docker build -t gotest:1.0 . ``` ![](https://img.kancloud.cn/b4/99/b499dc5b856feae5ab0197923c37b4e0_939x471.png) 構建成功之后,通過 docker images 查看鏡像: ``` E:\TEXT\test>docker image ls gotest REPOSITORY TAG IMAGE ID CREATED SIZE gotest 1.0 d5e891a78a66 About a minute ago 329MB E:\TEXT\test>docker image ls gotest:1.0 REPOSITORY TAG IMAGE ID CREATED SIZE gotest 1.0 d5e891a78a66 21 minutes ago 329MB E:\TEXT\test> ``` 使用該鏡像啟動一個容器: ``` E:\TEXT\test>docker run -p 8080:8080 gotest:1.0 服務啟動...... ``` 使用curl命令訪問在容器中運行的Web服務: ``` E:\TEXT\test>curl http://localhost:8080/hello hello world E:\TEXT\test> ``` 查看編譯的文件,在Windows上是看不到的。 第二種方式 - 先編譯再發布到容器 我們使用 docker images 查看鏡像時,會發現上述步驟生成的鏡像非常大: ``` E:\TEXT\test>docker image ls gotest:1.0 REPOSITORY TAG IMAGE ID CREATED SIZE gotest 1.0 d5e891a78a66 29 minutes ago 329MB E:\TEXT\test> ``` 但如果我們實際編譯項目,會發現生成的可以執行文件是非常小的: ``` /app # ls -lh main -rwxr-xr-x 1 root root 6.3M Aug 4 02:23 main /app # ``` 可執行文件非常小,而構建的鏡像非常大,這是因為我們是以 golang:alpine 鏡像為基礎來構建自己的鏡像的,golang:alpine 包含Go語言的開發環境,本身就非常大: ``` $ docker image ls golang:alpine REPOSITORY TAG IMAGE ID CREATED SIZE golang alpine 722a834ff95b 1 hours ago 301MB ``` 如果我們不希望構建好的鏡像太大了,可以先編譯好可執行程序,再構建鏡像,此時的Dockerfile文件簡化如下: ``` # 以空白鏡像為基礎 FROM scratch # 將編譯好的可執行文件復制到鏡像 ADD ./your-app-name-linux / # 運行 CMD ["./your-app-name-linux"] ``` 編譯可執行程序: ``` PS E:\TEXT\test> $env:GOOS = "linux" PS E:\TEXT\test> $env:GOARCH = "amd64" PS E:\TEXT\test> go build -o your-app-name-linux PS E:\TEXT\test> ``` linux ``` go build -o main . ``` 構建鏡像: ``` E:\TEXT\test>docker build -t gotest:2.0 . [+] Building 0.2s (5/5) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 202B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build context 0.1s => => transferring context: 6.58MB 0.1s => [1/1] ADD ./your-app-name-linux / 0.0s => exporting to image 0.1s => => exporting layers 0.0s => => writing image sha256:376b84364d4ed2bb8acf73c6d43583fbb4f0aa1e4ada411a8b05897998207a40 0.0s => => naming to docker.io/library/gotest:2.0 0.0s E:\TEXT\test> ``` 查看鏡像: ``` E:\TEXT\test>docker image ls gotest:2.0 REPOSITORY TAG IMAGE ID CREATED SIZE gotest 2.0 376b84364d4e About a minute ago 6.58MB E:\TEXT\test> ``` 從上面顯示的結果可以看到,這種方式構建產生的鏡像非常小。 第三種方式 - 多階鏡像構建 我們在上面使用兩種方式將Go程序部署到容器中,一種是直接在鏡像中編譯,這種方式構建的鏡像太大了,一種是自己編譯后打包到鏡像,這種方式比較麻煩且不符合一般部署流程。 而使用Docker的多階鏡像構建可以則將上述兩種方式結合,多階鏡像構建,即在一個Dockerfile文件可以聲明多個鏡像構建語句,且后面階段的構建可以復制上一階段的文件: ``` # 第一階構建 FROM golang:alpine ENV GOPROXY https://goproxy.cn,direct RUN mkdir /app/ ADD . /app/ WORKDIR /app RUN CGO_ENABLED=0 GOOS=linux go build -o main . # 第二階構建,從空白鏡像開始 FROM scratch ## 復制上層構建的文件 COPY --from=0 /app/main / CMD ["./main"] ``` 構建鏡像: ``` $ docker build -t GoTest:3.0 ``` 查看鏡像: ``` $ docker image ls GoTest:3.0 REPOSITORY TAG IMAGE ID CREATED SIZE gotest 3.0 8d3b724f8968 30 seconds ago 6.13MB ``` 從上面的結果也可以看出,多階構建產生的鏡像也非常小。 總結 直接在鏡像中構建Go項目會使產生的鏡像過大,而手動編譯后再寫入鏡像則略顯繁瑣,多階鏡像構建可以很好地解決這兩個問題。 原文鏈接:[鏈接](https://blog.csdn.net/weiguang102/article/details/132099255)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看