前端如何玩转Docker-compose部署和nginx配置https

631 阅读5分钟

Docker-compose部署和Nginx配置Https

本文涉及到的一些小知识

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

背景

fresh项目是我研究前端、后端Nodejs、小程序的一个学习项目。因为部署在服务器需要https的接口。部署docker没有docker-compose又很麻烦,所以打算趁着国庆期间在家无聊把docker-compose配好,然后把https的证书配合Nginx弄明白,毕竟小程序是需要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目录

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

nginx文件夹

  1. dist ui-fresh项目的编译产物
  2. default.conf nginx的配置
  3. 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服务

  1. 后端服务的Dockerfile文件内容
#引用镜
FROM  node:latest
#FROM node:18.16-slim
#执行命令,创建文件夹
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", "start"]
  1. 后端项目的数据库配置,包含了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

项目介绍:

  1. 项目后端生产环境的端口为5101,后端为Eggjs框架。
  2. 项目的数据库使用mysql
  3. 项目使用了redis
  4. 容器之间的通信用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

  1. 申请免费SSL证书: freessl.cn/
  2. 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需要学习。