Skip to content

Latest commit

 

History

History
178 lines (154 loc) · 6.31 KB

File metadata and controls

178 lines (154 loc) · 6.31 KB

使用Docker

在本章的最后一节,你会学习到如何使用Docker镜像,并且在Docker镜像中编译和执行Go代码。

或许你已经知道,在Docker中,一切都开始于Docker镜像。你可以从零开始构建一个镜像,也可以使用现有的。为了本节的目标,我们将从Docker hub下载基本的Docker镜像,然后在这个镜像中构建Go版本的Hello World!程序。

我们要使用的Dockerfile的内容是这样的:

FROM golang:alpine
RUN mkdir /files 
COPY hw.go /files 
WORKDIR /files
RUN go build -o /files/hw hw.go 
ENTRYPOINT ["/files/hw"]

第一行定义了我们要使用的Docker镜像。紧接着的三行,在镜像中创建了一个新的目录,从用户的当前目录下复制一个叫hw.go的文件到镜像,然后改变镜像的工作路径。最后两行,编译Go源码文件,生成一个可执行文件,然后指定当执行Docker镜像的时候执行生成的这个可执行文件。

所以,应该如何使用哪个Dockerfile?假设当前目下有一个文件叫hw.go,你可以像这样构建一个新的Docker镜像:

$ docker build -t go_hw:v1 .
Sending build context to Docker daemon 2.237MB
Step 1/6 : FROM golang:alpine
alpine: Pulling from library/golang
cd784148e348: Pull complete
7e273b0dfc44: Pull complete
952c3806fd1a: Pull complete
ee1f873f86f9: Pull complete
7172cd197d12: Pull complete
Digest: sha256:198cb8c94b9ee6941ce6d58f29aadb855f64600918ce602cdeacb018ad77d647 Status: Downloaded newer image for golang:alpine
---> f56365ec0638
Step 2/6 : RUN mkdir /files
---> Running in 18fa7784d82c
Removing intermediate container 18fa7784d82c
---> 9360e95d7cb4
Step 3/6 : COPY hw.go /files
---> 680517bc4aa3
Step 4/6 : WORKDIR /files
---> Running in f3f678fcc38d
Removing intermediate container f3f678fcc38d
---> 640117aea82f
Step 5/6 : RUN go build -o /files/hw hw.go
---> Running in 271cae1fa7f9
Removing intermediate container 271cae1fa7f9
---> dc7852b6aeeb
Step 6/6 : ENTRYPOINT ["/files/hw"]
---> Running in cdadf286f025
Removing intermediate container cdadf286f025
---> 9bec016712c4 
Successfully built 9bec016712c4 
Successfully tagged go_hw:v1

新创建的Docker镜像的名字是go_hw:v1

如果你的电脑上已经存在Docker镜像golang:alpine,上面的命令执行的输出会是这样的:

$ docker build -t go_hw:v1 .
Sending build context to Docker daemon 2.237MB Step 1/6 : FROM golang:alpine
---> f56365ec0638
Step 2/6 : RUN mkdir /files
---> Running in 982e6883bb13
Removing intermediate container 982e6883bb13
---> 0632577d852c
Step 3/6 : COPY hw.go /files
---> 68a0feb2e7dc
Step 4/6 : WORKDIR /files
---> Running in d7d4d0c846c2
Removing intermediate container d7d4d0c846c2
---> 6597a7cb3882
Step 5/6 : RUN go build -o /files/hw hw.go
---> Running in 324400d532e0
Removing intermediate container 324400d532e0
---> 5496dd3d09d1
Step 6/6 : ENTRYPOINT ["/files/hw"]
---> Running in bbd24840d6d4
Removing intermediate container bbd24840d6d4
---> 5a0d2473aa96
Successfully built 5a0d2473aa96 
Successfully tagged go_hw:v1

你可以像下面这样检查你的电脑上是否有go_hw:v1镜像:

$ docker images
REPOSITORY    TAG      IMAGE ID      CREATED             SIZE
go_hw         v1      9bec016712c4  About a minute ago   312MB
golang        alpine  f56365ec0638  11 days ago          310MB

程序hw.go包含以下内容:

package main
import (
	"fmt"
)
func main() { 
	fmt.Println("Hello World!")
}

你可以向下面这样使用本地的Docker镜像:

$ docker run go_hw:v1
Hello World!

还有很多复杂的方法来执行一个Docker镜像,但是对于这样一个简单的镜像,这是最简单的使用方式。

如果你有兴趣,你还可以把Docker镜像存在网上的Docker registry上,这样以后还可以从网上把这个镜像拉下来。

Docker Hub就是这样一个地方,只要你有一个Docker Hub的账户,没有也可以很容易的创建一个。创建Docker Hub账号以后,你就可以在你的UNIX机器上执行下面的命令,把你的镜像推到Docker Hub上。

$ docker login
Authenticating with existing credentials...
Login Succeeded
$ docker tag go_hw:v1 "mactsouk/go_hw:v1"
$ docker push "mactsouk/go_hw:v1"
The push refers to repository [docker.io/mactsouk/go_hw] bdb6946938e3: Pushed
99e21c42e35d: Pushed
0257968d27b2: Pushed
e121936484eb: Pushed
61b145086eb8: Pushed
789935042c6f: Pushed
b14874cfef59: Pushed
7bff100f35cb: Pushed
v1: digest: sha256:c179d5d48a51b74b0883e582d53bf861c6884743eb51d9b77855949b5d91dde1 
size: 1988

第一个命令是用来登陆Docker Hub,,应该仅执行一次。命令docker tag是给本地的镜像指定一个在Docker Hub上使用的名字,这个命令要在docker push之前。最后一个命令就是推送镜像到Docker Hub了,所以这里有这么多的打印内容。如果你公开你的Docker镜像,那么其他人就可以下载和使用这个镜像了。

在本地UNIX机器上,有很多方法可以删除Docker镜像。其中一个是使用Docker镜像的IMAGE ID:

$ docker rmi 5a0d2473aa96 f56365ec0638
Untagged: go_hw:v1
Deleted:
sha256:5a0d2473aa96bcdafbef92751a0e1c1bf146848966c8c971f462eb1eb242d2a6
Deleted:
sha256:5496dd3d09d13c63bf7a9ac52b90bb812690cdfd33cfc3340509f9bfe6215c48
Deleted:
sha256:598c4e474b123eccb84f41620d2568665b88a8f176a21342030917576b9d82a8
Deleted:
sha256:6597a7cb3882b73855d12111787bd956a9ec3abb11d9915d32f2bba4d0e92ec6
Deleted:
sha256:68a0feb2e7dc5a139eaa7ca04e54c20e34b7d06df30bcd4934ad6511361f2cb8
Deleted:
sha256:c04452ea9f45d85a999bdc54b55ca75b6b196320c021d777ec1f766d115aa514
Deleted:
sha256:0632577d852c4f9b66c0eff2481ba06c49437e447761d655073eb034fa0ac333
Deleted:
sha256:52efd0fa2950c8f3c3e2e44fbc4eb076c92c0f85fff46a07e060f5974c1007a9
Untagged: golang:alpine
Untagged:
golang@sha256:198cb8c94b9ee6941ce6d58f29aadb855f64600918ce602cdeacb018ad77d647
Deleted:
sha256:f56365ec0638b16b752af4bf17e6098f2fda027f8a71886d6849342266cc3ab7
Deleted:
sha256:d6a4b196ed79e7ff124b547431f77e92dce9650037e76da294b3b3aded709bdd
Deleted:
sha256:f509ec77b9b2390c745afd76cd8dd86977c86e9ff377d5663b42b664357c3522
Deleted:
sha256:1ee98fa99e925362ef980e651c5a685ad04cef41dd80df9be59f158cf9e52951
Deleted:
sha256:78c8e55f8cb4c661582af874153f88c2587a034ee32d21cb57ac1fef51c6109e
Deleted:
sha256:7bff100f35cb359a368537bb07829b055fe8e0b1cb01085a3a628ae9c187c7b8