100.docker部署
# 01.docker部署简单示例
# 1.1 准备代码
- 这里我先用一段使用
net/http
库编写的简单代码为例讲解如何使用Docker进行部署
package main
import (
"fmt"
"net/http"
)
func main() {
http.HandleFunc("/", hello)
server := &http.Server{
Addr: ":8888",
}
fmt.Println("server startup...")
if err := server.ListenAndServe(); err != nil {
fmt.Printf("server startup failed, err:%v\n", err)
}
}
func hello(w http.ResponseWriter, _ *http.Request) {
w.Write([]byte("hello v5blog.cn!"))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1.2 编写Dockerfile
FROM golang:alpine
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件app
RUN go build -o app .
# 声明服务端口
EXPOSE 8888
# 启动容器时运行的命令
CMD ["/build/app"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1.3 构建镜像并启动
root@dev:demo# docker build . -t go_demo
root@dev:~# docker run -p 9999:8888 go_demo
server startup...
1
2
3
2
3
- 访问: http://127.0.0.1:9999/
# 02.分阶段构建
# 2.1 分阶段构建作用
我们的Go程序编译之后会得到一个可执行的二进制文件,其实在最终的镜像中是不需要go编译器的
也就是说我们只需要一个运行最终二进制文件的容器即可
Docker的最佳实践之一是通过仅保留二进制文件来减小镜像大小
为此,我们将使用一种称为多阶段构建的技术,这意味着我们将通过多个步骤构建镜像。
使用这种技术,我们剥离了使用
golang:alpine
作为编译镜像来编译得到二进制可执行文件的过程并基于
scratch
生成一个简单的、非常小的新镜像我们将二进制文件从命名为
builder
的第一个镜像中复制到新创建的scratch
镜像中
# 2.2 Dockerfile
FROM golang:alpine AS builder
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件 app
RUN go build -o app .
###################
# 接下来创建一个小镜像
###################
FROM scratch
# 从builder镜像中把/dist/app 拷贝到当前目录
COPY /build/app /
# 需要运行的命令
ENTRYPOINT ["/app"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 2.3 Dockerfile
root@dev:demo# docker build . -t go_demo_builder
root@dev:~# docker run -p 9999:8888 go_demo_builder
1
2
2
# 03.docker部署gin项目
# 3.1 Dockerfile
FROM golang:alpine AS builder
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64 \
GOPROXY=https://goproxy.cn,direct
# 移动到工作目录:/build
WORKDIR /build
#RUN go env -w GO111MODULE=on
#RUN go env -w GOPROXY=https://goproxy.cn,direct
# 复制项目中的 go.mod 和 go.sum文件并下载依赖信息
COPY go.mod .
COPY go.sum .
RUN go mod download
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件 bluebell_app
RUN go build -o bluebell_app .
###################
# 接下来创建一个小镜像
###################
FROM scratch
COPY ./templates /templates
COPY ./static /static
COPY ./conf /conf
# 从builder镜像中把/dist/app 拷贝到当前目录
COPY /build/bluebell_app /
# 声明服务端口
EXPOSE 8084
# 需要运行的命令
ENTRYPOINT ["/bluebell_app", "conf/config.yaml"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 3.2 conf/config.yaml
- 修改mysql和redis连接地址
mysql:
host: 192.168.56.100
port: 3306
user: "root"
password: "1"
dbname: "bluebell"
max_open_conns: 200
max_idle_conns: 50
redis:
host: 192.168.56.100
port: 6379
password: ""
db: 0
pool_size: 100
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 创建数据库和表
CREATE DATABASE bubble DEFAULT CHARSET=utf8mb4;
1
# 3.3 生成docker镜像
root@dev:bluebell# docker build . -t bubble_app:v11
root@dev:bluebell# docker run -p 8888:8084 bubble_app
1
2
2
上次更新: 2024/3/13 15:35:10