Docker部署前后端分离项目

一、下载Docker

选择自带Docker的云服务器

二、创建容器网络

将所有容器加入自定义网络,这样可以互相通过容器名访问

# 创建自定义网络,sys-net为自定义名称
docker network create sys-net

三、部署MySQL

# -d表示后台运行 -e表示环境,设置mysql密码 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/init:/docker-entrypoint-initdb.d --network sys-net mysql
# 最后的mysql为Docker镜像名,不写版本号默认为mysql:latest最新版本

四、部署Redis

# -d表示后台运行 -e表示环境,设置redis密码 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name redis -p 6379:6379 -e TZ=Asia/Shanghai -e REDIS_PASSWORD=123 -v /usr/local/redis/config:/usr/local/etc/redis/redis.conf -v /usr/local/redis/data:/data --network sys-net redis
# 最后的redis为Docker镜像名,不写版本号默认为redis:latest最新版本

五、部署后端

1.修改本地项目host

因为我们将所有容器都加入了自定义网络,所以在Docker中,不需要指定真正的地址,只需要修改为容器名称即可。

将mysql的host改为mysql,redis的host改为redis

        druid:
            # 主库数据源
            master:
                url: jdbc:mysql://mysql:3306/
  redis:
    host: redis
    port: 6379

2.将项目打包成jar包

点击右边的Maven,点击Lifecycle下的package打包成jar包

打包完会在项目下的target目录生成jar包

如果项目是有多个模块的,那么在每个模块的target目录都会生成一个jar包,我们只需要找有Application启动类的那一个模块下的jar包即可

3.创建Dockerfile

建一个Dockerfile文件,写如下内容

FROM openjdk:11.0-jre-buster
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY slacking-cat-sys.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

slacking-cat-sys.jar为打包好的jar包名字

4.自定义镜像

将打包好的jar包和Dockerfile文件上传到云服务器,选择同一个目录下,例如放在/usr/local下,然后cd /usr/local

# 构建镜像,-t表示给构建的镜像取名,.表示在当前目录下构建
docker build -t slacking-cat-sys .

可以查看是否完成镜像构建

5.创建并运行项目

# -d表示后台运行 -p 后端端口号 --network 加入自定义网络
docker run -d --name slacking-cat-sys -p 8080:8080 --network sys-net slacking-cat-sys
# 最后的slacking-cat-sys为Docker镜像名

六、打包前端

1.修改本地项目host

查找到localhost替换为后端项目的容器名

server: {
      port: 80,
      host: true,
      open: true,
      proxy: {
        // https://cn.vitejs.dev/config/#server-proxy
        '/dev-api': {
          target: 'http://slacking-cat-sys:8080',
          changeOrigin: true,
          rewrite: (p) => p.replace(/^\/dev-api/, '')
        }
      },

2.打包

运行npm run build:prod命令进行打包,在项目下会生成dist文件。

七、部署nginx

1.配置nginx.conf

    #keepalive_timeout  0;
    # 设置nginx连接超时
    keepalive_timeout  300;
    proxy_connect_timeout 300;   #单位秒 默认60
    proxy_send_timeout 300;   #单位秒 默认60
    proxy_read_timeout 300;   #单位秒 默认60
  
    server {
        listen       8081;	# 前端指定的端口
        server_name  nginx;
        location / {
	        # 容器中的挂载路径,dist文件为前端打包的静态页面
            root   /usr/share/nginx/html/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;  # 处理前端路由刷新问题
        }
	    location /prod-api {    # 这里的 /prod_api/ 是你想要代理的后端api路径开头
	        rewrite /prod-api/(.*) /$1 break;
            proxy_pass http://slacking-cat-sys:8080;  # 这里的host改为后端项目的容器名
        }

2.nginx数据卷挂载

在云服务器中创建一个nginx目录,例如在/usr/local/nginx,将nginx.conf配置文件上传到此处,再创建/usr/local/nginx/html文件,将前端打包好的dist文件上传到此处

文件目录结构如下:

3.创建并运行nginx

# -d表示后台运行 -p表示前端设置的端口 -v表示数据卷挂载 --network 加入自定义网络
docker run -d --name nginx -p 8081:8081 -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/html:/usr/share/nginx/html --network sys-net nginx
# 最后的nginx为Docker镜像名,不写版本号默认为nginx:latest最新版本

八、第二种方法:使用DockerCompose部署

DockerCompose相当于可以把一个一个分开部署的容器集合起来一起部署。

1.docker-compose.yml文件

通过一个docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个互关联的Docker容器的快速部署。docker-compose.yml文件相当于我们写的docker run命令:

version: "3.8"
services:

  redis:
    image: redis
    container_name: redis
    ports:
      - "6379:6379"
    environment:
      TZ: Asia/Shanghai
      REDIS_PASSWORD: 123
    volumes:
      - "/usr/local/redis/config:/usr/local/etc/redis/redis.conf"
      - "/usr/local/redis/data:/data"
    networks:
      - sys-net

  mysql:
    image: mysql:8.0
    container_name: mysql
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - "/usr/local/mysql/conf:/etc/mysql/conf.d"
      - "/usr/local/mysql/data:/var/lib/mysql"
      - "/usr/local/mysql/init:/docker-entrypoint-initdb.d"
    networks:
      - sys-net

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "8081:8081"
    volumes:
      - "/usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "/usr/local/nginx/html:/usr/share/nginx/html"
    depends_on:
      - slacking-cat-sys
    networks:
      - sys-net

  slacking-cat-sys:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: slacking-cat-sys
    ports:
      - "8080:8080"
    networks:
      - sys-net
    depends_on:
      - redis
      - mysql

networks:
  sys-net:
    name: sys-net

2.准备工作

①nginx.conf配置好,前端打包的dist文件放到html目录下。(参考六打包前端、七部署nginx)

②后端打包成jar包

③Dockerfile配置好(参考五.3.创建Dockerfile)

将jar包、Dockerfile、docker-compose.yml上传到云服务器的同一目录下,例如/usr/local

3.DockerCompose一键部署

进入/usr/local目录

# up表示创建并启动所有容器 -d 后台运行,其他可选参数 -p 取项目名 -f 指定路径,此处为当前目录下,所以直接省略
docker compose up -d

九、其他

1.Docker常用命令

# docker拉取镜像,不写版本号默认拉取最新版本
docker pull mysql:8.0
# 查看docker镜像
docker images
# 强制删除docker镜像
docker rmi -f 镜像ID
# 创建并运行容器
# -d表示后台运行,--name表示取名,-p映射端口号,-v数据卷挂载 最后写上镜像名称需要加上版本号
docker run -d --name mysql -p 3306:3306 -v /usr/mysql/logs:/logs mysql:8.0
# 查看所有docker容器
docker ps
# 强制删除docker容器
docker rm -f 容器ID
# 删除所有容器
docker rm $(docker ps -q)
# 进入docker容器内部
docker exec -it mysql bash
# 创建容器网络
docker network create
# 查看所有network网络
docker network ls
# 删除网络
docker network rm 网络名称
# 构建镜像,.表示在当前目录构建
docker build -t 取名 .
# 创建并启动所有service容器
docker compose up
# 重新启动所有service容器
docker compose restart
# 关闭并删除所有service容器
docker compose down
# 查看所有service容器
docker compose ps
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值