别再停留在“我懂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 | 0s | ::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君”回复“源码”获取源码
友情链接:加班费计算器(vx小程序搜索“加班计”)
如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!