CentOS7 Docker 部署 SWAPI 后端


文章目录

  • CentOS7 Docker 部署 SWAPI 后端
  • 后端 golang 项目地址
  • Docker 安装
  • 升级内核
  • 卸载 Docker 旧版本
  • Docker 安装
  • 启动 Docker
  • Dockerfile 文件
  • 指定基础镜像
  • 安装 goalng 开发环境
  • 配置 golang 环境变量
  • 获取源代码
  • 编译
  • 指定容器入口
  • Dockerfile 语法说明
  • 生成镜像
  • 启动容器


后端 golang 项目地址

https://github.com/serviceComputing711/MySWAPI

Docker 安装

升级内核


卸载 Docker 旧版本

yum -y remove docker docker-common docker-selinux docker-engine docker-engine-selinux container-selinux docker-ce

#删除所有的镜像、容器、数据卷、配置文件等
sudo rm -rf /var/lib/docker

# 查看安装的docker相关软件 卸载情况
yum list installed | grep docker

Docker 安装

# set up repository
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# use Aliyun Docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
   
# 安装最新版
sudo yum install docker-ce

启动 Docker

# Start docker service
systemctl enable docker
systemctl start docker

# 重新加载设置  重启引擎
systemctl daemon-reload
systemctl restart docker

Dockerfile 文件

实际上,如果只是为了单次部署,可以通过启动并进入docker容器,然后搭建相应的服务,最后保存到自定义镜像里即可。但是如此生成的镜像不可重现,因为单从镜像文件启动的容器信息很难反推当初自己做过什么环境搭建和服务部署了。Dockerfile 的好处是让这些过程变得透明,因为其中描述了镜像生成的全过程,以及容器启动的入口等。

指定基础镜像

# 环境
FROM centos:7

# 作者
MAINTAINER blesswxl <blesswxl@gmail.com>

基于官方的 centos7 镜像搭建 golang 开发环境,然后使用 golang 实现 SWAPI 后端服务器,并在容器内启动该服务。

安装 goalng 开发环境

# install gcc
RUN yum install -y gcc

# install golang
RUN yum install -y go

因为 golang 可能依赖于 gcc,因此需要先安装 gcc。

配置 golang 环境变量

# config GOROOT
ENV GOROOT /usr/lib/golang
ENV PATH=$PATH:/usr/lib/golang/bin

# config GOPATH
RUN mkdir -p /root/gopath
RUN mkdir -p /root/gopath/src
RUN mkdir -p /root/gopath/pkg
RUN mkdir -p /root/gopath/bin
ENV GOPATH /root/gopath

GOROOT 是 golang 的安装路径,GOPATH 则是 golang 的开发包路径,其中包括 src/pkg/bin 三个子目录,分别用于存储 golang 源代码、golang 编译生成的包,以及编译生成的可执行文件。除了设置 GOROOT 和 GOPATH 之外,还需要在操作系统的PATH变量内加入$GOROOT/bin,以让 go 工具可以被操作系统找到。

获取源代码

# copy source files
RUN go get github.com/serviceComputing711/MySWAPI
RUN mkdir -p $GOPATH/src/github.com/serviceComputing711/MySWAPI
COPY src/* $GOPATH/src/github.com/serviceComputing711/MySWAPI

编译

# build the server
WORKDIR $GOPATH/src/github.com/serviceComputing711/MySWAPI
RUN go build -o server.bin main.go

WORKDIR 将容器的工作目录切换到 server 目录,然后执行 go build 编译得到可执行文件 server.bin。

指定容器入口

# startup the server
CMD $GOPATH/src/github.com/serviceComputing711/MySWAPI/server.bin

CMD 指定容器启动后默认执行的程序,也就是我们刚刚生成的服务器。

Dockerfile 语法说明

https://studygolang.com/articles/12670

1、 FROM

指定基础镜像(必须有的指令,并且必须是第一条指令)

2、 WORKDIR

格式为 WORKDIR <工作目录路径>

使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如果目录不存在,WORKDIR会帮你建立目录

3、COPY

格式:

COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

4、RUN

用于执行命令行命令

格式:RUN <命令>

5、EXPOSE

格式为 EXPOSE <端口1> [<端口2>…]

EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务

在 Dockerfile 中写入这样的声明有两个好处

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射
  • 运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口

6、ENTRYPOINT

ENTRYPOINT 的格式和 RUN 指令格式一样,分为两种格式

  • exec 格式:
<ENTRYPOINT> "<CMD>"
  • shell 格式:
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

ENTRYPOINT 指令是指定容器启动程序及参数

生成镜像

Dockerfile 生成以后,在 DockerFile 所在目录执行以下命令,生成最终镜像:

docker build -t server:v1.0 .

启动容器

启动容器,-p参数的意思是将容器的 80 端口映射到本机的 80 端口:

docker run -d -p 80:80 server:v0.1