目标
- 基本了解Docker, 以及如何应用于日常开发
- 为我们的Go应用程序制作简单的Dockerfile
web服务器
在$GOPATH/src
目录下创建项目相关目录和文件
cd $GOPATH/src
mkdir -p test.local/web-server
touch test.local/web-server/main.go
main.go
代码如下:
package main
import (
"fmt"
"html"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})
http.HandleFunc("/hi", func(w http.ResponseWriter, r *http.Request){
fmt.Fprintf(w, "Hi")
})
log.Fatal(http.ListenAndServe(":8081", nil))
}
Douckerfile
在项目下创建Dockerfile
: test.local/web-server/Dockerfile
# 选择基础镜像
FROM golang:1.14.3-alpine
# 修改使用使用国内代理, 否则会很慢
RUN set -ex
&& go env -w GO111MODULE=on
&& go env -w GOPROXY=https://goproxy.cn,direct
# 在镜像中创建项目目录
RUN mkdir /app
# 将宿主项目目录(也是当前目录)下所有文件
# 复制到镜像中的项目目录
ADD . /app
# 工作路径
WORKDIR /app
# 创建项目的可执行文件web-server
RUN go build -o web-server *.go
# 执行web-server
CMD ["/app/web-server"]
通过Dockerfile创建镜像, 在Dockerfile所在目录下执行 docker build -t go-web-server .
. 如果一切正常可以看到大致如下的输出结果.
❯ docker build -t go-web-server .
Sending build context to Docker daemon 3.584kB
Step 1/7 : FROM golang:1.14.3-alpine
1.14.3-alpine: Pulling from library/golang
cbdbe7a5bc2a: Pull complete
408f87550127: Pull complete
fe522b08c979: Pull complete
246889057fdc: Pull complete
526388c839c0: Pull complete
Digest: sha256:d3a08e6a81ef8f25c7b9f4b8f2990fe76790f057ef7f8053e8884511ddd81756
Status: Downloaded newer image for golang:1.14.3-alpine
---> 459ae5e869df
Step 2/7 : RUN set -ex && go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.cn,direct
---> Using cache
---> ff37f1baf76b
Step 3/7 : RUN mkdir /app
---> Using cache
---> 857bbe125c8f
Step 4/7 : ADD . /app
---> 6eedab86c847
Step 5/7 : WORKDIR /app
---> Running in 1082740cd774
Removing intermediate container 1082740cd774
---> 690ae7710d53
Step 6/7 : RUN go build -o web-server *.go
---> Running in bf7ef2c58745
Removing intermediate container bf7ef2c58745
---> 9abd6567b334
Step 7/7 : CMD ["/app/web-server"]
---> Running in 4d45109566ff
Removing intermediate container 4d45109566ff
---> 82ed8c959e06
Successfully built 82ed8c959e06
Successfully tagged go-web-server:latest
也可通过docker images
查看和确认刚刚创建好的镜像
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
go-web-server latest 82ed8c959e06 21 minutes ago 377MB
最后创建新的容器并运行该web服务器
docker run -p 8080:8081 -it go-web-server
- -p 8080:8081 - 宿主端口8080映射到容器端口8081
- -it
- -i, --interactive, Keep STDIN open even if not attached
- -t, Allocate a pseudo-TTY
- go-web-server - 镜像名称
我们也可以把-it
换成-d
让容器在后台运行
docker run -p 8080:8081 -d go-web-server
之后可以通过docker kill
来删除
docker kill eb8ad129e22e
eb8ad129e22e
是container id, 可以通过docker ps
获取当前运行中的容器
❯ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eb8ad129e22e go-web-server "/app/web-server" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8081/tcp loving_merkle
docker ps -a
查看所有容器, 包括已经不在运行的.