1.项目目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
├── Dockerfile  # dockerFile文件
├── config-dev.yaml # dev环境配置文件
├── config-local.yaml # 本地测试文件 
├── docker-compose.yaml # docker-compose文件
├── .env # 环境变量文件
....
├── go.mod
├── go.sum
├── logs
├── main.go

2. 新增dockerfile

 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
FROM golang:1.18.3-stretch AS builder

# 环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY="https://goproxy.cn,direct"

# 切换到工作目录
WORKDIR /build

# 将代码复制到容器中
COPY . .

# 下载依赖
RUN go mod download \
    && go get shershon1991/fund-analye-system/service/crawl/fund \
    && go get github.com/gin-gonic/gin/binding@v1.7.2

# 编译成二进制文件,二进制文件名:app
RUN go build -o app .


### --------- 二阶段,构建一个小镜像 ---------
FROM shershon/go-env:stretch-slim

# 项目目录
WORKDIR /www

# 从builder镜像中把二进制文件/build/app 拷贝到当前目录
COPY --from=builder /build/app /www

3. 新增docker-compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
version: '3'
networks:
  backend:
    driver: ${NETWORKS_DRIVER}
services:
  app:
    build:
      context: .
      args:
        - APP_ENV=${APP_ENV}
    command: sh -c "./app -c ./config.yaml"
    volumes:
      - ${PROJECT_PATH}/config-${APP_ENV}.yaml:/www/config.yaml
      - ${LOG_PATH}/logs:/www/logs
    ports:
      - "${APP_PORT}:8088"

4. 新增环境变量文件.env

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 项目地址(绝对路径)
PROJECT_PATH=..
# 日志目录
LOG_PATH=
# 网络
NETWORKS_DRIVER=bridge
# 环境
APP_ENV=local
# 端口
APP_PORT=8081

5.编译docker-compose build

6.运行docker-compose up -d

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 运行
➜ docker-compose up -d
WARNING: Some networks were defined but are not used by any service: backend
fund-server_app_1 is up-to-date

# 查看日志
➜ docker-compose logs
WARNING: Some networks were defined but are not used by any service: backend
Attaching to fund-server_app_1
app_1  | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
app_1  |  - using env:	export GIN_MODE=release
app_1  |  - using code:	gin.SetMode(gin.ReleaseMode)
app_1  |
app_1  | [GIN-debug] GET    /system/config            --> shershon1991/fund-analye-system/api/demo.GetConfig (3 handlers)
app_1  | [GIN-debug] POST   /demo/user/login          --> shershon1991/fund-analye-system/api/demo.Login (3 handlers)
app_1  | 【 当前环境: dev 当前版本: v1.0.0 接口地址: http://0.0.0.0:8081 启动时间:2021-10-18 22:10:23 】

7. 踩坑记录connect: no route to host

启动容器后,在容器内访问本地mysql报错: connect: no route to host

7.1 报错信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
➜ docker-compose up
WARNING: Some networks were defined but are not used by any service: backend
Starting fund-server_app_1 ... done
Attaching to fund-server_app_1
app_1  | panic: 创建mysql客户端失败: dial tcp 172.20.0.1:3306: connect: no route to host, {172.20.0.1 3306 root root fund_system utf8mb4 false true Local 255 true false {false true false false fas_ true} 50ms info true true}
app_1  |
app_1  | goroutine 1 [running]:
app_1  | shershon1991/fund-analye-system/initialize.initGorm()
app_1  | 	/build/initialize/gorm.go:50 +0x6ae
app_1  | shershon1991/fund-analye-system/initialize.SetLoadInit()
app_1  | 	/build/initialize/load.go:9 +0x2f
app_1  | main.main()
app_1  | 	/build/main.go:18 +0x45
fund-server_app_1 exited with code 2

7.2 解决方法

1. 替换mysql的host

 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
# 查看网络信息
➜ docker network ls
NETWORK ID          NAME                  DRIVER              SCOPE
1ff63fe03b51        bridge                bridge              local
4067e988f21e        fund-server_default   bridge              local
3e3c8036f789        host                  host                local
5066fef7de07        none                  null                local

#  查看网络,对应的IP信息
➜  ifconfig
br-4067e988f21e: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.30.0.1  netmask 255.255.0.0  broadcast 172.30.255.255
        ether 02:42:09:22:b7:96  txqueuelen 0  (Ethernet)
        RX packets 341232  bytes 28039546 (26.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 341232  bytes 28039546 (26.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
# docker ip 
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.20.0.1  netmask 255.255.255.0  broadcast 172.20.0.255
        ether 02:42:ce:98:11:2d  txqueuelen 0  (Ethernet)
        RX packets 585535  bytes 33313003 (31.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 605413  bytes 4440526782 (4.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.109.13  netmask 255.255.240.0  broadcast 172.17.111.255
        ether 00:16:3e:12:a4:49  txqueuelen 1000  (Ethernet)
        RX packets 8259415  bytes 5899125416 (5.4 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6539516  bytes 2592253401 (2.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

2. 修改防火墙配置文件

vim /etc/firewalld/zones/public.xml

 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
# 文件位置
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="20"/>
  <port protocol="tcp" port="21"/>
  <port protocol="tcp" port="22"/>
  <port protocol="tcp" port="80"/>
  <port protocol="tcp" port="8888"/>
  <port protocol="tcp" port="39000-40000"/>
  <port protocol="tcp" port="443"/>
  <port protocol="tcp" port="12345"/>
  <port protocol="udp" port="12345"/>
  <port protocol="tcp" port="888"/>

<!-- docker ip-->
<rule family="ipv4">
    <source address="172.20.0.0/16"/>
    <accept/>
</rule>
<!-- 服务创建的网络段-->
<rule family="ipv4">
    <source address="172.30.0.0/16"/>
    <accept/>
</rule>
</zone>

3. 重启防火墙

1
2
3
# 重启防火墙
➜ service firewalld  restart
Redirecting to /bin/systemctl restart firewalld.service

4. 重启服务

1
2
# 重启服务
➜  docker-compose up -d