golang项目在idea中使用docker自动部署
一、docker 开启远程链接访问
- vi /usr/lib/systemd/system/docker.service 修改docker.service文件,添加监听端口。将ExecStart开头的那一行修改为:ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock。如图:
- systemctl daemon-reload systemctl的守护程序重新加载
- 重启docker服务:systemctl restart docker
切记服务器2375端口,不可开放公网端口访问,只能本机访问或者iptables防火墙指定IP。否则可能被挖矿病毒扫描到主机端口windows开启docker远程访问:
二、IDEA配置docker远程服务
三、服务器安装必要的服务(redis,mysql,etcd)
- 安装etcd的docker版本,单机部署Etcd:
docker run -d --name etcd-server
--network host
--publish 2379:2379
--publish 2380:2380
--env ALLOW_NONE_AUTHENTICATION=yes
--env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379
bitnami/etcd:latest- mysql添加用户,授权创建数据库
- mysql -u root -p 连接数据库
- 创建用户:CREATE USER 'username'@'%' IDENTIFIED BY 'password'; 这里用户可任意主机访问,可以防火墙限制3306指定IP访问
- 用户授权 // 查询mysql数据库用户 select host,user,authentication_string from mysql.user; // 查看用户权限 show grants for 用户; // 授全部权限(慎用) GRANT ALL PRIVILEGES ON * . * TO 'anyue'@'%'; // 刷新权限 FLUSH PRIVILEGES;
四、项目创建Dockerfile
- golang项目根目录写Dockerfile文件,这里写一个简单的作为示例:
FROM alpine // 拉取一个简洁的基础镜像
WORKDIR /opt // 设置工作目录
ADD cmsrpc /opt/ // copy编译好的程序到工作目录
ADD ./com.anyue.rpc.cms/cmsrpc/etc /opt/etc // copy配置文件到工作区
EXPOSE 8876 // 指定端口
CMD [ "./cmsrpc" ]为了加快部署,我们采用先编译再构建镜像,这样可以使镜像尽可能小,减少编译不必要的环境打包。
- 多级构建,使用Docker部署项目时,只需要把编译及运行环境分开,就能够减小镜像的大小。可以在dockerfile中采用两阶段构建,Dockerfile示例代码:
#基础镜像,这也是我本地的golang版本
FROM golang:1.17.10 as builder
#环境变量
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
#指定工作目录
WORKDIR /go/src/labs.api
#复制根目录内所有源码文件到工作目录下
COPY . .
#编译
RUN GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -installsuffix cgo .
#基础镜像,运行环境
FROM ubuntu:18.04 as runner
#指定工作目录
WORKDIR /go/app
#复制二进制执行文件和必要的Configs目录到工作目录
COPY --from=builder /go/src/labs.api/labs.api .
COPY --from=builder /go/src/labs.api/configs ./configs
#暴露的端口
EXPOSE 18888
#运行 labs.api是我的项目名称
CMD ["./labs.api"]五、IDEA自动构建项设置
- 设置goland构建配置
- 运行参数配置:--restart=always --network=host --env GO_APP_PORT=8876 --expose 8876 -d --security-opt=seccomp:unconfined
- 脚本自动部署可使用命令
--restart=always \
--network=host \
--env AnyuePubEnv=dev \
--env GO_APP_PORT=8876 \
--expose 8876 \
-d \
-p 8876:8876 \
-v /etc/localtime:/etc/localtime \
-v /home/anyueserver/logs/cmsrpc:/opt/logs \
--security-opt=seccomp:unconfined