Skip to content

Commit

Permalink
docs: add Dockerfile and docker-compose.yml
Browse files Browse the repository at this point in the history
  • Loading branch information
yanfeng.guan committed May 20, 2024
1 parent f28edcf commit d2bef8d
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 5 deletions.
4 changes: 4 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.git
node_modules
logs
.docker-volumes
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,3 +128,5 @@ dist
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

.docker-volumes
16 changes: 13 additions & 3 deletions CD_CD.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,10 +116,20 @@ docker exec -it containerId /bin/sh
- Compose 文件定义多容器应用, 本质充当了分组的作用, 便于将多个互相依赖的容器应用整合起来构成一个完整的服务

```txt
在Docker Compose的YAML文件中,每个定义的容器实际上可以看作是一个单独的应用或服务。这些服务可以是数据库、后端应用程序、前端应用程序等等,他们各自可以独立地运行和扩展。
当这些容器(应用)被组合在一起时,它们就构成了一个完整的多容器应用。这些容器之间可以通过网络进行相互通信,就像它们是在同一个本地网络中一样。这样,你就可以用一种微服务的方式来构建你的应用,每个服务都在自己的容器中运行,彼此之间通过网络服务进行通信,但是又可以被统一地管理和调度。
Compose.yml文件中,每个定义的容器实际上可看作是一个单独的应用或服务。这些服务可以是数据库、后端应用程序、前端应用程序等,他们各自可以独立地运行。
当这些容器(应用)被组合在一起时,它们就构成了一个完整的多容器应用。
这些容器之间通过网络进行相互通信,就像它们是在同一个本地网络中一样。
这样,你就可以用一种微服务的方式来构建你的应用,每个服务都在自己的容器中运行,彼此之间通过网络服务进行通信,但是又可以被统一地管理和调度。
```

> _warn: 在Docker中,容器的生命周期是由其主进程的生命周期决定的。即当主进程结束时,容器也就结束了。即 Dockerfile 中的CMD命令必须是一个阻塞控制台的程序,以保持容器的运行状态._

## 自动部署到测试机
- github actions 监听 git 提交, 触发执行自定义命令
- docker 一键部署开发环境
- 两者结合即可自动发布到测试环境

## 搭建测试环境
### 配置测试机
10 changes: 9 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shangh
# 安装
RUN npm set registry https://registry.npmmirror.com/
RUN npm i
RUN npm install pm2 -g

# 启动
CMD npm run start && npx pm2 log
# 注意: CMD最后的命令必须是一个阻塞控制台程序, 这样能保持应用的持续存活运行的状态, 如: npx pm2 log
# 因为在Docker中,容器的生命周期是由其主进程的生命周期决定的, 若不阻塞式运行, 命令运行结束容器也会随着终止
CMD echo $SERVER_NAME && echo $AUTHOR_NAME && npm run start && npx pm2 log

# 环境变量
# usage: process.env.SERVER_NAME
ENV SERVER_NAME="editor-server"
ENV AUTHOR_NAME="zhelingwang"
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ services:
ports:
# 宿主机,可以用 127.0.0.1:6378 即可连接容器中的数据库
# 但是,其他 docker 容器不能,因为此时 127.0.0.1 是 docker 容器本身,而不是宿主机
# 很明显, 当你在其他容器 系统中使用 127.0.0.1 时其指代的是容器本身, 并不是宿主机
- 6378:6379
environment:
- TZ=Asia/Shanghai # 设置时区
Expand Down
8 changes: 8 additions & 0 deletions src/config/env/dev.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
module.exports = {
// 假设将当本项目应用视为docker多容器应用(compose)中的主应用
// 当主应用作为docker容器应用被运行时, 配置中的 127.0.0.1 / localhost 指代的是容器本身
// 而容器本身是没有提供这些服务, 所以需要将 host 设置为 docker-compose.yml 中对应服务的名称
// docker-compose 中定义的服务名可以简单的视为 host 替代, 用于多容器之间的直接通信
mysqlConf: {},
redisConf: {
// host: 'editor-redis',
},
mongoConf: {},
};
2 changes: 2 additions & 0 deletions src/config/env/prod.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ module.exports = {
idle: 10000, // 如果一个线程 10 秒钟内没有被使用过的话,那么就释放线程
},
},
redisConf: {},
mongoConf: {},
};
4 changes: 3 additions & 1 deletion src/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const { isProd } = require('../utils/env');

const envName = isProd ? 'prod.js' : 'dev.js';
const extraConf = require(`./env/${envName}`);
const { mysqlConf } = extraConf;
const { mysqlConf, mongoConf, redisConf } = extraConf;

module.exports = {
mysqlConf: {
Expand All @@ -21,9 +21,11 @@ module.exports = {
pass: 'root',
url: 'mongodb://lyon:root@localhost:27017',
dbName: 'lyon-cli',
...mongoConf,
},
redisConf: {
port: 6379,
host: '127.0.0.1',
...redisConf,
},
};

0 comments on commit d2bef8d

Please sign in to comment.