当前位置: 首页 > 工具软件 > eladmin > 使用案例 >

eladmin使用docker部署

许博易
2023-12-01

这里仅讨论部署,不涉及开发
这里仅讨论部署,不涉及开发
这里仅讨论部署,不涉及开发

  • mysql

    # 拉取 mysql 镜像,随便选择即可
    docker pull mysql:8.0
    # 运行
    docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mypasswd -v /data/mysql/data:/var/lib/mysql mysql:8.0
    # 确保将 eladmin 提供的 eladmin.sql 复制到当前文件夹后执行
    docker cp eladmin.sql mysql:/root/
    # 进入容器
    docker exec -it mysql sh
    cd /root/
    # mysql 新建数据库导入 eladmin
    mysql -uroot -p
    create database eladmin;
    use eladmin;
    source eladmin.sql;
    
  • redis

    # 拉取 redis 镜像,随便选择即可
    docker pull redis:6.2
    docker run -d --name redis -p 6379:6379 \
    -v /usr/docker/tlmall-redis/data:/data \
    -v /usr/docker/tlmall-redis/conf/redis.conf:/etc/redis.conf \
    redis:6.2
    
  • 前端

    • nginx.conf

      user  nginx;
      worker_processes  1;
      error_log  /var/log/nginx/error.log warn;
      pid        /var/run/nginx.pid;
      events {
        worker_connections  1024;
      }
      http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
        
      server
          {
              listen 80;
              server_name 192.168.0.1;
              index index.html;
              root  /app;  #dist上传的路径
      
              # 避免访问出现 404 错误
              location / {
                try_files $uri $uri/ @router;
                index  index.html;
              }
      
              location @router {
                rewrite ^.*$ /index.html last;
              }
      
              # 接口
              location /api {
                proxy_pass http://172.17.0.1:8000;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
              }
      
              # 授权接口
              location /auth {
                proxy_pass http://172.17.0.1:8000;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
              }
      
              # WebSocket 服务
              location /webSocket {
                proxy_redirect off;
                proxy_pass http://172.17.0.1:8000/webSocket;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_set_header Host $http_host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_connect_timeout 60s;
                proxy_read_timeout 86400s;
                proxy_send_timeout 60s;
              }
      
              # 头像
              location /avatar {
                proxy_pass http://172.17.0.1:8000;
              }
      
              # 文件
              location /file {
                proxy_pass http://172.17.0.1:8000;
              }
          }
      }
      

      server_name 192.168.0.1 此处改为本地地址

    • dockerfile

      FROM alpine:3.16.2
      
      WORKDIR /tmp
      
      RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
          && apk add --no-cache nodejs npm bash git \
          && npm config set registry https://registry.npm.taobao.org \
          && echo 'sass_binary_site=https://npm.taobao.org/mirrors/node-sass/' >> ~/.npmrc \
          && git clone --progress https://ghproxy.com/https://github.com/elunez/eladmin-web.git eladmin-web \
          && cd eladmin-web \
          && sed -e 's|https://eladmin.vip|http://192.168.0.1:8000|g' \
          		-e 's|wss://eladmin.vip|ws://192.168.0.1:8000|g' -i .env.production \
          && npm install \
      	&& cd /tmp/eladmin-web/ \
      	&& npm run build:prod
      
      
      FROM alpine:3.16.2
      
      RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
          && mkdir -p /app && apk add nginx bash
      
      COPY --from=0 /tmp/eladmin-web/dist /app
      COPY nginx.conf /etc/nginx/nginx.conf
      
      ENTRYPOINT ["nginx","-g","daemon off;"]
      

      其中192.168.0.1为实际部署的机器的ip,根据实际情况修改

    • 构建

      docker build -t vue:1.0 .
      # 当文件名不为 dockerfile 时,使用 -f 选项指定
      # 在构建阶段无法联网时,使用 --network host
      
    • 运行

      docker run --name vue -d -p 8080:80 vue:1.0
      
  • 后端

    • dockerfile

      注意!构建时需要编译打包好后端的jar包放在当前目录,也可以在dockerfile中拉取代码后编译,然后分阶段构建,这里不展开

      FROM openjdk:18
      ARG JAR_FILE=./*.jar
      COPY ${JAR_FILE} app.jar
      ENV TZ=Asia/Shanghai
      ENTRYPOINT ["java","-jar","/app.jar"]
      
    • 构建

      docker build -t app:1.0 .
      # 当文件名不为 dockerfile 时,使用 -f 选项指定
      # 在构建阶段无法联网时,可以直接先拉取基础镜像 docker pull openjdk:18
      
    • 运行

      docker run -d \
      --name app --restart always \
      -p 8000:8000 \
      -e "TZ=Asia/Shanghai" \
      -e DB_HOST=172.17.0.1 \
      -e DB_PWD=mypasswd \
      -e REDIS_HOST=172.17.0.1 \
      -v /home/data/:/home/eladmin/ \
      app:1.0
      # DB_HOST 和 REDIS_HOST 使用的是容器网桥地址,指向宿主机
      # DB_PWD 根据自己 mysql 的密码修改
      # redis如果设置了密码,则要增加 REDIS_PWD 字段指定
      
  • 说明

    构建部署完成后可以考虑清除一下构建过程产生的缓存

    docker container prune
    docker image prune
    

    按照上述的流程,用到了3306637980808000,其中80808000根据自己需要修改,然后记得防火墙要放通这些端口,因为终端访问这些服务时,请求都是从终端发起!最开始脑子抽了以为前后端部署在同一机器,前后端通信时都使用本地地址即可,实际上这样没有考虑到终端访问,即:所有的请求都是从终端发起,无论是请求前端或者是后端!没有前端服务直接到后端服务方向的请求!根据这个思路,nginx、前端和后端的配置都是很好理解的。

 类似资料: