美文网首页
docker-compose 部署 egg mongodb re

docker-compose 部署 egg mongodb re

作者: shadow123 | 来源:发表于2022-06-22 16:31 被阅读0次

    前端项目部署

    使用 docker compose 部署单页面应用,我们再上一遍文章介绍过。链接

    创建docker-compose.yaml

    version: "3.0"
    
    services:
      vote:
        container_name: vote
        build:
          context: vote
          dockerfile: Dockerfile
        ports:
          - 8000:80
        restart: on-failure
        networks:
          - frontend
        depends_on:
          - server
    
    networks:
      frontend:
    

    创建 Dockerfile

    前端项目有两种方式构建 dockerfile

    1. 前端项目打包好后,再使用 nginx 构建

      FROM nginx
      COPY default.conf /etc/nginx/conf.d/default.conf
      COPY dist /usr/share/nginx/build
      
    2. 多阶段构建(打包也由dockerfile 完成)

      FROM node:14-alpine as builder
      WORKDIR /app
      
      COPY package.json package-lock.json /app/
      RUN npm install --registry=https://registry.npm.taobao.org
      
      COPY . /app
      RUN npm run build
      
      FROM nginx
      COPY default.conf /etc/nginx/conf.d/default.conf
      COPY --from=builder app/dist /usr/share/nginx/build
      

    本文使用了第一种方式,第二种方式下载依赖、打包构建时间有点长,感兴趣的小伙伴可以试试

    创建 default.conf

    server {
        listen       80;
        listen  [::]:80;
        server_name  localhost;
    
        access_log  /var/log/nginx/host.access.log  main;
        error_log  /var/log/nginx/error.log  error;
    
        location ^~ /api {
            proxy_set_header  Host $host;
            proxy_set_header  X-Real-IP $remote_addr;
            proxy_set_header  X-Forwarded-Proto https;
            rewrite ^/api/(.*)$ /$1 break;
            proxy_pass http://server:7001;
        }
    
        location / {
            root   /usr/share/nginx/build;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }
    

    前端项目部署构建文件创建完成了,docker-compose.yaml文件还缺少 server 项目

    后端项目部署

    创建 docker-compose.yaml

    version: "3.0"
    
    services:
      redis:
        container_name: redis
        image: redis
        ports:
          - "6380:6379"
        restart: on-failure
        volumes:
          - ./data/redis/data:/data
          - ./redis/redis.conf:/usr/local/etc/redis/redis.conf
          - ./data/redis/logs:/logs
        command: redis-server /usr/local/etc/redis/redis.conf
        networks:
          - my-server
    
      mongodb:
        container_name: mongodb
        build:
          context: mongo
          dockerfile: Dockerfile
        restart: on-failure
        ports:
          - "27019:27017"
        environment:
          MONGO_INITDB_ROOT_USERNAME: root
          MONGO_INITDB_ROOT_PASSWORD: 123456
          MONGO_INITDB_DATABASE: eggadmin
        volumes:
          - ./data/mongodb/db:/data/db
          - ./data/mongodb/log/:/var/log/mongodb
        networks:
          - my-server
    
      server:
        container_name: server
        build:
          context: egg-admin
          dockerfile: Dockerfile
        ports:
          - "3000:7001"
        restart: on-failure
        networks:
          - my-server
          - frontend
        depends_on:
          - mongodb
          - redis
    networks:
      my-server:
      frontend:
    

    server 项目依赖mongodbredis 项目,docker-compose up 启动时会先启动mongodbredis 项目

    mongodb 配置

    mongodb 的 Dockerfile 文件

    FROM mongo
    ENV WORKSPACE /usr/local/work
    ENV AUTO_RUN_DIR /docker-entrypoint-initdb.d
    ENV INSTALL_MONGO_SHELL setup.sh
    RUN mkdir -p $WORKSPACE
    COPY ./dump $WORKSPACE/
    COPY ./$INSTALL_MONGO_SHELL $AUTO_RUN_DIR/
    RUN chmod a+x $AUTO_RUN_DIR/$INSTALL_MONGO_SHELL
    

    mongodb 的 setup.sh

    #!/bin/bash
    mongorestore -d eggadmin --drop $WORKSPACE/eggadmin
    

    mongodb 数据库默认角色说明

    1. 数据库用户角色:read、readWrite
    2. 数据库管理角色:dbAdmin、dbOwner、userAdmin
    3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
    4. 备份恢复角色:backup、restore
    5. 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    6. 超级用户角色:root
    

    连接到数据库

    mongodb://root:123456@127.0.0.1:27017/eggadmin
    

    server 配置

    server 的 Dockerfile 文件

    # node镜像
    FROM node:14-alpine
    
    # 设置工作目录
    WORKDIR /app
    
    # 拷贝package.json文件到工作目录
    # !!重要:package.json需要单独添加。
    # Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
    # 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有>必要。
    # 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
    COPY package.json /app/
    
    # 安装npm依赖(使用淘宝的镜像源)
    # 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
    RUN npm install --registry=https://registry.npm.taobao.org
    
    COPY . /app
    
    CMD ["npm","start"]
    

    egg 项目 config.prod.js 文件配置如下

     config.mongoose = {
        client: {
          url: "mongodb://mongodb:27017/eggadmin",
          options: {
            useUnifiedTopology: true,
          }
        }
      };
    
      config.redis = {
        client: {
          port: 6379,
          host: "redis",
          password: "redispassword",
          db: 0,
        }
      };
    

    有细心的同学会发现mongodb 对外暴露的端口是27019,而我们这配置的是 27017,这是因为我们在docker-compose.yaml 文件配置了networks,server、mongodb、redis 处于同一网络 my-server 下,host 就是构建的容器名,如mongodb,redis,端口就是容器的端口,如27017,6379 ... 同理,前端项目 server 、vote 处于同一网络 frontend 下,所以 前端项目 default.conf 的 proxy_pass 配置 为http://server:7001;

    redis 配置

    redis 的 redis.conf

    # bind 127.0.0.1 ::1
    requirepass redispassword
    

    启动

    docker-compose up -d
    

    相关文章

      网友评论

          本文标题:docker-compose 部署 egg mongodb re

          本文链接:https://www.haomeiwen.com/subject/mqjuvrtx.html