前端如何玩转Dockercompose部署和nginx配置https

2023年 10月 3日 41.9k 0

Docker-compose部署和Nginx配置Https

本文涉及到的一些小知识

  • docker
  • linux的基础操作
  • nginx的简单配置
  • docker-compose
  • https证书
  • 这样的部署方式适用于前后端,不限于本文涉及的部署项目,好的前端必须学会折腾docker部署等

背景

fresh项目是我学习前端、后端nodejs、小程序的一个学习项目。因为部署在服务器需要https的接口。部署docker没有docker-compose又很麻烦,所以打算趁着国庆期间在家无聊把docker-compose写好,然后把https的证书搞好。

Docker Compose

Compose 简介

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
  • 文章中xxm.yyyyyyy.cn是一个虚假域名,需要改为自己的域名。

docker常用命令集合

docker images // 列出本地镜像
docker ps -a  // 显示所有的容器,包括未运行的。
docker ps -q  // 查看正在运行容器ID
docker stop $(docker ps -a -q) // 停止所有本地容器
docker rm $(docker ps -a -q) // 删除所有本地容器
docker rmi $(docker images -a -q) // 删除所有本地镜像
docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q) && docker rmi $(docker images -a -q) // 一次删除所有容器和镜像
docker logs --since 30m 容器ID // 查看docker容器ID的日志
docker-compose up -d // 启动命令
docker exec -it mysql bash // 进入mysql容器

项目目录介绍

image.png

mysql目录

  • mysql的Dockerfile
  • FROM mysql:latest
    COPY ./shop.sql /docker-entrypoint-initdb.d
    
  • 整个项目的数据库文件:shop.sql
  • mysql数据库shop的导入
    有的文章说shop.sql文件放到docker-entrypoint-initdb.d文件夹下便可以自动创建数据库,我尝试过失败了,所有直接进入mysql导入
    • 进入mysql容器:docker exec -it mysql
    • 进入mysql数据库:bash mysql -u root -p
    • 输入密码:test_123
    • 创建一个shop数据库:create DATABASE shop;
    • 进入shop数据库:use shop;
    • 导入shop.sql数据库:source /docker-entrypoint-initdb.d/shop.sql

    nginx文件夹

  • dist ui-fresh项目的编译产物
  • default.conf nginx的配置
  • nginx的Dockerfile
  • FROM nginx
    COPY xxm.yyyyyyy.cn.conf /etc/nginx/conf.d/xxm.yyyyyyy.cn.conf
    ADD dist/ /usr/share/nginx/html/xxm.yyyyyyy.cn
    

    后端项目server-fresh,提供ui-fresh和ui-alpaca的api服务

  • 后端服务的Dockerfile文件内容
  • #引用镜
    FROM node:18.17
    #执行命令,创建文件夹
    RUN mkdir -p /usr/src/server-fresh
    
    COPY . /usr/src/server-fresh
    
    #指定工作目录
    WORKDIR /usr/src/server-fresh
    
    RUN npm config set registry http://mirrors.cloud.tencent.com/npm/
    
    # RUN npm install yarn
    #安装依赖及构建node应用
    RUN yarn cache clean && yarn --network-timeout 10000
    
    #配置环境变量
    ENV HOST 0.0.0.0
    ENV PORT 5101
    #定义程序默认端口
    EXPOSE 5101
    
    # RUN yarn ci
    #运行程序命令
    CMD ["yarn", "run", "debug"]
    
  • 后端项目的数据库配置,包含了mysql和redis配置
  • sequelize: {
      dialect: 'mysql',
      host: 'mysql',
      port: 3306,
      username: 'root',
      // 密码
      password: 'test_123',
      database: 'shop',
      define: {
        underscored: false,  // 禁止驼峰式字段默认转为下划线
        charset: 'utf8mb4',
        timestamps: true
      },
      dialectOptions: {
        charset: 'utf8mb4'
      },
    },
    redis: {
      client: {
        port: 6379, // Redis port
        host: 'server-redis', // Redis host
        password: '',
        db: 0,
      },
    },
    

    docker-compose.yml

    项目介绍:

  • 项目后端生产环境的端口为5101,后端为Eggjs框架。
  • 项目的数据库使用mysql
  • 项目使用了redis
  • 容器之间的通信用my-server网络
  • version: "3.0"
    
    services:
        server-redis:
            container_name: server-redis
            image: redis
            ports:
                - "6379:6379"
            restart: on-failure
            networks:
                - my-server
    
        mysql:
            container_name: mysql
            build:
                context: mysql
                dockerfile: Dockerfile
            ports:
                - "3306:3306"
            restart: on-failure
            environment:
                - MYSQL_ROOT_PASSWORD=test_123
            volumes:
                - ./mysql/:/docker-entrypoint-initdb.d/
            networks:
                - my-server
    
        server-fresh:
            container_name: server-fresh
            build:
                context: server-fresh
                dockerfile: Dockerfile
            ports:
                - "5101:5101"
            restart: on-failure
            networks:
                - my-server
            depends_on:
                - server-redis
                - mysql
    
        nginx:
            container_name: nginx
            build:
                context: nginx
                dockerfile: Dockerfile
            ports:
                - "80:80"
                - "443:443"
            restart: on-failure
            networks:
                - my-server
            depends_on:
                - server-redis
                - mysql
                - server-fresh
    
    networks:
        my-server:
    

    如何把http转为https

  • 申请免费SSL证书: freessl.cn/
  • ACME域名配置
  • image.png
    3. DCV配置

    image.png
    4. 在阿里云的域名解析:添加记录

    image.png
    5. 部署,域名关键字改为xxm.yyyyyyy.cn

    • 本地执行acme.sh 部署命令
    • The domain key is here: /Users/xxx/.acme.sh/xxxx_ecc/xxxx.key (部分关键字xxx代替)
    ca.cer  
    fullchain.cer  证书改名为xxm.yyyyyyy.cn_chain.crt
    xxm.yyyyyyy.cn.cer  
    xxm.yyyyyyy.cn.conf  
    xxm.yyyyyyy.cn.csr  
    xxm.yyyyyyy.cn.csr.conf  
    xxm.yyyyyyy.cn.key 改为xxm.yyyyyyy.cn_key.key
    
    • 把证书和key放到文件夹 /etc/nginx/cert.d/xxm.yyyyyyy.cn下面
    • 可以通过scp把下载的证书上传上去或者去服务器下载

    nginx的配置xxm.yyyyyyy.cn.conf

    • 所处文件夹/etc/nginx/conf.d/
    • nginx的内容
    server {
        listen       80;
        listen       443 ssl;
        listen  [::]:80;
        server_name  xxm.yyyyyyy.cn;
    
        #ssl证书的pem文件路径
        ssl_certificate  /etc/nginx/cert.d/xxm.yyyyyyy.cn/xxm.yyyyyyy.cn_chain.crt;
        #ssl证书的key文件路径
        ssl_certificate_key /etc/nginx/cert.d/xxm.yyyyyyy.cn/xxm.yyyyyyy.cn_key.key;
        ssl_session_timeout 5m;
        #请按照以下协议配置
        ssl_protocols TLSv1.2 TLSv1.3;
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        access_log  /var/log/nginx/host.access.log  main;
    
        location /api {
                client_max_body_size 5M;
                proxy_pass http://server-fresh:5101;
                proxy_set_header Host $host;
                proxy_connect_timeout 60s;
                proxy_send_timeout 60s;
                proxy_read_timeout 60s;
        }
    
        location /xxm {
                client_max_body_size 5M;
                proxy_pass http://server-fresh:5101;
                proxy_set_header Host $host;
                proxy_connect_timeout 60s;
                proxy_send_timeout 60s;
                proxy_read_timeout 60s;
        }
    
    
        location / {
                root   /usr/share/nginx/html/xxm.yyyyyyy.cn;
                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部署包含后端server-fresh服务、mysql数据库服务、redis服务、nginx服务,
    mysql需要导入一个默认数据库,nginx需要先申请免费SSL证书,还有后端服务Dockerfile需要学习。

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论