一、背景
- 在我们日常开发过程中, 有些特殊情况需要在服务器上, 进行开发和调试代码
- 所以需要将我们的代码编辑器连接到服务上
- 比如说连接到Docker容器上进行开发和调试
- 下面将详细介绍服务器主机配置和开发工具整体配置方式, 以对接服务Harbor为例子(主要是在容器运行时, 接入harbor网桥, 使用Harbor中的pgsql数据库, 大家不必关心,只是个例子), 原理是相通的
- 本文档介绍远程部署GO的开发环境
- 老样子, 不废话,直接开干
二、环境准备
- 工作目录准备
- 在服务器主机上创建目录
- 下载go安装包
- 创建一个空的Dockerfile文件
[root@base harbor-clean]# mkdir -p /home/troila/app/harbor-clean
[root@base harbor-clean]# cd /home/troila/app/harbor-clean
# 当前目录结构如下
[root@base harbor-clean]# tree
.
├── Dockerfile
└── go1.22.5.linux-amd64.tar.gz
0 directories, 2 files
[root@base harbor-clean]#
- 服务器环境
- docker环境
[root@base harbor-clean]# docker info
Client: Docker Engine - Community
Version: 26.1.4
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.14.1
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.27.1
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 12
Running: 12
Paused: 0
Stopped: 0
Images: 14
Server Version: 26.1.4
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: systemd
Cgroup Version: 1
.......
Registry Mirrors:
https://registry.cn-hangzhou.aliyuncs.com/
https://registry.docker-cn.com/
https://docker.mirrors.ustc.edu.cn/
https://ma8p1z36.mirror.aliyuncs.com/
https://mirror.ccs.tencentyun.com/
http://hub-mirror.c.163.com/
Live Restore Enabled: true
[root@base harbor-clean]#
- 镜像准备
- 下载镜像
[root@base harbor-clean]# docker pull ubuntu:24.10
- 自定义镜像
- 设置远程连接
- 安装go环境
- 工作目录设置为workspace, 后续GO开发的代码都将实时同步到此目录
- 容器启动后, 自动配置GO环境, 自动启动SSH服务, ssh密码可以自己修改
- 复制一下代码到上述创建的Dockerfile中
[root@base harbor-clean]# vi Dockerfile
# 使用 ubuntu:24.10 作为基础镜像
FROM ubuntu:24.10
# 设置工作目录
WORKDIR /workspace
# 设置识趣
ENV TZ=Asia/Shanghai
# 设置GO的版本
ENV GO_VERSION=1.22.5
# 设置SSH密码
ENV SSH_PASSWORD=troila@123
# 设置GO环境变量
ENV PATH="$PATH:/usr/local/go/bin"
# 复制已经下载的go环境文件
COPY go${GO_VERSION}.linux-amd64.tar.gz /workspace
# 更新包索引并安装必要工具, 容器中创建go相关的文件夹, 开启ssh远程连接
RUN apt-get update && apt-get install -y --no-install-recommends curl openssh-server ca-certificates postgresql-client && apt-get clean && \
mkdir -p /workspace/src && \
mkdir -p /workspace/pkg && \
mkdir -p /workspace/bin && \
mkdir -p /workspace/env && \
echo "root:${SSH_PASSWORD}" | chpasswd && \
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/" /etc/ssh/sshd_config && \
sed -i "s/#PasswordAuthentication yes/PasswordAuthentication yes/" /etc/ssh/sshd_config && \
rm -rf /var/lib/apt/lists/*
# 安装并配置GO环境
RUN tar -C /usr/local -xzf /workspace/go${GO_VERSION}.linux-amd64.tar.gz && rm go${GO_VERSION}.linux-amd64.tar.gz && \
go env -w GO111MODULE=on && \
go env -w GOPROXY=https://goproxy.cn,direct && \
go env -w GOPATH=/workspace && \
echo "export PATH=$PATH:/usr/local/go/bin:/workspace/bin" >> /etc/profile && \
echo "export GOPATH=/workspace" >> /etc/profile && \
go install github.com/swaggo/swag/cmd/swag@latest && \
go install github.com/zxmfke/swagger2openapi3/cmd/swag2op@latest
# 默认命令
CMD ["/bin/bash", "-c", "service ssh start && bash"]
[root@base harbor-clean]#
- 构建镜像
- 在当前目录下构建镜像, 别忘了后面的点
[root@base harbor-clean]# docker build -t troila-harbor-clean:v2.10.3 .
- 检查镜像
[root@base harbor-clean]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
troila-harbor-clean v2.10.3 646ab3e521df 3 hours ago 798MB
ubuntu 24.10 94351b6d67ec 9 months ago 78.2MB
base.troila.com:9000/library/nacos-server v2.4.2 53ac5b6aa651 6 months ago 285MB
goharbor/redis-photon v2.10.3 359683ebd59c 8 months ago 165MB
goharbor/harbor-registryctl v2.10.3 96efb27ac641 8 months ago 152MB
goharbor/registry-photon v2.10.3 f73ad548d874 8 months ago 84.7MB
goharbor/nginx-photon v2.10.3 0ae16f53f286 8 months ago 154MB
goharbor/harbor-log v2.10.3 9ee81cca16ce 8 months ago 163MB
goharbor/harbor-jobservice v2.10.3 053df0842d37 8 months ago 143MB
goharbor/harbor-core v2.10.3 ed909856be82 8 months ago 171MB
goharbor/harbor-portal v2.10.3 c8c29cea2ef3 8 months ago 162MB
goharbor/harbor-db v2.10.3 c623b46fd89d 8 months ago 269MB
base.troila.com:9000/library/ubuntu 24.10 94351b6d67ec 9 months ago 78.2MB
base.troila.com:9000/library/mysql 8.0.22 d4c3cafb11d5 4 years ago 545MB
[root@base harbor-clean]#
- 运行容器
- 我这里要调用harbor的db, 所以要添加网桥
- 设置容器名称为clean
- 映射容器内部8050端口到宿主机, 后续容器内部的应用用8050端口, 提前做映射
- 映射内部22远程访问端口到宿主机的2222端口, 后续远程连接使用
- 开启伪终端, 保持后台运行
[root@base harbor-clean]# docker run -idt --name clean --network harbor_harbor -p 8050:8050 -p 2222:22 -v /home/troila/harbor/data:/harbor/data troila-harbor-clean:v2.10.3
## 查看容器运行情况
[root@base harbor-clean]#
[root@base harbor-clean]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
402f9a9f9b7c troila-harbor-clean:v2.10.3 "/bin/bash -c 'servi…" 3 hours ago Up 3 hours 0.0.0.0:8050->8050/tcp, 0.0.0.0:2222->22/tcp clean
c7a3f5639e7d goharbor/harbor-jobservice:v2.10.3 "/harbor/entrypoint.…" 3 months ago Up 3 months harbor-jobservice
2eb1141752c3 goharbor/nginx-photon:v2.10.3 "nginx -g 'daemon of…" 3 months ago Up 3 months 0.0.0.0:9000->8080/tcp, :::9000->8080/tcp nginx
c8f29eb447a5 goharbor/harbor-core:v2.10.3 "/harbor/entrypoint.…" 3 months ago Up 3 months harbor-core
25dd3dd92d98 goharbor/harbor-registryctl:v2.10.3 "/home/harbor/start.…" 3 months ago Up 3 months registryctl
7c4c0f0a1f85 goharbor/registry-photon:v2.10.3 "/home/harbor/entryp…" 3 months ago Up 3 months registry
ced3e88c5355 goharbor/harbor-portal:v2.10.3 "nginx -g 'daemon of…" 3 months ago Up 3 months harbor-portal
436b0ddd8f07 goharbor/harbor-db:v2.10.3 "/docker-entrypoint.…" 3 months ago Up 3 months harbor-db
f1ea8e121746 goharbor/redis-photon:v2.10.3 "redis-server /etc/r…" 3 months ago Up 3 months redis
3b390c0a99a0 goharbor/harbor-log:v2.10.3 "/bin/sh -c /usr/loc…" 3 months ago Up 3 months 127.0.0.1:1514->10514/tcp harbor-log
[root@base harbor-clean]#
- 终端连接验证
- 地址填写宿主机ip
- 端口填写22端口映射的端口
- 用户、密码填写ssh用户和密码, 参考上述dockerfile
- 连接成功如图
- 验证容器开发环境
- 版本正确
- 服务器配置到此结束
Last login: Wed Mar 19 03:10:20 2025 from 172.28.110.9
root@402f9a9f9b7c:~# go version
go version go1.22.5 linux/amd64
## 查看配置
root@402f9a9f9b7c:~# go env
GO111MODULE='on'
GOARCH='amd64'
..........
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
...................
GOMODCACHE='/workspace/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/workspace'
GOPRIVATE=''
GOPROXY='https://goproxy.cn,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.22.5'
.............
root@402f9a9f9b7c:~#
- 在容器中创建空项目, 为后续连接使用
root@402f9a9f9b7c:~# mkdir -p /workspace/src/xincan.com.cn/tarot-harbor-clean
三、GoLand配置
- 本机工程目录
## 本地工作开发目录
~/workspace/goworkspace ll
total 0
drwxr-xr-x 11 xincan staff 352B 1 7 14:27 bin
drwxr-xr-x 5 xincan staff 160B 8 16 2024 pkg
drwxr-xr-x 6 xincan staff 192B 12 21 14:27 src
~/workspace/goworkspace
## 代码位置, src下创建xincan.com.cn/tarot-harbor-clean
~/workspace/goworkspace/src/xincan.com.cn ll
total 0
drwxr-xr-x 4 xincan staff 128B 11 13 14:26 tarot-harbor-clean
~/workspace/goworkspace/src/xincan.com.cn
- GoLand打开创建的项目
- 设定go环境
- 点击确定ok
- 点击运行环境配置
- 填写服务器主机ip, 映射出来的端口
- ssh登录用户
- 点击NEXT
- 点击OK
- 填写密码
- 点击NEXT
- Project path on target: 此处填写上述第二步, 第9部分在容器中创建的目录/workspace/src/xincan.com.cn/tarot-harbor-clean
- 点击ok
- Go Executable: 此处填写服务器中的容器中的go环境安装位置, 可以通过go env查看, 也可以在Dockerfile中找到
- GOPATH: 此处直接在服务器中的容器中用go env查看, 也可在Dockerfile中找到
- 展开Additional Settings
- 配置Project sources directory: 服务器中的容器中的存放代码资源的文件夹, 如下图
- 配置Complied dexecutables directory: 服务器中的容器中的编译后执行文件位置, 如下图
- 点击CREATE创建
- 点击链接成功
- 选择刚才创建连接的服务端信息
- 点击ok
- 在编辑器中(下方),当前文件夹下执行go mod init 项目初始化
- 创建一个main.go文件, 代码测试
- 运行代码
- 控制台中输出打印成功信息
- 服务器容器内部检查
- 发现刚才在本地代码编辑器中的文件目录和代码, 都已经上传服务器中了
三、验证服务器中容器中的代码是否是在其内部执行
- 获取服务器傻姑娘workspace下的文件夹, 有哪些
- 成功获取服务上的文件夹
- 说明本地运行代码, 实则是服务器上在跑代码
完结