Docker實踐:GO Docker部署與打包實例


轉載:https://segmentfault.com/a/1190000014297111?utm_medium=referral&utm_source=tuicool

事情是這樣的

一個人程序員,用golang寫了個server,寫完后...不會部署 : ) 
是的,這個人就是我... 
今天真的是要被自己笑死 
終於有機會在公司項目中使用golang進行開發,整個開發過程相當亢奮!然而...當跟前端小哥哥聯調完接口后,小哥哥問我什么時候能給線上地址 
(一臉懵)忘記還有上線這回事了 
往往自己業余寫的golang項目就直接 go build 然后拖到服務器然后運行一下搞定 
但是這是公司項目啊!!! 會給你ftp??? 你可以碰到服務器??? (仿佛聽到了DBA小哥哥的心聲) 
於是... 我找到了DBA小哥哥,問該如何發布 
“你直接打包一個rpm或者給個docker吧”

哈? 
rpm? 你確定不是npm? 
docker??? (卧槽,我好像兩年前就該看看了) 我還沒看過...

於是乎虛心請教DBA小哥哥,“能麻煩大致跟我講下這個rpm是怎么個打法嗎?” 
“好啊,你就先……*¥%#¥然后再$%……%%” 
“哦,好,我回去看看”

然后

然后我就回來學起了docker 23333333333 
好在部門內有個老司機 
直接就讓我上了車

開車

首先我們要先down一個docker 
mac版: https://www.docker.com/docker... 
能打開mac已經證明會安裝了,我們就不再復述了

安裝完成后到啟動台里面點一下可愛的小鯨魚

clipboard.png

然后在命令行輸入

$ docker info

看到一堆亂七八糟的東西輸出證明安裝成功

我們需要從鏡像市場down一個linux鏡像~ 
https://store.docker.com 搜索 centos 會看到

clipboard.png
選擇哪個版本完全混眼熟 哈哈哈哈 
看到具體版本號 在命令行執行

$ docker pull centos:7.2.1511

clipboard.png
Already exists 是因為在寫這篇記錄之前已經pull過了 哈哈哈

裝好鏡像后通過docker images來查看已存在的鏡像

$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7.2.1511 0a2bad7da9b5 5 months ago 195MB 

下面我們來讓這個鏡像跑起來

$ docker run -p 8888:80 --name godocker -e ENV="dev" -it 0a2bad7da9b5 /bin/bash
-p 本機端口號:映射到docker的端口號(當本機的8888請求被訪問時會進入到docker的80端口) 
--name docker實例的名稱(想怎么起怎么起) 
-e docker的環境變量 
-v 類似於軟鏈,將docker的某個路徑映射到本機的實體路徑(具體的可以針對性百度哦) 
-it 后面跟docker image 的id

敲下回車~ 哎呦進去了! 
不急不急 我們先退出來

exit

趕快 趕快 build一個go server

$ cd /xxx/xxx/xxx/xxx/xxx/gotest  
$ touch main.go  
$ vi main.go  
  package main  
  import "fmt" func main() { fmt.Println("hello word") } :x $ go build for linux (當然是偽代碼啦) # 會生成一個跟目錄同名的可執行文件 gotest # 將文件拷貝到docker鏡像中 $ docker cp /Users/wangboyan/development/golang/src/gotest/gotest godocker:/var/www # 然后進入docker中查看剛才的gotest是否存在 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2802801c24c 0a2bad7da9b5 "/bin/bash" 14 minutes ago Up 14 minutes 0.0.0.0:8888->80/tcp godocker docker exec -it b2802801c24c /bin/bash # 會發現我們成功進入了docker哦 $ cd /var/www $ ll $ gotest 

驚不驚喜~意不意外~ 
完全意料之中... 
執行以下我們編譯好的可執行文件看看

clipboard.png
此時 只想呵呵 呵呵 哈哈哈哈哈 
現在我們來將剛剛的修改 生成新的鏡像文件

# 先退出docker exit $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2802801c24c 0a2bad7da9b5 "/bin/bash" 14 minutes ago Up 14 minutes 0.0.0.0:8888->80/tcp godocker 

我們通過commit命令將容器轉化為鏡像

$ docker commit -m "myself docker image" -a "holdno" 0a2bad7da9b5 holdno/centos-go:1.0.0 # 敲下回車后會得到以下結果 證明成功! sha256:554e840711c57bd4d2ede4a29a5c1dff3a711050c421ebfc38090d0f5a358b83 # 重新查看鏡像信息 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE holdno/centos-go 1.0.0 554e840711c5 11 seconds ago 197MB centos 7.2.1511 0a2bad7da9b5 5 months ago 195MB

有沒有!生成了新的鏡像

打包(save)

自己的docker鏡像算是做好了(我做啥了?) 
下面我們來打包這個鏡像 
畢竟DBA小哥哥要的只是個包 
我們可以使用 save 和 load 方法,前者用來把鏡像保存一個tar文件,后台從一個tar文件恢復成一個鏡像

$ docker save -o /Users/wangboyan/development/docker/centos-go.v1.0.0.tar 554e840711c5
-o :輸出到的文件(注意哦,這個路徑一定是已經存在的路徑!)

恢復(load)

# 刪除剛剛打包過的鏡像 $ docker rmi 554e840711c5 $ docker load < /Users/wangboyan/development/docker/centos-go.v1.0.0.tar Loading layer [==================================================>] 2.03MB/2.03MB $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> 554e840711c5 11 seconds ago 197MB centos 7.2.1511 0a2bad7da9b5 5 months ago 195MB

不知道為什么 REPOSITORY 和 TAG 變成了 none 
現在我們來啟動剛剛導入的鏡像

$ docker run -it 554e840711c5 /bin/bash $ cd /var/www $ ll gotest # 有沒有! 剛才cp進來的可執行文件還在!(這不是很正常嗎) $ ./gotest hello world $

所以可以直接把 centos-go.v1.0.0.tar 丟給DBA小哥哥了?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM