基于Docker部署Web项目

1.实验目的

  1. 学会使用docker部署基于Vue的SPA项目
  2. 掌握docker,mysql,nodejs,vue和git的基本命令
  3. 掌握反向代理,负载均衡,数据库还原等操作

2.实验内容

本机所使用的环境为Centos7.5
在这里插入图片描述
人员分工:

2.1 安装项目所需环境

  1. 安装Docker Engine-Community
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。
  • 设置仓库
    安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils  device-mapper-persistent-data  lvm2

在这里插入图片描述

  • 使用以下命令来进行稳定仓库
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 启动docker
sudo systemctl start docker
  1. 通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community 。
sudo docker run hello-world

在这里插入图片描述
首次会自动拉取该镜像,使用docker ps进行查看

  1. 拉取nginx镜像
    在这里插入图片描述
  • 查看本地镜像
    在这里插入图片描述
  • 服务器开启8080端口
    在这里插入图片描述
  1. 安装mysql
yum install mysql
yum install mysql-server
yum install mysql-devel

mysql-server会安装失败,查资料发现是CentOS 7 版本将MySQL数据库软件从默认的程序列表中移除。
解决办法:从官网进行安装

wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install mysql-community-server
  1. 启动mysql
service mysqld restart
  1. 设置mysql的密码
set password for 'root'@'localhost' =password('password');
  1. 配置mysql
    mysql配置文件为/etc/my.cnf 最后加上编码配置
[mysql]
default-character-set =utf8

设置远程连接

mysql> grant all privileges on *.* to root@'%'identified by 'password';
  1. 安装nodejs
sudo yum install nodejs -y
  1. 下载nodejs管理工具n
npm install n
  1. 下载nodejs稳定版本,并使用
 n stable
 n 版本号

在这里插入图片描述

  1. 下载稳定版本vue(3.6.0)
    在这里插入图片描述

2.2 项目上传到服务器

方法一:vscode

Vscode提供了一种十分方便的工具来远程控制你的服务器:remote-ssh,在插件商店里下载并且安装,就可以连接到你的服务器,支持拖曳式上传。

方法二:git

通常在写前端项目时,会分为许多模块,每次写完一个模块即可上传一个分支,并合并到master里,最后拉取master到服务器上即可。

git clone 项目地址
方法三:SFTP

Sftp作为一个Linux上常用的运维工具,主要用于传输文件, 具体命令如下

  • 连接到服务器
sftp user@passwd
  • 发送文件,其中src_dir是源文件路径 ,des_dir 是目标文件路径
put /src_dir /des_dir
  • 下载文件
get /src_dir /des_dir

2.3 部署前端项目

  1. 进入到项目目录
    在这里插入图片描述
  2. 下载相关依赖
npm install
  1. 项目打包
npm run build

在这里插入图片描述
打包后生成一个dist文件夹,所需里面的index,html文件

方法一: 通过映射本地文件的方式部署项目

至此 简单的docker安装nginx并启动算是成功了,接下来就会产生一个疑问,如果我想修改nginx的配置怎么办,我想更改nginx中的资源文件怎么办?接下来给出一个最实用的办法,就是将容器中的目录和本机目录做映射,以达到修改本机目录文件就影响到容器中的文件。

1.镜像映射
  1. 本机创建实例文件夹如下图所示
/home
    |---shop
           |----nginx
                  |----conf.d
                  |----html
  1. 各文件夹内配置如下
在conf.d文件夹下新建default.conf文件
server {
    listen       80;
    server_name  localhost;
    # 更该配置,匹配/路径,修改index.html的名字,用于区分该配置文件替换了容器中的配置文件
    location / {
        root   /usr/share/nginx/html;
        index  index-test.html index.htm;
    }
}
在html中编写index-test.html,用以判断文件夹映射成功
<html>
  <body>
    <h2>it is html1</h2>
  </body>
</html>
  1. 启动nginx(8080),映射路径
    命令比较长,其实就是多加了两个参数,-v,-v的意思就是冒号前面代表本机路径,冒号后面代表容器内的路径,两个路径进行了映射,本机路径中的文件会覆盖容器内的文件。
    nginx容器内的一些文件位置:
    日志位置:/var/log/nginx/
    配置文件位置:/etc/nginx/
    项目位置:/usr/share/nginx/html
docker run -d -p 8080:80 -v /home/shop/nginx/conf.d:/etc/nginx/conf.d  -v /home/shop/nginx/html:/usr/share/nginx/html nginx

在这里插入图片描述
在这里插入图片描述
可以看出我们成功了

2.反向代理

此时静态页面网站已经部署上了,但是还是会显示一个端口8080出来,就十分不爽,怎么把端口干掉呢?而是换成XXXXX.com/demo1 或者 XXXXX.com/demo2这种效果呢?下面使用nginx的反向代理实现。

  1. 我们在conf.d2中配置另一个nginx容器的配置文件,文件内容如下:
server {
    listen       80;
    server_name  localhost;
    location /mutou {
        # 在该位置配置反向代理,将ip/mutou请求拦截,发送给8080端口,如果不是本机请使用公网ip
        proxy_pass   http://你的刚才的ip地址:8080/;
    }
}
  1. 再启动一个nginx(80),专门作为反向代理映射,将本机80端口代理到nginx的80端口上,并映射两端的配置文件地址。
docker run -d -p 80:80 -v /home/shop/nginx/conf.d2:/etc/nginx/conf.d nginx

在这里插入图片描述
在这里插入图片描述

3.负载均衡
  1. 当有了反向代理后,自然而然就引出了负载均衡,下面简单实现负载均衡的效果,实现该效果再添加一个nginx,所以要增加一个文件夹。
/home
    |---shop
           |----nginx
                  |----conf.d
                  |----html
                  |----conf.d2
                  |----html3
  1. 启动nginx(8081)
docker run -d -p 8081:80 -v /home/shop/nginx/conf.d:/etc/nginx/conf.d  -v /home/shop/nginx/html3:/usr/share/nginx/html nginx

在这里插入图片描述

  1. 访问ip:8081
    在这里插入图片描述
  2. 配置负载均衡,访问ip/demo1时,平均分发到8080端口和8081端口上,即it is html1和it is html3间接出现。
配置负载均衡,那就是配置在第二次的nginx上,就是反向代理的nginx上,我们去conf.d2文件夹下,修改default.conf文件,如下:
upstream group1{
    server 你的刚才的ip地址:8080;
    server 你的刚才的ip地址:8081;
}

server {
    listen       80;
    server_name  localhost;
    location /demo1 {
        proxy_pass   http://group1/;
    }
}
然后重启该容器,docker restart 容器id
  1. 查看效果
    访问ip/shop,每次刷新页面,页面都会在html1和html3中进行切换,此时负载均衡的效果就实现了。
  2. 将vue项目dist文件夹下的Index.html进行映射
    先把原来启动的8080端口的docker容器停止掉
    然后启动
docker run -d -p 8080:80 -v $PWD/dist:/usr/share/nginx/html nginx

可以看到项目就部署成功了
在这里插入图片描述

方法二: 制作镜像

制作镜像的方法主要有两种:

  • 通过容器生成镜像
  • 使用Dockerfile生成镜像

我们这次采用的是Dockefile,通过这个文件打包出我们需要的镜像

  1. 先下载需要的基础镜像,我们这里需要的是nginx
docker pull nginx:latest
  1. Dockerfile
FROM nginx:latest
# 指定基础镜像是nginx
RUN mkdir /root/dist
# 创建好文件夹
COPY ./dist /root/dist
# 将npm编译好的静态文件复制到镜像内部
COPY ./dist/Nginx/default.conf /etc/nginx/conf.d/default.conf
# 将写好的Nginx配置文件复制到对应的地方
EXPOSE 80
# 将容器的80端口暴露给宿主机
WORKDIR /root/dist
# 设定好默认的工作路径
  1. Nginx的配置文件
server {
listen       80;
server_name  localhost;

#charset koi8-r;
access_log  /var/log/nginx/host.access.log  main;
error_log  /var/log/nginx/error.log  error;

location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

#error_page  404              /404.html;
# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}
} 
  1. 打包镜像
sudo docker build -tag test:v1 .
  1. 保存镜像到本地
sudo docker save test:v1 > test
  1. 以下是我们的项目文件结构
program/
└── Dockerfile
    ├── dist
    │   ├── css
    │   │   ├── app.a26ffee5.css
    │   │   └── chunk-vendors.4cae334f.css
    │   ├── favicon.ico
    │   ├── fonts
    │   │   ├── element-icons.535877f5.woff
    │   │   └── element-icons.732389de.ttf
    │   ├── img
    │   │   ├── iconfont.82d03b7e.svg
    │   │   └── logo.82b9c7a5.png
    │   ├── index.html
    │   ├── js
    │   │   ├── app.85b1e61c.js
    │   │   ├── app.85b1e61c.js.map
    │   │   ├── chunk-vendors.d075aa0a.js
    │   │   └── chunk-vendors.d075aa0a.js.map
    │   └── Nginx
    │       └── default.conf
    ├── Dockerfile
    └── test

其中test是从docker里导出的我们做的镜像,通过以下命令即可导入

sudo docker load < test
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐