最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何在Docker部署Go程序

 更新時(shí)間:2023年08月01日 10:56:01   作者:程序員讀書  
Docker是一種輕量級(jí)的容器技術(shù),可以為應(yīng)用程序的部署提供統(tǒng)一、可移植的運(yùn)行環(huán)境,下面我們來講講如何將Go應(yīng)用程序部署到Docker的容器吧

開始

首先,我們需要一個(gè)簡單的示例項(xiàng)目,以演示如何將Go項(xiàng)目部署到Docker容器當(dāng)中。

運(yùn)行以下命令創(chuàng)建并初始化一個(gè)名稱為GoTest的項(xiàng)目目錄:

mkdir?GoTest
cd?GoTest
go?mod?init?GoTest

接著我們編寫一個(gè)簡單的web服務(wù),該服務(wù)監(jiān)聽8080端口:

package?main
import?(
?"fmt"
?"net/http"
)
func?main()?{
??fmt.Println("服務(wù)啟動(dòng)......")
??http.HandleFunc("/hello",?func(w?http.ResponseWriter,?r?*http.Request)?{
??fmt.Fprintln(w,?"hello?world")
?})
?http.ListenAndServe(":8080",?nil)
}

此時(shí)我們的示例項(xiàng)目已經(jīng)創(chuàng)建好了,項(xiàng)目結(jié)構(gòu)如下:

$ tree
.
├── go.mod
├── go.sum
└── main.go

在容器上編譯并運(yùn)行

創(chuàng)建好了項(xiàng)目之后,要讓項(xiàng)目運(yùn)行在Docker容器中,我們需要先創(chuàng)建鏡像,這里用Dockerfile文件來定制我們的鏡像,Dockerfile文件代碼如下:

#?基礎(chǔ)鏡像
FROM?golang:alpine
#?環(huán)境變量
ENV?GOPROXY?https://goproxy.cn,direct
#?創(chuàng)建目錄
RUN?mkdir?/app?
#?將源碼復(fù)制到app目錄
ADD?.?/app/
#?切換到app目錄
WORKDIR?/app
#?編譯源碼
RUN?go?build?-o?main?.
#?運(yùn)行
CMD?["./main"]

在項(xiàng)目直接docker build命令構(gòu)建鏡像:

$?docker?build?-t?GoTest:1.0?.

構(gòu)建成功之后,通過docker images查看鏡像:

$?docker?image?ls?GoTest:1.0
REPOSITORY???TAG???IMAGE?ID??????CREATED?????????SIZE
gotest???????1.0???18e7bd58d94b??20?seconds?ago??309MB

使用該鏡像啟動(dòng)一個(gè)容器:

$?docker?run?-p?8080:8080?GoTest:1.0

使用curl命令訪問在容器中運(yùn)行的Web服務(wù):

$?curl?http://localhost:8080/hello
hello?world

先編譯再發(fā)布到容器

我們使用docker images查看鏡像時(shí),會(huì)發(fā)現(xiàn)上述步驟生成的鏡像非常大:

$?docker?image?ls?GoTest:1.0
REPOSITORY?????TAG?????????IMAGE?ID???????CREATED?????????SIZE
GoTest?????????1.0?????????18e7bd58d94b???20?seconds?ago??309MB

但如果我們實(shí)際編譯項(xiàng)目,會(huì)發(fā)現(xiàn)生成的可以執(zhí)行文件是非常小的:

$?ls?-lh?main
-rwxr-xr-x??1?sun??staff???5.9M??7??6?16:35?main

可執(zhí)行文件非常小,而構(gòu)建的鏡像非常大,這是因?yàn)槲覀兪且?code>golang:alpine鏡像為基礎(chǔ)來構(gòu)建自己的鏡像的,golang:alpine包含Go語言的開發(fā)環(huán)境,本身就非常大:

$?docker?image?ls?golang:alpine
REPOSITORY?????TAG?????????IMAGE?ID???????CREATED??????????SIZE
golang?????????alpine??????722a834ff95b???1?hours?ago??????301MB

如果我們不希望構(gòu)建好的鏡像太大了,可以先編譯好可執(zhí)行程序,再構(gòu)建鏡像,此時(shí)的Dockerfile文件簡化如下:

#?以空白鏡像為基礎(chǔ)
FROM?scratch
#?將編譯好的可執(zhí)行文件復(fù)制到鏡像
ADD?./main?/
#?運(yùn)行
CMD?["./main"]

編譯可執(zhí)行程序:

$?go?build?-o?main?.

構(gòu)建鏡像:

$?docker?build?-t?GoTest:2.0

查看鏡像:

$?docker?image?ls?GoTest:2.0
REPOSITORY???????TAG???????????IMAGE?ID?????????CREATED?????????????SIZE
gotest???????????2.0???????????8d3b724f8968?????22?seconds?ago??????6.24MB

從上面顯示的結(jié)果可以看到,這種方式構(gòu)建產(chǎn)生的鏡像非常小。

多階鏡像構(gòu)建

我們?cè)谏厦媸褂脙煞N方式將Go程序部署到容器中,一種是直接在鏡像中編譯,這種方式構(gòu)建的鏡像太大了,一種是自己編譯后打包到鏡像,這種方式比較麻煩且不符合一般部署流程。

而使用Docker的多階鏡像構(gòu)建可以則將上述兩種方式結(jié)合,多階鏡像構(gòu)建,即在一個(gè)Dockerfile文件可以聲明多個(gè)鏡像構(gòu)建語句,且后面階段的構(gòu)建可以復(fù)制上一階段的文件:

#?第一階構(gòu)建
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?.
#?第二階構(gòu)建,從空白鏡像開始
FROM?scratch
##?復(fù)制上層構(gòu)建的文件
COPY?--from=0?/app/main?/
CMD?["./main"]

構(gòu)建鏡像:

$?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

從上面的結(jié)果也可以看出,多階構(gòu)建產(chǎn)生的鏡像也非常小。

小結(jié)

總結(jié)一下,直接在鏡像中構(gòu)建Go項(xiàng)目會(huì)使產(chǎn)生的鏡像過大,而手動(dòng)編譯后再寫入鏡像則略顯繁瑣,多階鏡像構(gòu)建可以很好地解決這兩個(gè)問題。

到此這篇關(guān)于詳解如何在Docker部署Go程序的文章就介紹到這了,更多相關(guān)Docker部署Go程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Docker如何在前端項(xiàng)目動(dòng)態(tài)插入并使用變量

    詳解Docker如何在前端項(xiàng)目動(dòng)態(tài)插入并使用變量

    這篇文章主要為大家詳細(xì)介紹如何在Docker前端鏡像中設(shè)置變量以及使用變量的方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法

    使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法

    本文主要介紹了使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 重啟docker服務(wù)應(yīng)用自啟停命令(推薦)

    重啟docker服務(wù)應(yīng)用自啟停命令(推薦)

    這篇文章主要介紹了重啟docker服務(wù)應(yīng)用自啟停命令,文中給大家提到了服務(wù)器重啟后啟動(dòng)Docker命令,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • docker 編輯Dockerfile 添加php7.2 acpu的問題

    docker 編輯Dockerfile 添加php7.2 acpu的問題

    這篇文章主要介紹了docker 編輯Dockerfile 添加php7.2 acpu問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • docker?save與docker?export的區(qū)別

    docker?save與docker?export的區(qū)別

    docker?save和docker?export都能導(dǎo)出鏡像包,本文主要介紹了docker?save與docker?export的區(qū)別,試圖搞清楚docker?save和docker?export的功能是什么?適用于什么應(yīng)用場景?感興趣的可以了解一下
    2022-03-03
  • Docker部署Django的詳細(xì)指南

    Docker部署Django的詳細(xì)指南

    部署Django應(yīng)用到Docker中的詳細(xì)步驟是一個(gè)較為復(fù)雜的過程,涉及到許多技術(shù)和工具的結(jié)合使用,本文將詳細(xì)介紹如何從零開始使用Docker部署Django應(yīng)用,感興趣的小伙伴跟著小編一起來看看吧
    2024-12-12
  • windows宿主機(jī)和docker容器設(shè)置掛載共享文件夾的步驟

    windows宿主機(jī)和docker容器設(shè)置掛載共享文件夾的步驟

    這篇文章主要介紹了windows宿主機(jī)和docker容器設(shè)置掛載共享文件夾的步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • docker實(shí)現(xiàn)MySQL數(shù)據(jù)同步的方法

    docker實(shí)現(xiàn)MySQL數(shù)據(jù)同步的方法

    docker的一大好處是在本地可以很方便快速的搭建負(fù)載均衡,主從同步等需要多主機(jī)的環(huán)境,本文主要介紹了docker實(shí)現(xiàn)MySQL數(shù)據(jù)同步的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 推送docker鏡像到harbor的實(shí)現(xiàn)方式

    推送docker鏡像到harbor的實(shí)現(xiàn)方式

    這篇文章主要介紹了推送docker鏡像到harbor的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn)

    Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn)

    Kubernetes用于協(xié)調(diào)高度可用的計(jì)算機(jī)集群,本文主要介紹了Docker Desktop安裝本地Kubernetes集群的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02

最新評(píng)論

尼玛县| 寿光市| 万荣县| 镇巴县| 九寨沟县| 镇宁| 平顶山市| 泰来县| 安西县| 庆安县| 隆回县| 卓尼县| 原平市| 监利县| 浪卡子县| 布尔津县| 锦州市| 得荣县| 大名县| 徐州市| 郎溪县| 平顺县| 嫩江县| 阳新县| 屏东县| 那坡县| 和顺县| 云安县| 缙云县| 南充市| 泰宁县| 星子县| 迁安市| 柳林县| 娄底市| 定西市| 红河县| 通榆县| 屏南县| 平舆县| 呼玛县|