forked from go/golangs_learn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
6.3 KiB
170 lines
6.3 KiB
4 years ago
|
# Gin(十三):交叉编译和Docker部署
|
||
|
|
||
|
陆陆续续已经更新到了第十三期,基本的知识点都已经讲解的差不多,那么最后一步就是对项目进行部署。这里我们将项目部署到 Linux 的服务器 Docker 上。本期知识点包括**交叉编译**和**Docker部署**。
|
||
|
|
||
|
# 交叉编译
|
||
|
|
||
|
什么是交叉编译呢?交叉编辑简单的说就是一个平台生成另一个平台的可执行程序。我们大部分开发环境是 windows 或者 macOS ,当然也有使用 linux 用户(其实在 windows 上更加推荐使用 WSL 进行开发),而我们的上线服务器一般都是 linux,所以我们要进行项目的交叉编译。Go 中对交叉编译相对简单,我们只需要进行简单的设置即可完成交叉编译。
|
||
|
|
||
|
打开我们的项目根目录,打开终端,设置 GOOS 和 GOARCH。
|
||
|
|
||
|
在 windows 下编译为 linux 程序。
|
||
|
|
||
|
```powershell
|
||
|
SET CGO_ENABLED=0
|
||
|
SET GOOS=linux
|
||
|
SET GOARCH=amd64
|
||
|
go build -o out/linux/gin_hello .
|
||
|
```
|
||
|
|
||
|
这里的 `go build -o out/linux/gin_hello` 是指将编译后的文件输出到 out/linux 下,编译后的二进制叫做 gin_hello 。
|
||
|
|
||
|
我将命令写到了 `.bat` 方便处理,不用每次都执行贴一下这几行命令。
|
||
|
|
||
|
在项目根目录下新建立 `build.bat` ,然后执行该文件。当然,很多工程或者项目使用 `Makefile` 进行的编译
|
||
|
|
||
|
```cmd
|
||
|
SET CGO_ENABLED=0
|
||
|
SET GOOS=linux
|
||
|
SET GOARCH=amd64
|
||
|
go build -o out/linux/gin_hello .
|
||
|
exit
|
||
|
```
|
||
|
|
||
|
执行完该文件就会在 out/linux 下出现 gin_hello
|
||
|
|
||
|
这里我们便完成了交叉编译,编译后的程序是 linux 下的可执行文件。
|
||
|
|
||
|
# 安装 Dokcer
|
||
|
|
||
|
这里使用的操作系统为 centos 7 ,安装前要更新一下软件源 `sudo yum update` ,之后对 Docker 软件源进行添加。
|
||
|
|
||
|
```shell
|
||
|
sudo yum-config-manager \
|
||
|
--add-repo \
|
||
|
https://download.docker.com/linux/centos/docker-ce.repo
|
||
|
```
|
||
|
|
||
|
再次更新一下软件源 `sudo yum update` ,最后就可以安装我们的 docker 了
|
||
|
|
||
|
```shell
|
||
|
sudo yum install docker-ce
|
||
|
```
|
||
|
|
||
|
添加到开机启动
|
||
|
|
||
|
```shell
|
||
|
sudo systemctl enable docker
|
||
|
```
|
||
|
|
||
|
启动Docker
|
||
|
|
||
|
```shell
|
||
|
sudo systemctl start docker
|
||
|
```
|
||
|
|
||
|
此时,我们的 Docker 已经完成安装。但是我们还需要为我们的 Docker 设置远程连接,让我们本地开发可以连接到服务器。
|
||
|
|
||
|
> **警告** 下面的方法仅仅是为了教程演示 **请勿在生成环境中使用该方法,该方法存在缺陷,使 Docker 端口暴漏在公网环境中,任何人都可以在Docker进行部署。如果需要生产环境中打开远程端口,需要配置权限认证方式,这里不过多做介绍**
|
||
|
|
||
|
在 Centos 7 中,进行对下面的文件进行编辑
|
||
|
|
||
|
```shell
|
||
|
vim /usr/lib/systemd/system/docker.service
|
||
|
```
|
||
|
|
||
|
找到 ExecStart 开头的进行如下添加和修改。
|
||
|
|
||
|
```shell
|
||
|
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
|
||
|
```
|
||
|
|
||
|
此时,重启服务器或者重新启动 Docker 就完成了 Docker 的远程连接。
|
||
|
|
||
|
# 安装数据库
|
||
|
|
||
|
首先我们要在 dockers 上进行 数据库 MySQL 的安装。首先在执行我们的搜索命令,看看能不能找到MySQL 相关的信息 `docker search mysql` 。
|
||
|
|
||
|
![安装目录情况](./img/13.1.jpeg)
|
||
|
|
||
|
确认可以查找到 MySQL 后,就可以完成 MySQL 进行的拉取 ,通过命令 `docker pull mysql` 拉取 MySQL 镜像。此时并没有指定 MySQL 的版本,会给我们拉取最新的 MySQL 版本。
|
||
|
|
||
|
拉取完毕,通过 `docker iamges` 查看当前所有的镜像,这里我们只有一个 MySQL 。
|
||
|
|
||
|
![安装情况](./img/13.2.jpeg)
|
||
|
|
||
|
我已经对 MySQL 镜像进行了获取,那么接下来就是通过镜像创建容器。
|
||
|
|
||
|
```shell
|
||
|
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql
|
||
|
```
|
||
|
|
||
|
此时我们的 MySQL 容器就创建成功,并且启动完成,而且我们制定了 MySQL 的密码为 1234,端口为 3306。
|
||
|
|
||
|
```shell
|
||
|
docker exec -it mysql /bin/bash
|
||
|
```
|
||
|
|
||
|
我们为 MySQL 指定一个终端,来进行数据库的创建。
|
||
|
|
||
|
输入 `mysql -u root -p` 回车后输入密码 `1234`,进入数据库。输入 `create database ginhello` 和我们本地数据库名称一致。
|
||
|
|
||
|
这样,我们在服务器上的操作就完成了。
|
||
|
|
||
|
# Goland 连接 Docker,并部署项目
|
||
|
|
||
|
首先我们要对我们的代码进行简单的修改,之前我们一直是 DEBUG 模式在运行项目,而现在我们要正式上线了,需要修改我们的启动模式,在 `main.go` 中进行添加。
|
||
|
|
||
|
```go
|
||
|
gin.SetMode(gin.ReleaseMode)
|
||
|
```
|
||
|
|
||
|
此时就可以执行我们的交叉编译时候写的脚本 build.bat,会生成新的 linux 可执行文件。
|
||
|
|
||
|
新建 Dockerfile,编写 Dockerfile
|
||
|
|
||
|
```dockerfile
|
||
|
FROM alpine
|
||
|
|
||
|
WORKDIR /web/gin
|
||
|
|
||
|
COPY ./out/linux/. .
|
||
|
|
||
|
CMD ./gin_hello
|
||
|
```
|
||
|
|
||
|
简单的说一下这些含义,拉取一个 alpine 的镜像,这基本是最小的 linux , 指定我们的 WORKDIR, 将我们生成的 linux 可执行程序复制到 WORKDIR 下,运行项目。
|
||
|
|
||
|
当然这些还不够,当我们编写完成该文件的时候,在第一行会出现运行按钮。
|
||
|
|
||
|
单击运行按钮,选择 **Edit ‘Dockerfile’**
|
||
|
|
||
|
![操作代码设置](./img/13.3.jpeg)
|
||
|
|
||
|
会出现下面的界面。点击 ① 处的省略号,出现旁边的界面,进行 Docker 的配置,在 ② 处填写我们的 IP 端口为 2375 设置完成后,等待,看看 ③ 处是否有 Connection successful 。否者链接失败,查看上述步骤是否出错。完成后点击 OK。
|
||
|
|
||
|
![操作代码设置1](./img/13.4.jpeg)
|
||
|
|
||
|
完成 Docker 的配置,接着完成端口映射。
|
||
|
|
||
|
![操作代码设置2](./img/13.5.jpeg)
|
||
|
|
||
|
Host port 表示宿主主机端口,就是我们的服务器端口,而 Container port 表示我们的 容器的端口。因为 gin 项目运行在容器内,且启动端口为 8080,我们通过端口映射,访问宿主主机 80 端口,而映射到 8080 端口。
|
||
|
|
||
|
完成上述设置,就可以点击启动我们的 Dockerfile。
|
||
|
|
||
|
![操作代码设置3](./img/13.6.jpeg)
|
||
|
|
||
|
我们可以在 Goland 的 Service 中找到当前进度。
|
||
|
|
||
|
等待完成,打开服务器公网IP。
|
||
|
|
||
|
![页面效果](./img/13.7.jpeg)
|
||
|
|
||
|
可以看到我们之前写的代码。
|
||
|
|
||
|
此时我们就完成了部署。
|
||
|
|
||
|
# 总结
|
||
|
|
||
|
通过本章节的 交叉编译,Docker 安装,Docker 镜像安装和启动容器,部署 Gin 项目,完成了一个项目通过 Docker上线部署的过程。
|