每日一Go-60、Docker 实操(Go 工程从 0 到跑起来)

9 阅读1分钟

别再停留在“我懂Docker了”,工程师只认一件事:能不能跑。改变思维,赶紧上车吧!

一、准备环境

1. 安装Docker Desktop

 访问官网 www.docker.com,下载Docker Desktop。这里我选择windows64位版本,你可以根据你的系统来选择。

图片

下载完后,双击安装包“Docker Desktop Installer.exe”,都默认下一步安装好。

图片

2. 验证安装

双击桌面上的“Docker Desktop”图标,启动Docker。

图片

打开终端“Tabby”,输入以下命令验证

$ docker version                                                                            
Client:                                                                                     
 Version:           29.1.3                                                                  
 API version:       1.52                                                                    
 Go version:        go1.25.5                                                                
 Git commit:        f52814d                                                                 
 Built:             Fri Dec 12 14:51:52 2025                                                
 OS/Arch:           windows/amd64                                                           
 Context:           desktop-linux                                                           

Server: Docker Desktop 4.55.0 (213807)                                                      
 Engine:                                                                                    
  Version:          29.1.3                                                                  
  API version:      1.52 (minimum version 1.44)                                             
  Go version:       go1.25.5                                                                
  Git commit:       fbf3ed2                                                                 
  Built:            Fri Dec 12 14:49:51 2025                                                
  OS/Arch:          linux/amd64                                                             
  Experimental:     false                                                                   
 containerd:                                                                                
  Version:          v2.2.0                                                                  
  GitCommit:        1c4457e00facac03ce1d75f7b6777a7a851e5c41                                
 runc:                                                                                      
  Version:          1.3.4                                                                   
  GitCommit:        v1.3.4-0-gd6d73eb8                                                      
 docker-init:                                                                               
  Version:          0.19.0                                                                  
  GitCommit:        de40ad0    

运行一个容器试试,如果见到“Hello, Codee君!”,说明成功了!

$ docker pull imoowi/golang_per_day:day60
$ docker run imoowi/golang_per_day:day60
Hello, Codee君!

二、写一个可运行的Gin Web服务

1. main.go

// 包声明,定义包名为 main
package main
// 导入依赖包
import (
    "github.com/gin-gonic/gin"
)
// 主函数,程序入口
func main() {
    // fmt.Println("Hello, Codee君!")
    // 创建默认的 Gin 路由引擎
    r := gin.Default()
    // 定义 GET 路由 /ping,处理函数返回 JSON 格式的响应
    r.GET("/ping"func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message""pong",
        })
    })
    // 启动 HTTP 服务器,监听 8080 端口
    r.Run(":8080")
}

2. 本地跑一次

 go run .
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)     
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080
[GIN] 2026/01/03 - 17:01:38 | 200 |            0|             ::1 | GET      "/ping"

3. 浏览器访问 http://localhost:8080/ping

图片

三、编写Dockerfile

1. Dockerfile

#-----------构建阶段---------
# 使用 Go 1.25.5 Alpine 版本作为构建镜像
FROM golang:1.25.5-alpine AS builder
# 设置工作目录为 /app
WORKDIR /app
# 复制当前目录下的所有文件到容器中
COPY . .
# 编译 Go 程序,生成可执行文件 main
RUN go build -o main .
# 使用最新的 Alpine 镜像作为运行时镜像
#-----------运行阶段---------
FROM alpine:latest
# 设置工作目录为 /app
WORKDIR /app
# 暴露 8080 端口
EXPOSE 8080
# 从构建阶段复制编译好的可执行文件到运行时镜像
COPY --from=builder /app/main /app/golang_per_day
# 运行程序
CMD ["/app/golang_per_day"]

【敲黑板】:Dockerfile里必须要多阶段构建,能够极大减小镜像的大小

2. 构建镜像:

docker build -t golang_per_day:v1 .

图片

3. 运行容器:

docker run --name golang_per_day_60 -d -p 8080:8080 golang_per_day:v1
a17dc2f68d76380fc09cc02165e17a6f38269ce9e3e97a5305236a1c382f0e62

4. 验证:

图片

图片

5. 浏览器访问,返回pong即为成功。

图片

四、Docker常用命令【必须背下来】

1. 查看容器

docker ps
docker ps -a

图片

CONTAINER ID: 容器id
IMAGE:镜像名
COMMAND:启动命令
CREATED:容器创建时间
STATUS:容器状态
PORTS:宿主机和容器的端口映射
NAMES:容器名称

2. 查看日志

docker logs <容器id/容器名称>

图片

图片

3. 进入容器

docker exec -it <容器id/容器名称> sh

图片

4. 停止容器

docker stop <容器id/容器名称>

图片

5. 删除容器

docker rm <容器id/容器名称>

图片

图片

6. 构建镜像

docker build -t <镜像仓库地址>:<镜像版本号> .

图片

7. 拉取镜像

docker pull <镜像名称>

图片

8. 推送镜像

    8.1 有镜像仓库的情况下

docker push <镜像名称>

图片

在镜像仓库(hub.docker.com/)就可以看见你刚才pu…

图片

    8.2 无镜像仓库的情况

把镜像导出为一个包,上传到目标服务器上,在目标服务器上再次导入。

        8.2.1 导出镜像包

docker save -o <镜像包名> <镜像名称>
docker save -o golang_per_day_60.tar  imoowi/golang_per_day:day60         

        8.2.2 导入镜像包

docker load -i /data/upload/golang_per_day_60.tar

9. 查看镜像

docker images

图片

图片

10. 删除镜像

docker rmi <镜像id>

图片

五、用dokcer-compose来操作一批容器服务

1. 新建docker-compose.yml

# 定义网络配置
networks:
  codee_jun:
    driver: bridge
# 定义服务配置
services:
  # day60 服务配置 - Go 应用程序
  day60:
    # 指定使用的镜像
    image: imoowi/golang_per_day:day60
    # 设置容器名称
    container_name: day60
    # 端口映射:将宿主机的 8080 端口映射到容器的 8080 端口
    ports:
      - 8080:8080
    # 定义服务依赖关系,确保 MySQL 和 Redis 服务先启动
    depends_on:
      - mysql
      - redis
    # 设置重启策略:容器退出时总是自动重启
    restart: always
    # 指定使用的网络
    networks:
      - codee_jun
  
  # MySQL 服务配置 - 数据库服务
  mysql:
    # 设置容器名称
    container_name: mysql
    # 指定使用的 MySQL 镜像版本
    image: mysql:5.7
    # 端口映射:将宿主机的 3306 端口映射到容器的 3306 端口
    ports:
      - 3306:3306
    # 设置环境变量:MySQL root 用户密码
    environment:
      MYSQL_ROOT_PASSWORD: "123456"
    # 数据卷挂载:将宿主机的 ./mysql/data 目录挂载到容器的 /var/lib/mysql 目录,实现数据持久化
    volumes:
      - ./mysql/data:/var/lib/mysql
    # 自定义 MySQL 启动命令
    command:
      [
        "--character-set-server=utf8mb4",
        "--collation-server=utf8mb4_unicode_ci",
        "--max_connections=3000",
      ]
    # 设置重启策略:容器退出时总是自动重启
    restart: always
    # 指定使用的网络
    networks:
      - codee_jun
  
  # Redis 服务配置 - 缓存服务
  redis:
    # 设置容器名称
    container_name: redis
    # 指定使用的 Redis 镜像版本
    image: redis:latest
    # 自定义 Redis 启动命令:设置密码为 123456
    command: redis-server --requirepass 123456
    # 端口映射:将宿主机的 6379 端口映射到容器的 6379 端口
    ports:
      - 6379:6379
    # 数据卷挂载:将宿主机的 ./redis/db 目录挂载到容器的 /data 目录,实现数据持久化
    volumes:
      - ./redis/db:/data
    # 设置重启策略:容器退出时总是自动重启
    restart: always
    # 指定使用的网络
    networks:
      - codee_jun

2. 启动服务

$ docker-compose up -d
[+] Running 4/4
 ✔ Network day_60_codee_jun  Created                                                                                                                                                                                     0.1s 
 ✔ Container redis           Started                                                                                                                                                                                     0.8s 
 ✔ Container mysql           Started                                                                                                                                                                                     0.8s 
 ✔ Container day60           Started   

图片

3. 停止服务

$ docker-compose down
[+] Running 4/4
 ✔ Container day60           Removed                                                                                                                                                                                     0.5s 
 ✔ Container redis           Removed                                                                                                                                                                                     0.5s 
 ✔ Container mysql           Removed                                                                                                                                                                                     1.5s 
 ✔ Network day_60_codee_jun  Removed    

六、工程师现实比喻

Docker 实操,本质是一次“职业觉醒”。

  • 不会Docker的工程师:

  • 依赖环境

  • 依赖运维

  • 依赖“别出事”

  • 会Docker的工程师:

  • 我交付的是完整的系统

  • 我对结果负责

  • 到哪儿都能上线

你能不能把一个服务从代码送到线上跑起来,这一步,Docker是分水岭。


*源码地址*

1、公众号“Codee君”回复“源码”获取源码

2、pan.baidu.com/s/1B6pgLWfS…


友情链接:加班费计算器(vx小程序搜索“加班计”)


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!