docker部署教程g01 go 实战web | go 技术论坛-380玩彩网官网入口
1. 准备工作
- 安装docker desktop:确保已经安装并启动了docker desktop。
- 编写
dockerfile
:在项目根目录下创建一个名为dockerfile
的文件。 - 配置文件:确保你的配置文件(如
docker-compose.yaml
)中正确配置了mysql的连接信息。
2. 编写dockerfile(特别提示:我是提前编译好的goblog)
在dockerfile
中定义如何构建和运行你的go应用程序。以下是示例内容:
# 使用轻量级的alpine镜像作为运行环境
from alpine:latest
# 设置工作目录
workdir /root/
# 复制编译好的可执行文件到容器中
copy goblog .
# 复制.env文件到容器中
copy .env .
# 暴露应用端口
expose 3000
# 运行应用程序
cmd ["./goblog"]
配置mysql连接
确保你的配置文件(如docker-compose.yaml)中正确配置了mysql的连接信息。假设你的配置文件如下:services: app: build: . ports: - "3000:3000" environment: - app_name=goblog - app_env=local - app_key=33446a9dcf9ea060a0a6532b166da32f304af0de - app_debug=true - app_url=http://localhost:3000 - app_log_level=debug - app_port=3000 - db_connection=mysql - db_host=db - db_port=3306 - db_database=goblog - db_username=root - db_password=root - session_driver=cookie - session_name=goblog-session depends_on: - db db: image: mysql:5.7 environment: - mysql_root_password=root - mysql_database=goblog ports: - "3306:3306" volumes: - db_data:/var/lib/mysql volumes: db_data:
.env配置里修改如下
db_host=127.0.0.1改为db_host=host.docker.internal
注意:
host.docker.internal
是docker提供的一个特殊dns名称,用于从容器内部访问主机上的服务。5. 构建docker镜像
打开命令行工具(如powershell或cmd),进入项目根目录,执行以下命令来构建docker镜像:
docker build -t goblog .
6. 运行docker容器
构建完成后,可以通过以下命令运行docker容器:
docker run -d -p 8080:8080 --name goblog-container goblog
注意:goblog-container为容器名可以改为your-image-name
这会将主机的8080端口映射到容器内的8080端口,并以后台模式运行容器。
7. 验证部署
打开浏览器,访问http://localhost:8080
,如果一切正常,你应该能看到你的go应用程序正在运行。
注意事项
- mysql配置:确保mysql服务器正在运行,并且允许从
host.docker.internal
进行连接。 - 防火墙和安全组:确保防火墙或安全组没有阻止容器与主机之间的通信。
- 日志查看:如果遇到问题,可以使用
docker logs
命令查看容器的日志输出。
通过以上步骤,你应该能够在windows系统上成功使用docker部署goblog
项目,并关联本地的mysql数据库。
我在操作过程遇到的问题及的解决办法仅供参考
当docker容器启动后立即退出并显示exited(1)
时,通常表示容器内的应用程序在启动过程中遇到了错误。为了诊断问题,可以按照以下步骤进行排查和解决:
1. 查看容器日志
首先,查看容器的日志以获取详细的错误信息。使用以下命令查看日志:
docker logs goblog-container
这将输出容器启动时的日志信息,帮助你确定具体的问题所在。
- 检查配置文件
确保.env文件中的配置信息正确无误,特别是数据库连接信息。
确保mysql服务器正在运行,并且允许从host.docker.internal
进行连接。你可以通过以下命令检查mysql是否可以正常访问:
输入密码后,如果能够成功连接到mysql服务器,则说明配置正确。mysql -h host.docker.internal -u root -p
确保mysql允许远程连接
确保mysql服务器配置允许从host.docker.internal
进行连接。你可以在mysql配置文件(通常是my.cnf
或my.ini
)中添加或修改以下配置:
[mysqld]
bind-address = 0.0.0.0
然后重启mysql服务。
检查防火墙设置
确保防火墙没有阻止端口 3306 的流量。你可以临时禁用防火墙进行测试,或者配置防火墙规则允许端口 3306 的流量。
示例:windows 防火墙配置
打开“控制面板” -> “系统和安全” -> “windows defender 防火墙”。
点击“高级设置”。
在左侧选择“入站规则”,点击右侧的“新建规则”。
选择“端口”,点击“下一步”。
选择“tcp”,指定端口 3306,点击“下一步”。
选择“允许连接”,点击“下一步”。
根据需要选择适用的配置文件,点击“下一步”。
输入规则名称(例如“allow mysql port 3306”),点击“完成”。
如果容器日志为空,这通常意味着应用程序在启动时没有输出任何日志信息,这可能是由于以下几个原因导致的:
- 应用程序没有正确加载配置文件:确保应用程序能够正确读取
.env
文件。 - 应用程序在启动时没有输出日志:检查应用程序的代码,确保在启动时有日志输出。
- 应用程序在启动时立即崩溃:应用程序可能在启动时遇到了未捕获的错误,导致没有输出日志。
1. 确认应用程序加载配置文件
确保你的应用程序能够正确加载.env
文件。你可以在应用程序启动时添加一些日志输出,确认配置文件是否被正确加载。
示例代码修改
在main.go
中添加一些日志输出,确认配置文件是否被正确加载:
package main
import (
"embed"
"fmt"
"goblog/app/http/middlewares"
"goblog/bootstrap"
"goblog/config"
c "goblog/pkg/config"
"log"
"net/http"
)
//go:embed resources/views/articles/*
//go:embed resources/views/auth/*
//go:embed resources/views/categories/*
//go:embed resources/views/layouts/*
var tplfs embed.fs
//go:embed public/*
var staticfs embed.fs
func init() {
// 初始化配置信息
config.initialize()
// 输出配置信息以确认加载
log.printf("app name: %s", c.getstring("app.name"))
log.printf("app port: %s", c.getstring("app.port"))
log.printf("db host: %s", c.getstring("database.host"))
}
func main() {
log.println("starting goblog application...")
bootstrap.setupdb()
// 初始化模板
bootstrap.setuptemplate(tplfs)
router := bootstrap.setuproute(staticfs)
log.printf("listening on port %s...", c.getstring("app.port"))
http.listenandserve(":"c.getstring("app.port"), middlewares.removetrailingslash(router))
}
完。
本作品采用《cc 协议》,转载必须注明作者和本文链接
dockerfile那一步,直接使用二阶段构建更合适,本地不要做构建。