1.写dockerfile文件 在项目中
FROM centos:7.9.2009
FROM centos:7.9.2009
ENV MYPATH /root/project
WORKDIR $MYPATH
RUN yum -y update \
&& yum -y install vim \
&& yum -y install git \
&& yum install -y gcc-c++ \
&& yum -y install wget \
&& wget -P /root/ https://studygolang.com/dl/golang/go1.17.11.linux-amd64.tar.gz \
&& tar -zxvf /root/go1.17.11.linux-amd64.tar.gz -C /usr/local \
&& echo export PATH=$PATH:/usr/local/go/bin >> /etc/profile \
&& source /etc/profile && go version \
&& echo "source /etc/profile" >> /root/.bashrc \
&& go env -w GOPROXY=https://goproxy.cn,direct \
&& go env -w GO111MODULE=on \
注意点:(我遇到的bug)
1.第一句一定要写对应自己安装的centos版本写清楚版本号。
2.golang版本下载1.17的不然有的依赖会找不到,在docker上跑自己的项目的时候会报错
golang1.14 undefined: os.ErrDeadlineExceede
2.通过dockerfile文件生成镜像
docker build -f Dockerfile -t centos_go:7.9.2009 .
docker build -t ImageName:TagName dir
-t − 给镜像加一个Tag
ImageName − 给镜像起的名称
TagName − 给镜像的Tag名
Dir − Dockerfile所在目录
3.生成并运行容器
docker run -it -v /root/project/smart_campus/:/root/project/smart_campus --name smart_campus centos_go:7.9.2009 /bin/bash
--name 为容器指定一个名称
-v 将宿主机目录挂载到容器内 ;格式:宿主机目录:容器目录
-e 设置环境变量,该环境变量看覆盖Dockerfile中的ENV环境变量
-p 需要手动指定一个或多个映射端口号,格式为:主机(宿主)端口:容器端口 -p 80:8080
-P Docker会随机映射一个 49000~49900 的端口到内部容器开放的网络端口
-it 其中,-i以交互模式运行容器 ;-t为容器重新分配一个伪输入终端
-d 后台运行容器,并返回容器ID (没有此参数,容器在前台窗口运行,窗口关,随之关)
-it 开启新的终端,以交互方式进入容器内部(尾部要指定/bin/bash方式);和-d一起使用后,将不会进入容器内部。
注:该写法相当于把docker run命令和docker exec -it 命令合并的效果(区别是:前者run的同时,进入了容器内部,如果exit退出容器,容器状态(通过docker ps -a查看)立马会变成Exited状态;后者就不一样了,以此方式进入容器,然后exit退出容器,不会主动影响容器的原有状态)。
4.生成之后将项目和Dockerfile一起放在主机对应位置(Xftp)这样上一步容器里对应挂载的位置也有了
4.进入容器编译并执行项目(目的为了检测和服务器数据库的连接有无问题)
进入容器
docker exec -it 容器ID /bin/bash
进入存放项目的目录
cd smart_campus
编译
go build main.go
运行
go run mian.go &
成功了就说明连接数据库没问题
注意
第四步不行的,很大可能是因为数据库没有连接上,查看镜像然后生成mysql的容器,可以用Navicat连接上你服务器的数据库试试能不能连上,然后在Navicat中创建对应的数据库可以把本地的表移过来。
这个不会可以参考我的博客
https://blog.csdn.net/m0_52973251/article/details/125308804?spm=1001.2014.3001.5502
5.配置nginx代理
1.拉取nginx镜像
docker pull nginx
2.复制配置文件
docker run --name nginx-test -d nginx # 创建一个容器
mkdir /root/project/nginx # 在我们的project文件夹中创建一个nginx文件夹用来存放nginx方面的内容
docker cp nginx-test:/etc/nginx/nginx.conf /root/project/nginx/ # 从nginx容器中复制出配置文件 (不需要进入到容器中)
docker cp nginx-test:/etc/nginx/conf.d /root/project/nginx/
docker stop nginx-test # 停止容器运行
docker rm nginx-test # 删除测试容器
#创建正式的nginx容器
docker run -it --name nginx --net host -v /root/project/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/project/nginx/conf.d:/etc/nginx/conf.d -v /root/project/nginx/logs:/var/log/nginx -d nginx
3.配置nginx容器
cd /root/project/nginx/conf.d
cp default.conf smart_campus.conf # 复制一遍默认的配置文件
vim smart_campus.conf
把下面的内容放到smart_campus.conf文件中
下面是关于nginx的配置坑很多有兴趣可以看看
https://blog.csdn.net/qq_46312987/article/details/118895520
upstream myserver {
server 127.0.0.1:8080;
# 如果还有的话,可以继续往下写
# server XXXX;
# server XXXX;
}
server {
listen 80;
listen [::]:80;
client_max_body_size 20m;
server_name 38.5.15.5; # 你的服务器地址
location /blog {
proxy_pass http://myserver; # 后端访问端口
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#第二种 上面location和这个一样
# location /api { # 如果访问38.5.15.5/api为前缀的话,就会进入到这一块
# root html;
# index index.html index.htm;
# proxy_pass http://myserver; # 被转发到127.0.0.1:8080
# }
}
修改了配置文件之后,我们需要重启一下nginx容器,重新加载一下配置文件
docker restart nginx
最后
就是有三个容器,然后你在访问你的服务器地址加后缀就访问成功了
问题
1.go版本问题
golang版本下载1.17的不然有的依赖会找不到,在docker上跑自己的项目的时候会报错
golang1.14 undefined: os.ErrDeadlineExceede
&& wget -P /root/ https://studygolang.com/dl/golang/go1.17.11.linux-amd64.tar.gz \
&& tar -zxvf /root/go1.17.11.linux-amd64.tar.gz -C /usr/local \
在dockerfile中改一下版本
2.go服务没跑起来
可能是数据库连接有问题,解决见上面
3.数据库没连接起来
可能是因为权限不够,本来没这个问题这次遇到了,不过这样设置的话不是很安全
https://blog.csdn.net/shmily_404/article/details/122463609
4.nginx配置文件错误
解决见上面