使用Docker将服务部署到阿里云的服务器上

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 利用一个简单的前后端分离项目来介绍Docker在部署过程中的使用。

写在前面

  • 为什么会用Docker?

我在大二的暑假接触了Go语言。并随之得知了其两大杀手应用:Docker和Kubernetes。非常幸运的是,Docker推出了Docker Desktop(Docker For Window) 给安装了WSL2(Windows Subsystem for Linux )的WIndows用户使用。这得以让当时并不熟悉Linux的我成功的越过Linux学习和使用Docker。
在初次下载Docker Desktop后,它的欢迎界面会让你拉取一个“docker/getting-started”的镜像。这个镜像是一个入门教程,我的学习也是从这个教程开始的。伴随着使用的频繁和深入,我也渐渐了解教程的大部分内容。只有最后一章节:docker-compose我还尚未实践过。而Mis作业的出现正好让我弥补这一空白!

image.png

如果你有安装Docker,并有一定的基础的话。那么欢迎你跟随我的脚步将你的服务部署到服务器上!

服务器

  • 通过学生优惠,你可以在阿里云上免费申请一台为期2周的服务器。

下图为我用学生特权申请到的服务器,并安装了Ubuntu20.04的操作系统。

image.png

远程操控

  • 接下来你需要一个用于连接远程服务器的工具,如xshell等。

image.png

Docker的安装

  • 接下来你需要在你的服务器上安装Docker和Docker-compose。

具体的细节你可以到官方文档中获取:
Ubuntu Install docker
Ubuntu install Docker compose
注:如果你实在对英文非常的不感冒的话,你可以用谷歌浏览器打开并使用它的翻译功能。

image.png

前后端打包

前端的在老师提供的笔记中以有所提及,这里不再赘述。接下来我们主要讲后端如何打包:
由于服务器上的环境和本地开发环境会略有不同,所以在这里我们需要针对不同的环境提供不同的配置文件:

image.png

其中application-dev.yml, application-test.yml分别对应开发环境和测试环境(这里我将测试环境打包放到线上了,所以没建多一个application-pro.yml(单纯偷懒)。)

image.png

你需要在active中指定springboot启动的配置文件。如指定dev并在本地运行代码时,maven就会根据application-dev.yml中的内容启动该项目。

application-dev.yml

server:
  port: 9200
  servlet:
    context-path: /iron-man
# druid数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据源
    url: jdbc:mysql://localhost:3306/misp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    # 初始连接数
    initialSize: 5
    # 最小连接池数量
    minIdle: 10
    # 最大连接池数量
    maxActive: 20
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 配置一个连接在池中最大生存的时间,单位是毫秒
    maxEvictableIdleTimeMillis: 900000
    # 避免sql监控被过滤
    filters: stat


# mybatis配置
mybatis:
  # 项目POJO包
  typeAliasesPackage: iron.scau.*.entity
  # Mapper文件
  mapperLocations: classpath*:mapper/*Mapper.xml
  # mybatis配置文件
  configLocation: classpath:mybatis/mybatis-config.

application-test.yml

server:
  port: 9200
  servlet:
    context-path: /iron-man
# druid数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    # 数据源
    url: jdbc:mysql://172.1.0.10:3306/misp?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: 123456
    # 初始连接数
    initialSize: 5
    # 最小连接池数量
    minIdle: 10
    # 最大连接池数量
    maxActive: 20
    # 配置获取连接等待超时的时间
    maxWait: 60000
    # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一个连接在池中最小生存的时间,单位是毫秒
    minEvictableIdleTimeMillis: 300000
    # 配置一个连接在池中最大生存的时间,单位是毫秒
    maxEvictableIdleTimeMillis: 900000
    # 避免sql监控被过滤
    filters: stat


# mybatis配置
mybatis:
  # 项目POJO包
  typeAliasesPackage: iron.scau.*.entity
  # Mapper文件
  mapperLocations: classpath*:mapper/*Mapper.xml
  # mybatis配置文件
  configLocation: classpath:mybatis/mybatis-config.xml

application-test.yml与dev的不同之处只是在mysql的url有所不同。这个我们稍后会解释。


接下来修改你的根目录下的pom文件添加上如下的代码:

 <profiles>
        <profile>
            <id>dev</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <package.environment>dev</package.environment>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <package.environment>test</package.environment>
            </properties>
        </profile>
    </profiles>

上述是告知maven你有多个配置文件,之后你就可以用maven依据不同的配置文件打包。


image.png
刷新后点开右上侧折叠的maven菜单,你就可以看到我们的配置生效了!
接下来你需要选中web模块,然后执行mvn clean install。在idea中你可以通过点击图中的"M"字样调出maven的命令清单。然后依次点击mvn clean、mvn install。
image.png
在idea提示Build Successed 后,你便可以在web模块的target目录下看到生成的jar 包:
image.png

如果你不放心的话,可以在当前目录下执行 java -jar xxx.jar来看看是否启动了这个项目。

撰写Dockerfile为前后端打包镜像

  • 有关Dockerfile的撰写和学习可以参照一些开源项目并配合官方文档的解释进行。笔者这里给出的也不完善,仅供参考。但是我会尽量的给出相应的注释!!
  • 前端(在根目录下创建Dockerfile)
# 基于nginx镜像构建
FROM nginx
MAINTAINER alita@stu.scau.edu.cn
ENV LANG en_US.UTF-8
# 容器内tmp目录下的数据将以匿名卷的形式挂载到宿主机
VOLUME /tmp
# 以下是nginx的配置
RUN echo "server {  \
                      listen       80; \
                      location ^~ /iron-man { \
          proxy_pass              http://172.1.0.20:9200/iron-man/; \
                  } \
                  #解决Router(mode: 'history')模式下,刷新路由地址不能找到页面的问题 \
                  location / { \
                     root   /var/www/html/; \
                      index  index.html index.htm; \
                      if (!-e \$request_filename) { \
                          rewrite ^(.*)\$ /index.html?s=\$1 last; \
                          break; \
                      } \
                  } \
                  access_log  /var/log/nginx/access.log ; \
              } " > /etc/nginx/conf.d/default.conf \
    &&  mkdir  -p  /var/www \
    &&  mkdir -p /var/www/html
    # 将打包生成的dist文件拷贝到容器中相应目录下
ADD dist/ /var/www/html/
# 暴露80端口(nginx默认监听80端口)
EXPOSE 80
EXPOSE 443

在项目的根目录下运行docker build -t 仓库前缀/镜像名:版本号 .
如 docker build -t intellinan/hell:1.0 .

  • 后端(在web模块右键创建一个Dockerfile文件)
# 以配有jdk8的apline(一种Linux系统)为基础镜像构建
FROM bladex/alpine-java:openjdk8-openj9_cn_slim

MAINTAINER alita@stu.scau.edu.cn
# 创建文件夹
RUN mkdir -p /intellinan/mis
# 指定工作目录
WORKDIR /intellinan/mis

EXPOSE 9200
# 将生成的jar包添加到工作目录下并重命名
ADD ./target/aotu-man-web.jar ./app.jar
# 运行jar包
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
# 指定配置文件参数和输出日志
CMD ["--spring.profiles.active=test", "catalina.out 2>&1"]

在Web模块的项目下运行:docker build -t intellinan/damn:1.0 .


在服务器上用docker-compose组合镜像:

上传已经构建好的前后端镜像:

在Docker Hub上注册一个免费账号,确定自己的名称。这个名称就是你镜像仓库的前缀。然后建立两个仓库,其名字要和你本地镜像的名字相对应。如你Docker Hub的名称是 superbaby。假设你创建了一个仓库用来存储后端生成的镜像,名称是mis-java。那么你在本地打包后端镜像时其名称应该是 superbaby/mis-java

创建一个网络

回到服务器上,确保docker在运行的情况下使用以下命令:
docker network create --subnet 172.1.0.0/24 alita
这条命令为docker声明了一个名为alita,供容器之间通信的网络。如果你学过企业组网的话,那么我相信你应该很快就能明白172.1.0.0/24的含义。

编写docker-compose.yml

如下:

version: '2.2'
  
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    # 持久化数据库数据
    volumes:
      - /home/mysql:/var/lib/mysql/
    networks:
      alita:
      # 声明自己的IP地址(如果你细心的话你会发现这个IP地址正好是我在application-test.yml中mysql的url中的IP地址
        ipv4_address: 172.1.0.10
    ports:
      - "3306:3306"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --max_connections=3000
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      TZ: Asia/Shanghai
  backend:
  # 确保名字和版本号和你上传上Docker Hub的一致。
    image: intellinan/mis-java:2.0
    container_name: Jmis
    ports:
      - "9200:9200"
    networks:
      alita:
        ipv4_address: 172.1.0.20
  front:
    image: intellinan/mis-vue:2.0
    container_name: Vmis
    ports:
      - "8080:80"
    networks:
      alita:
        ipv4_address: 172.1.0.30

将上述文件传到服务器上(你也可以直接在服务器上编写)。保存后在该目录下输入一下代码
docker-compose up -d
如果顺利的话你会看到以下输出:
compose up.png

防火墙

如果这个时候你在浏览器访问服务器的IP地址的8080端口的话你会发现访问超时了。这是因为服务器本身的安全策略的限制。
登录阿里云 -> 来到控制台
image.png
image.png
image.png
恭喜你!到这里为止你就大功告成了!!!
接下来鼓起勇气访问你的服务器看看效果吧!

点一下看看吧!
image.png
image.png

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
弹性计算 Ubuntu Linux
阿里云服务器一键安装Docker社区版教程,基于系统运维管理OOS
阿里云服务器一键安装Docker社区版教程,基于系统运维管理OOS自动化部署。支持Ubuntu 22.04/20.04、CentOS 7.7-7.9及Alibaba Cloud Linux 3.2104 LTS。前提条件:ECS实例需运行中且有公网。步骤:选择Docker扩展并安装,验证成功通过命令`docker -v`查看版本号。
109 78
|
5天前
|
机器学习/深度学习 人工智能 PyTorch
阿里云GPU云服务器怎么样?产品优势、应用场景介绍与最新活动价格参考
阿里云GPU云服务器怎么样?阿里云GPU结合了GPU计算力与CPU计算力,主要应用于于深度学习、科学计算、图形可视化、视频处理多种应用场景,本文为您详细介绍阿里云GPU云服务器产品优势、应用场景以及最新活动价格。
阿里云GPU云服务器怎么样?产品优势、应用场景介绍与最新活动价格参考
|
7天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
4天前
|
存储 运维 安全
阿里云弹性裸金属服务器是什么?产品规格及适用场景介绍
阿里云服务器ECS包括众多产品,其中弹性裸金属服务器(ECS Bare Metal Server)是一种可弹性伸缩的高性能计算服务,计算性能与传统物理机无差别,具有安全物理隔离的特点。分钟级的交付周期将提供给您实时的业务响应能力,助力您的核心业务飞速成长。本文为大家详细介绍弹性裸金属服务器的特点、优势以及与云服务器的对比等内容。
|
12天前
|
人工智能 JSON Linux
利用阿里云GPU加速服务器实现pdf转换为markdown格式
随着AI模型的发展,GPU需求日益增长,尤其是个人学习和研究。直接购置硬件成本高且更新快,建议选择阿里云等提供的GPU加速型服务器。
利用阿里云GPU加速服务器实现pdf转换为markdown格式
|
2天前
|
弹性计算 安全 搜索推荐
阿里云国际站注册教程:阿里云服务器安全设置
阿里云国际站注册教程:阿里云服务器安全设置 在云计算领域,阿里云是一个备受推崇的品牌,因其强大的技术支持和优质的服务而受到众多用户的青睐。本文将为您介绍阿里云国际站的注册过程,并重点讲解如何进行阿里云服务器的安全设置。
|
2天前
|
人工智能 监控 测试技术
阿里云磐久服务器稳定性实践之路
阿里云服务器质量智能管理体系聚焦自研服务器硬件层面的极致优化,应对高并发交付、短稳定性周期、早问题发现和快修复四大挑战。通过“三个重构”(质量标准、开发流程、交付模式)、“六个归一”(架构、硬件、软件、测试、部件、制造)策略,实现芯片、整机和云同步发布,确保快速稳定上量。此外,全场景测试体系与智能预警、分析、修复系统协同工作,保障服务器在萌芽阶段发现问题并及时解决,提升整体质量水平。未来,阿里云将继续深化大数据驱动的质量管理,推动服务器行业硬件质量的持续进步。
|
11天前
|
开发框架 缓存 .NET
阿里云轻量应用服务器、经济型e、通用算力型u1实例怎么选?区别及选择参考
在阿里云目前的活动中,价格比较优惠的云服务器有轻量应用服务器2核2G3M带宽68元1年,经济型e实例2核2G3M带宽99元1年,通用算力型u1实例2核4G5M带宽199元1年,这几个云服务器是用户关注度最高的。有的新手用户由于是初次使用阿里云服务器,对于轻量应用服务器、经济型e、通用算力型u1实例的相关性能并不是很清楚,本文为大家做个简单的介绍和对比,以供参考。
|
17天前
|
机器学习/深度学习 人工智能 编解码
阿里云GPU云服务器优惠收费标准,GPU服务器优缺点与适用场景详解
随着人工智能、大数据分析和高性能计算的发展,对计算资源的需求不断增加。GPU凭借强大的并行计算能力和高效的浮点运算性能,逐渐成为处理复杂计算任务的首选工具。阿里云提供了从入门级到旗舰级的多种GPU服务器,涵盖GN5、GN6、GN7、GN8和GN9系列,分别适用于图形渲染、视频编码、深度学习推理、训练和高性能计算等场景。本文详细介绍各系列的规格、价格和适用场景,帮助用户根据实际需求选择最合适的GPU实例。
|
弹性计算 网络协议 安全
阿里云ECS7天训练营-Day1 搭建FTP服务
阿里云ECS7天训练营-Day1 搭建FTP服务
1164 0
阿里云ECS7天训练营-Day1 搭建FTP服务

热门文章

最新文章