如何快速正確使用Docker部署Go Web App

index
目錄
- 第一部分快速入門Docker使用
- 編寫 Go Web App
- 編寫 Dockerfile 把App打包進映象
- 執行容器
Docker概述
什麼是Docker?Docker是碼頭工人的意思,在這裡可以理解為軟體容器平臺,Docker容器類似於虛擬機器,都擁有環境隔離的能力,但它比虛擬機器更加輕量級,可以使資源更大化地得到應用。
什麼是Docker容器?Docker容器虛擬化是指作業系統而不是硬體,容器之間共享同一套作業系統資源,但是相比於虛擬機器,容器的隔離級別會稍微低一些。

Docker架構圖
ofollow,noindex">Docker CE 安裝
Docker常用命令
#查詢Docker Hub上的映象 $ docker search imageName/ID #獲取Docker Hub上的映象 $ docker pull ImageName/ID #顯示本地主機上的映象列表 $ docker images #執行本地主機上的映象 $ docker run ImageName/ID #列出正在執行的容器 $ docker ps #檢視正在執行容器的網路埠對映情況 $ docker port ContainerID #檢視正在執行容器的內部正在程序執行 $ docker top ContainerID #檢視正在執行容器的內部底層資訊 $ docker inspect ContainerID #停止正在執行容器 $ docker stop ContainerID/ #重啟已經停止的容器 $ docker start ContainerID #刪除不需要的容器(必須在容器已經停止的情況下) $ docker rm ContainerimageID #移除本地映象,移除前需要把該映象下所有的容器刪除 $ docker rmi ImageName/ID #登入docker $ docker login #執行ubuntu:16.04映象並建立容器和啟動bash終端 $ docker run -t -i ubuntu:16.04 /bin/bash #重新命名容器名 $ docker rename wonderful_kepler Ubuntu16.04 #構建映象 $ docker commit -m="has update" -a="SpiffyEight77" ff5d623e2d61 spiffyeight77/ubuntu:16.04 #提交映象到docker hub 需要登入 $ docker push spiffyeight77/ubuntu
部分引數說明
-d: 守護模式 後臺執行
-p: 是容器內部埠繫結到指定的主機埠
-P: 是容器內部埠隨機對映到主機的高階口
-f : 讓 docker logs 像使用 tail -f 一樣來輸出容器內部的標準輸出
-l : 查詢最後一次建立的容器
-t : 選項讓Docker分配一個偽終端(pseudo-tty)並繫結到容器的標準輸入上
-i : 則讓容器的標準輸入保持開啟
-m:提交的描述資訊
-a: 指定映象作者
--rm: 停止容器後移除容器
ff5d623e2d61: 容器ID
spiffyeight77/ubuntu:16.04: 指定要建立的目標映象名
編寫一個簡單的Go Web App
如果不知道如何配置Go執行環境的話可以參考這裡
package main import ( "net/http" "fmt" "log" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { fmt.Fprint(writer, "Hello World") }) log.Fatal(http.ListenAndServe(":3000",nil)) }
Go Build 注意事項
編譯應用的時候記得帶上引數,否則的話下文使用的alpine映象在部署時動態編譯Go會出現 Bug
CGO_ENABLED=0 go build -o main
編寫Dockerfile
不會寫Dockerfile的話請自行Google
FROM alpine:latest #使用了映象大小體積只有5MB的alpine映象 WORKDIR / #設定工作路徑 ADD main / #把上文編譯好的main檔案新增到映象裡 EXPOSE 3000 #暴露容器內部埠 ENTRYPOINT ["./main"] #入口
構建映象
docker build -t main:v1 . Sending build context to Docker daemon6.576MB Step 1/5 : FROM alpine:latest ---> 11cd0b38bc3c Step 2/5 : WORKDIR / ---> Running in f87408e1724d Removing intermediate container f87408e1724d ---> 335c50f34490 Step 3/5 : ADD main / ---> 9b9ae9e73cdf Step 4/5 : EXPOSE 3000 ---> Running in e28604a8d906 Removing intermediate container e28604a8d906 ---> 524119daa0ff Step 5/5 : ENTRYPOINT ["./main"] ---> Running in 0bedccb7785b Removing intermediate container 0bedccb7785b ---> 59fe986c210e Successfully built 59fe986c210e Successfully tagged demo:latest
-t: 引數為指定映象標籤名
執行容器
docker run --rm -it -d -p 3000:3000 main
本機開啟localhost:3000 埠進行訪問

localhost:3000