1,安装docker

1.卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine

2.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3.安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4.启动和校验

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

5.配置镜像加速

这里以阿里云镜像加速为例。

5.1.注册阿里云账号

首先访问阿里云网站:

https://www.aliyun.com/

注册一个账号。

5.2.开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

download_image

点击后进入控制台:
在这里插入图片描述

首次可能需要选择立刻开通,然后进入控制台。

5.3.配置镜像加速

找到镜像工具下的镜像加速器

image-20240129232137029

页面向下滚动,即可找到配置的文档说明:

image-20240129232231997

具体命令如下:

# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

到这docker就安装完毕了,接下去就可以开始准备部署项目

创建部署项目的目录结构

先在本地创建好部署项目的目录,到时候,直接将这个docker目录上传至云服务器,即可进行部署。

  • backend:放后端即将部署的xxx.jar包和构建后端项目镜像的dockerfile文件
  • frontend:放前端项目和nginx的配置文件nginx.conf
  • mysql:放构建mysql镜像的dockerfile文件

在这里插入图片描述

2,构建docker镜像

构建Mysql镜像的Dockerfile

ADD ./init/*.sql /docker-entrypoint-initdb.d/:是将 ./init/ 目录下的所有 .sql 文件添加到 Docker 镜像中的 /docker-entrypoint-initdb.d/ 目录中。这样,在容器启动时,数据库容器会执行这些 SQL 脚本,用于初始化数据库的结构、表和数据等内容。
所以如果你可以将要初始化的sql文件放入到mysql目录下init文件夹下

# 基础镜像
FROM mysql:5.7

# 执行sql脚本
ADD ./init/*.sql /docker-entrypoint-initdb.d/

构建后端镜像

IDEA打包后端项目

img

通过Dockerfile构建后端jar镜像

后端镜像:springbootr2ork-0.0.1-SNAPSHOT.jar
将springbootr2ork-0.0.1-SNAPSHOT.jar 和 下面这个Dockerfile放到backend目录下
Dockerfile文件内容如下:

# 基础镜像
FROM java:8

#指定工作目录
WORKDIR /app

# 将jar包添加到工作目录
ADD ./springbootr2ork-0.0.1-SNAPSHOT.jar /app

# 暴露端口
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java","-jar","/app/springbootr2ork-0.0.1-SNAPSHOT.jar"]

构建前端镜像

打包前端项目

Node.js包管理工具npm进行打包

npm run build	#打包命令

img

编写nginx配置文件

配置文件中的root /usr/share/nginx/html1/dist;指定前段项目文件的所在目录(即将上个步骤打包的dist文件放到/html1/dist目录下)

若有多个server则需要在配置文件中配置多个server块,一个server块表示一个前端项目

proxy_pass:配置反向代理的服务器地址
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://yiliao-gateway:51601;
} 在这个例子中,当客户端访问 http://xxxx:8081/api时,Nginx 会将请求代理到 http://yiliao-gatewya:51601的服务器。即Nginx 会将这些请求转发给另一个服务器进行处理,然后将处理结果返回给客户端。

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/json;

    sendfile        on;
    
    keepalive_timeout  65;

    server {
        listen       8081;
        # 指定前端项目所在的位置
        location / {
            root /usr/share/nginx/html1/dist; #dist包存放的路径
            index index.html index.htm;
            try_files $uri $uri/ /index.html; # 解决刷新后404
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
         location /api {
             rewrite /api/(.*)  /$1 break;
             proxy_pass http://yiliao-gateway:51601;
         }
    }

    server {
            listen       8082;
            # 指定前端项目所在的位置
            location / {
                root /usr/share/nginx/html2/dist; #dist包存放的路径
                index index.html index.htm;
                try_files $uri $uri/ /index.html; # 解决刷新后404
            }

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
        }
}

3,docker-compose编排部署项目

编排部署mysql

​ 编写docker-compose-base.yml 部署 基础组件Mysql,如果要使docker容器能互相访问则需指定相同网络通过networks指定相同一个网络

 networks:
      - lkw-net
networks:
  lkw-net:
    name: lkw

docker-compose-base.yml文件内容如下:

version: "3"
services:
  mysql:
    image: mysql:5.7
    container_name: mysql
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    privileged: true
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - lkw-net
networks:
  lkw-net:
    name: lkw

编排部署前端和后端

​ 由于通过nginx配置了两个前端项目,所以需要通过ports映射两个端口8081和8082,volumes需要配置挂载两个项目所在存放的目录
docker-compose-service.yml文件内容如下:

volumes:
- “/images/user:/images/user” # 挂载图片保存路径
将前面一个是云服务器的目录,后一个是docker容器内部的目录,就是将docker的/images/user目录挂载到云服务器的/images/user目录下。

version: "3"
services:
  frontend:
    image: nginx
    container_name: frontend
    ports:
      - "8081:8081"
      - "8082:8082"
    volumes:
      - "./frontend/nginx.conf:/etc/nginx/nginx.conf"
      - "./frontend/html1/dist:/usr/share/nginx/html1/dist"
      - "./frontend/html2/dist:/usr/share/nginx/html2/dist"
    networks:
      - lkw-net
  backend:
    container_name: backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    volumes:
      - "/images/user:/images/user"   # 挂载图片保存路径
    networks:
      - lkw-net
networks:
  lkw-net:
    name: lkw

4,部署

上传文件到云服务器

将整个docker目录通过xshell+xftp上传至云服务器

image-20240401231323842

部署

部署mysql容器

docker compose -f docker-compose-base.yml up -d

部署后,通过navicat测试连接,连接成功后,即可部署前端和后端容器

docker compose -f docker-compose-service.yml up -d

查看容器状态,容器的status都为up状态则为成功

docker ps -a

即可通过ip:前端端口 访问部署的项目。若访问失败,云服务器并没有放开服务对应的端口号。

附:阿里云服务器开放端口

image-20240401233215060
image-20240401233337642

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐