Docker 部署前后端项目

Docker 部署前后端项目

平生不会相思,才会相思,便害相思。

简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目。其中,这些服务需要用到Nacos、MySQL、Nginx、ElasticSearch、Kibana、Redis、JDK和 Minio 文件存储服务器。当然真实环境不会在一台服务器上或者一个Docker中安装部署这么多东西,由于本机只开了一台虚拟机所以是在同一个虚拟机中安装部署的,到正式环境上就把几个存储数据的和运行项目的分别安装部署到多个服务器上即可。

1、九个微服务+三个前端项目。

2、一台虚拟机,Linux 和Ubuntu 都可以,本次选择的是带有图形界面的Ubuntu 系统。

由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。

Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其它机器上。

与虚拟机的比较

虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。

启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢;

而启动 Docker 相当于启动宿主操作系统上的一个进程。

虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台机器只能开启几十个的虚拟机。

而 Docker 只是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。

除了启动速度快以及占用资源少之外,Docker 具有以下优势:

提供一致性的运行环境。已经打包好的应用可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。

使用分层技术和镜像,使得应用可以更容易复用重复的部分。复用程度越高,维护工作也越容易。

可以使用基础镜像进一步扩展得到新的镜像,并且官方和开源社区提供了大量的镜像,通过扩展这些镜像可以非常容易得到我们想要的镜像。

镜像与容器

镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。

镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,每一层都是只读的(read-only layers)。构建镜像时,会一层一层构建,前一层是后一层的基础。镜像的这种分层存储结构很适合镜像的复用以及定制。

构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。

准备一台虚拟机,Linux 和Ubuntu 操作系统的都可以,本人在VMWare 上两个操作系统都有安装,但是Ubuntu 的是有图形操作界面,用起来更舒适,所以接下来的操作都是基于Ubuntu 系统的,但是Linux 和Ubuntu 系统区别不大,命令什么的大多也通用。

查看docker 是否安装:

1、更新ubuntu 的apt 源索引:

2、设置 apt可以通过Https 使用存储库(repository)

3、添加Docker 官方GPG 密钥

4、设置Stable存储库,即docker 稳定仓库

5、再次更新apt 包索引并安装最新的Docker CE 版本

6、查看Docker 是否安装成功并确认服务是否已经启动

查看docker 运行状态,已启动:

如果检查未启动执行一下

7、经典Hello World

1、启动与停止

安装完成Docker 后,默认已经启动了docker服务,如需手动控制docker服务的启停,可执行如下命令。

启动docker

停止docker

重启docker

docker 安装完成,一般用户没有权限启动docker 服务,只能通过sudo 来通过root 用户权限来启动docker,此时对于一般用户而言,需要执行docker ps 或者docker images 命令查看容器或者镜像提示如题所示的错误。

解决办法:

1、使用sudo docker ps或者sudo docker images,但是每次都要输入密码。

2、把普通用户加入到docker 组中

这里的普通用户是tjt ,组docker 在安装docker 的时候,就已经添加了,所以只需要执行两个操作即可:

将tjt 用户加入docker 组之后,发现使用docker ps或者docker images 不会提示权限不足了。

2、 Docker 镜像操作

1、查找nacos的镜像,执行命令

2、拉取nacos 镜像

这边没有安装最新版,而是指定了版本号。

docker images 查看是否拉取nacos 镜像成功

3、启动nacos服务

指令:

查看是否启动成功:docker ps

4、打开浏览器测试访问nacos

初始账号/密码为:nacos/nacos

4、设置NACOS 自动启动

指令:docker update –restart=always 963217d51c36 (最后一项为nacos 容器的CONTAINER ID )

5、Nacos 配置

把每个微服务的bootstrap.yml 配置文件内容写到nacos.

连接虚拟机服务器,上传nacos 配置文件到服务器,解压后导入nacos 列表。

解压后单个加入,或者无需解压,点击”导入配置”按钮,以zip 压缩包形式批量导入所有微服务的bootstrap.yml 配置文件。

1、查找Docker Hub 上的mysql 镜像

latest 这里拉取官方的最新版本的镜像:

使用以下命令来查看是否已安装了 mysql:

安装完成后,我们可以使用以下命令来运行 mysql 容器:

参数说明:

  • -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机 ip:3306 访问到 MySQL 的服务。
  • MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

通过 docker ps 命令查看是否安装成功:

至此,使用docker 安装mysql 的工作就已经完成了。
以后使用如下命令开启并执行名为mysqldb 的容器:

使用如下命令关闭名为mysqldb 的容器:

6、Docker 中mysql 简单交互

(1)输入命令连接mysql:

本机可以通过 root 和密码 123456 访问 MySQL 服务。

直接通过-u root 命令访问mysql 输入会报错,先安装mysql-server

弹框提示输入mysql 的root 密码和确认密码

输入密码后可以访问,但报了个mysql.socket 的错

修改/etc/my.cnf

添加以下内容到/etc/my.conf:

我使用的不是root 用户编辑文件,无法保存,所以退出时强制保存:w ! sudo tee %

一顿操作后,发现还是不行-报错,白搞了。

进入容器

进入mysql,启动容器的时候初始密码已经设置为了:123456

简单测试MySQL 数据库是否可以用

7、MySQL 数据导入

由于待会运行后端项目,登录系统需要用到账号和密码,索性在这里把MySQL 数据导入Docker 容器中的MySQL。

1、从本地数据库导出SQL

2、进入mysql的docker容器

3、创建数据库

4、将sql 文件copy 到docker 容器里

进入容器,执行.sql 文件,完成数据导入初始化。

1、获取 redis 镜像

这里我拉取官方的最新版本的镜像:

2、查看本地镜像

安装完成后,我们可以使用以下命令来运行 redis 容器:

参数说明:

  • -p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。

最后我们可以通过 docker ps 命令查看容器的运行信息:

通过 redis-cli 连接测试使用 redis 服务。

首先进入redis容器

七、Docker 安装jdk1.8

1、查找jdk

2、下载 jdk

3、查看是否下载成功

4、启动

5、查看是否启动成功

6、查看JDK 版本

首先要进入jdk8 容器

再查看jdk 版本

1、拉取 es 的docker 镜像

这里拉取 7.8.0 版本

2、拉好镜像后,docker images查看镜像

3、接下来直接启动 docker 中的 es 镜像就好了

-d : 后台运行

-p : 指定宿主机与docker启动容器的端口映射

–name : 为 elasticsearch 容器起个别名

-e : 指定为单节点集群模式

启动后docker ps 查看是否成功

4、访问测试

在虚拟机内浏览器访问:

也可以带上IP 在非虚拟机内浏览器访问:

终端访问:

Kibana 是一款适用于es 的数据可视化和管理工具,可以提供实时的直方图、线形图、饼状图和地图。

需要注意的是, kibana 的版本最好与elasticsearch 保持一致,避免发生不必要的错误。

1、拉取Kinaba 镜像

直接和 es 版本保持一致:

2、查看Kibana 镜像是否拉取到本地docker images

3、Docker 启动 K ibana

7.8.0 版本的kibana 包比较大,启动较慢,稍等个半分钟

-e : 指定环境变量配置,提供汉化

–like : 建立两个容器之间的关联, kibana 关联到es

kibana 的汉化我感觉做的并不好# 如果不习惯汉化, 可以把条件去除

docker ps 查看是否docker 启动成功:

4、访问测试

在虚拟机内的浏览器输入地址 http://localhost:5601/, 测试启动成功

在非虚拟机内浏览器打开需改变IP 地址:

发现输入地址后即可访问,下面还要配置下密码

5、修改ES 配置

1、进入容器&打开文件

docker exec -it 容器ID bash

2、编辑文件

3、设置密码

先重启下es 再执行

逐个输入密码,这里都是123456 比较好记。

重启es 访问:

到虚拟机内部浏览器访问es,http://localhost:9200/,提示输入密码

6、修改Kibana 配置

1、进入容器&打开文件

添加下面三行:

重启Kibana 访问:

因为es 配置了密码,所以Kibana 重启前的登录界面使用的是es 的:

重启后使用Kibana 登录密码界面风格:

1.操作minio 镜像

2.拉取镜像

装错了minio ,可以删除容器,再重新安装。

3、再战Minio,这次的Minio 安装是从官网搞来的命令

4、访问测试

重启Minio,查看Minio 容器日志得到访问地址:http://127.0.0.1:9000

上面配置了端口,9000回调到9001

在虚拟机内访问Minio 登录页:

登录账号是刚刚自己写进去的:

可以在Account 下修改密码:

新建用户:

minio/minio123

赋予minio 用户策略权限,新建用户后没有授予对应的策略也形同虚设。

1、docker search nginx 命令来查看可用版本。

这里我拉取官方的最新版本的镜像:

3 、查看本地镜像

使用以下命令来查看是否已安装了 nginx :

4、运行容器

安装完成后,我们可以使用以下命令来运行 nginx 容器:

参数说明:

–name nginx-test :容器名称。

-p 8080:80 : 端口进行映射,将本地8080 端口映射到容器内部的80 端口。

-d nginx : 设置容器在在后台一直运行。

最后我们可以通过浏览器可以直接访问 IP + 8080 端口的 nginx 服务:

在虚拟机中浏览器通过localhost 访问报错:

修改如下:

ssl 错误,请求用http ,不用https

6、如何在本地目录上挂载配置文件

我们安装完nginx 后会发现配置文件在哪,日志文件目录在哪,web项目放到那个目录下,等等。

docker run一个镜像会生成一个容器,而我们需要修改的配置文件日志文件等等都在这个容器里

进入容器bash

  1. 进入容器bash

因为是在docker 容器中编辑,与外部隔绝,需要在docker 中安装vim

vim 安装好后,再次执行

按照自己的需要修改ngnix 配置文件

这个操作对于以后修改很方便,推荐这一种

1. 首先在本地准备我们的挂载目录以及配置文件

如果是普通用户,先授予普通用户root 权限,才方便准备本地配置文件,否则会提示权限不足。

授予用户tjt root 权限

发现还是没有root 用户好使,直接su 切换到root 用户操作,新增 conf 、conf.d、logs、html 四个文件夹

建好目录后还需要两修改两个配置文件

这两个配置文件可以从之前安装的docker nginx 镜像中拷贝,也可以从其他环境中拷贝一份配置。

配置文件创建完成后我们再在html 目录下随便新建一个index.html 页面用于测试Nginx

html 的内容随便写一点:

2. 然后我们就可以在运行时指定挂载目录了

先要删除之前方法一安装的ngnix 镜像

挂载日志目录

挂载配置目录

挂载主配置文件

命令:

解释下上面的命令:

–name 给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器

-p 映射端口,将docker 宿主机的80 端口和容器的80 端口进行绑定

-v 挂载文件用的,第一个-v 表示将你本地的nginx.conf 覆盖你要起启动的容器的nginx.conf 文件,第二个表示将日志文件进行挂载,就是把nginx 服务器的日志写到你docker 宿主机的/home/docker-nginx/log/下面

第三个-v 表示的和第一个-v 意思一样的。

-d 表示启动的是哪个镜像

通过docker ps 查看ngnix 是否安装成功

3、访问测试

在虚拟机内浏览器测试:localhost:8080

十二、安装docker-compose

安装docker-compose ,使用docker-compose.yml 编排微服务的启动。

0.查看是否安装

1.进入https://github.com/docker/compose/releases 查看最新版本,当前版本为1.23.1

2.git 下载docker-composer 太慢了,可以使用如下链接

3.设置权限

4.查看是否安装成功

到此为止,所有的安装准备工作都就绪了,接下来就是工程部署了。总共安装了如下镜像:

1、生成镜像,准备启动

在 src/main/ 路径下新建docker 文件夹,并新建Dockerfile 文件、docker-compose.yml 文件。

2、项目打jar 包

通过Maven 工具install 打jar 包,在对应工程的在target 目录下得到xxx.jar 。

3、 使用Dockerfile 制作Docker 镜像

注意这里的 jar 包位置。将target 目录下生成的jar 包拷贝在src/main/docker 目录下。

在 Dockerfile 中写入以下内容:

上传到服务器对应目录下:

到对应目录下,执行命令:

再通过 docker images 可以发现,镜像已经存在。

现在可以去书写 docker-compose.yml。

4、使用 docker-compose.yml 编排微服务的启动

在 docker-compose.yml 里面写入:

iamge:连接的对应的镜像名字,必须和你生成的镜像一模一样,版本号也一定要加上(默认latest,因为之前我们加了0.0.1,没有latest)

ports: 就是暴漏端口映射。保持一致,不易混淆。但是前端包要保持映射到Nginx 端口上。

-d:仍然表示后台执行

成功后docker ps查看:

访问nacos 服务,查看服务列表,看到有一个微服务在Nacos 服务列表中:

接下来把剩下八个微服务分别按照第一个gateway 微服务的方式打包上传到Docker 中,只build 打包,不run 启动,打包好后通过编写docker-compose 脚本一起启动所有微服务。

5、工程打包

common-oauth2打包上传:

mng-sys 打包上传:

mng-mall打包上传:

api-mall打包上传:

api-pay 打包上传:

api-customer 打包上传:

api-member 打包上传:

api-aiot打包上传:

6、工程添加到容器

上传好后分别添加到容器:

已添加第一个gateway 服务:docker build -t gateway-service:0.0.1 .

docker images查看容器中的工程:

看到这九个工程都加到docker 容器中了,但并没有启动,还需要编辑docker-compose.yml 编排微服务的启动。

执行docker-compose 命令:

多次执行该命令,有变动的工程会重新部署:

再通过docker ps -a 查看docker 容器中的运行状态:

到nacos 服务列表下查看运行状况:

有十个微服务只跑了九个,担心电脑扛不住,之前用公司的电脑IDEA开超过五个微服务每次都会闪退。

心累啊,终于九个服务都跑通了:

再到ES中查看是否有索引,项目启动会自动生成es索引和字段:

到此为止,后端服务的部署就告一段落了,接下来就是三个前端项目了。

1、编写VUE 前端项目的Dockerfile

第一行写的是设置基础镜像,也就是我们刚刚pull 下来的nginx 镜像,
第二行是写一个作者,写上自己的邮箱就好,
第三行的意思就是将dist 文件夹下面的内容拷贝到/usr/share/nginx/html/ 这个目录下。
这个目录是不是很眼熟?这个路径就是nginx 一般的项目地址路径。还记得nginx 的测试页面在哪儿吗?就是这个路径下的index.html 啦。

2、创建镜像

上传dist 目录下的static 和index.html 文件和Dockerfile 到虚拟机对应目录

在Dockerfile 的目录下执行

admin-mall-vue:v1 是你镜像的名字。 特别注意后页面那个点不能省略。

然后在docker images 一下,你就能看到自己创建的VUE镜像了。

3、创建容器

执行命令:

-d 后台运行

-p 端口映射

然后执行docker ps 查看:

4、访问测试

在内部浏览器访问:

到虚拟机外部,使用ip 访问能否正常登陆:

再试着更换图片,看下minio 文件服务器能不能用。

后面还有两个前端项目的部署,一个IM 客服聊天,一个手机APP 商城,部署方式同后台管理vue 项目类似。3个前端工程,九个微服务的发布到此。

前面的一些步骤可以写成脚本,比如build 装载镜像等。

另外两个前端项目结构如下:

执行h5 APP前端项目的build 脚本:

执行im 客服聊天系统的build 脚本:

通过 docker images查看build 结果

执行docker-compose 运行两个前端项目:

docker ps -a 查看发布状态:

使用虚拟机ip 172.16.114.135 加上端口号9091/9092 分别访问客服IM 页面和H5商城页面:

平生不会相思

才会相思

便害相思

Original: https://www.cnblogs.com/taojietaoge/p/15082905.html
Author: 涛姐涛哥
Title: Docker 部署前后端项目

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611356/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 在OAuth 2.0模式下使用Spring Cloud Gateway

    Spring Cloud Gateway主要用于以下角色之一: OAuth Client *OAuth Resource Server 1 Spring Cloud Gateway…

    数据库 2023年6月14日
    095
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年5月24日
    066
  • 编程相关书单

    软工概论软件工程软件工程:实践者的研究方法 职业素养软技能码农翻身技术之瞳程序员修炼之道程序员的职业素养程序员的自我修养 程序设计计算机程序的构造和解释 (SICP) UML软件建…

    数据库 2023年6月11日
    067
  • Maven编译出现“java.lang.OutOfMemoryError: Java heap space”问题的解决办法

    项目执行 mvn clean install 成功在idea 进行debug启动一直报错,报编译错: maven-resources-production:xxx java.nio…

    数据库 2023年6月6日
    0114
  • 什么是回表,怎么解决?

    表tbl有a,b,c三个字段,其中a是主键,b上建了索引,然后编写sql语句SELECT * FROM tbl WHERE a=1这样不会产生回表,因为所有的数据在a的索引树中均能…

    数据库 2023年5月24日
    073
  • 并发模型与IO模型梳理

    并发模型 常见的并发模型一般包括3类,基于线程与锁的内存共享模型,actor模型和CSP模型,其中尤以线程与锁的共享内存模型最为常见。由于go语言的兴起,CSP模型也越来越受关注。…

    数据库 2023年6月9日
    080
  • mysql扫描全表更新状态部分失败

    一直以为mysql是按照主键排序的,实则排序和主键没有关系(不使用 order by 子句)。 然后从 stackoverflow 上查了一下,找到了以下的回答: 没有默认的排序顺…

    数据库 2023年5月24日
    074
  • 设计 | ClickHouse 分布式表实现数据同步

    作者:吴帆 青云数据库团队成员主要负责维护 MySQL 及 ClickHouse 产品开发,擅长故障分析,性能优化。 在多副本分布式 ClickHouse 集群中,通常需要使用 D…

    数据库 2023年5月24日
    093
  • MySQL数据类型和表操作

    MySQL数据类型和表修改 整型的定义 //创建有符号整数表 CREATE TABLE t1 (id TINYINT); //创建无符号整数表 CREATE TABLE t2 (i…

    数据库 2023年6月16日
    078
  • 赞!7000 字学习笔记,一天搞定 MySQL

    MySQL近两年一直稳居第二,随时有可能超过Oracle计晋升为第一名,因为MySQL的性能一直在被优化,同时安全机制也是逐渐成熟,更重要的是开源免费的。 MySQL是一种关系数据…

    数据库 2023年6月9日
    072
  • Maven项目添加外来jar包

    本例: 是为了读取Excel文件并把数据录入数据库,从数据库读写数据 写入Excel文件 用到的jar包:mysql—-poi Original: https://ww…

    数据库 2023年6月9日
    071
  • LeetCode 9. 回文数

    题目 题目链接:https://leetcode.cn/problems/palindrome-number/ 给你一个整数x,如果x是一个回文整数,返回true;否则,返回fal…

    数据库 2023年6月11日
    088
  • Rabbitmq从安装到简单入门

    1:Rabbitmq是什么? RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。 它由以高性能、健壮以及可伸缩性出名的 Erlang …

    数据库 2023年6月6日
    074
  • javaWeb知识点大集合!!!

    pom文件: 4.0.0 org.example javaweb_maven 1.0-SNAPSHOT war UTF-8 1.7 1.7 com.github.pagehelpe…

    数据库 2023年6月16日
    077
  • CSS样式

    css概述 层叠样式表(cascading style sheet) 层叠是指==将多个样式施加在一个元素(标签)上== 作用: 美化页面 将html代码与样式代码分离 好处: 功…

    数据库 2023年6月16日
    084
  • day03-拉取在线用户功能

    多用户即时通讯系统03 4.编码实现02 4.2功能实现-拉取在线用户 4.2.1思路分析 客户端想要知道在线用户列表,就要向服务器发送请求(Message),因为只有服务器端保持…

    数据库 2023年6月11日
    0157
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球