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容器
项目目录介绍
mysql目录
FROM mysql:latest
COPY ./shop.sql /docker-entrypoint-initdb.d
有的文章说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文件夹
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服务
#引用镜
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"]
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
项目介绍:
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
3. DCV配置
4. 在阿里云的域名解析:添加记录
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需要学习。