docker-compose.yml
version: '3.2'
services:
# 后端项目
web-app:
# 如果dockerfile文件在当前目录,直接build:. 即可
build:
# 指定 Dockerfile 文件所在的路径
context: .
# 指定 context 指定的目录下面的 Dockerfile 的自定义名称(默认为 Dockerfile)
dockerfile: web.dockerfile
# 创建的容器名
container_name: web-app
# 容器暴露端口(宿主机可访问端口:容器暴露端口)
ports:
- 5000:5000
# 加入的局域网名,可加入多个
networks:
- db
# 挂载的目录(宿主机目录:容器目录)
volumes:
- ./web/logs:/app/logs
- ./web/public:/app/public
# 依赖的容器服务,待它们均启动成功后在启动本服务
depends_on:
- primary
- secondary1
- secondary2
# 主副本
primary:
# 使用mongo7.0镜像
image: mongo:7.0
# 主副本容器名
container_name: primary
# 容器暴露端口(宿主机端口:容器端口),27017为mongo服务端口
ports:
- 2000:27017
# 加入的局域网名,可加入多个
networks:
- db
environment:
# 数据库操作记录时间设为北京时间
TZ: Asia/Shanghai
# 开启权限验证,填写的初始鉴权数据库,用户名和密码,也可以在启动后在创建
MONGO_INITDB_DATABASE: admin
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: abc
# 容器启动就运行
restart: always
# 挂载一个目录或者一个已存在的数据卷容器
volumes:
- ./mongo1/data:/data/db
- ./mongo1/log:/data/log
- ./mongo1/conf:/data/conf
- ./mongo1/json:/data/json
# 同镜像中的CMD,启动时执行
command: mongod --dbpath /data/db --replSet rsk --keyFile /data/conf/key.txt --bind_ip_all
secondary1:
image: mongo:7.0
container_name: secondary1
ports:
- 2001:27017
networks:
- db
environment:
TZ: Asia/Shanghai
MONGO_INITDB_DATABASE: admin
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: abc
restart: always
volumes:
- ./mongo2/data:/data/db
- ./mongo2/log:/data/log
- ./mongo2/conf:/data/conf
- ./mongo2/json:/data/json
command: mongod --dbpath /data/db --replSet rsk --keyFile /data/conf/key.txt --bind_ip_all
secondary2:
image: mongo:7.0
container_name: secondary2
ports:
- 2002:27017
networks:
- db
environment:
TZ: Asia/Shanghai
MONGO_INITDB_DATABASE: admin
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: abc
restart: always
volumes:
- ./mongo3/data:/data/db
- ./mongo3/log:/data/log
- ./mongo3/conf:/data/conf
- ./mongo3/json:/data/json
command: mongod --dbpath /data/db --replSet rsk --keyFile /data/conf/key.txt --bind_ip_all
# mongodb 在线网页版可视化工具,测试只能导出,不能导入
mongo-express2:
image: mongo-express
container_name: mongo-express2
ports:
- 998:8081
networks:
- db
environment:
# 登录mongo-express的账号和密码
# ME_CONFIG_BASICAUTH_USERNAME: root
# ME_CONFIG_BASICAUTH_PASSWORD: abc
# 访问鉴权数据库的账户密码
# ME_CONFIG_MONGODB_ADMINUSERNAME: root
# ME_CONFIG_MONGODB_ADMINPASSWORD: abc
ME_CONFIG_MONGODB_URL: mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@172.27.0.3:27017,172.27.0.4:27017,172.27.0.2:27017/songke?authSource=${MONGO_AUTH_DB}&replicaSet=rsk
depends_on:
- primary
- secondary1
- secondary2
# 创建定义的局域网,可创建多个
networks:
db:
driver: bridge
.env
docker-compose引用的变量如果在ENV没找到,会自动去同级目录的.env文件,查是否存在
MONGO_USERNAME = 'root'
MONGO_PASSWORD = 'abc'
MONGO_AUTH_DB = 'admin'
web.dockerfile
//测试多阶段构建,多阶段构建目的只能是将最后生成的文件拷贝到下一个阶段使用,后阶段镜像执行会覆盖前一个阶段
// 多阶段构建配置COPY使用,将上个阶段生成的文件拷贝出来
// 镜像后 as xxx 或者不指定, 对应COPY --from=xxx 或者--from=该镜像执行序号
# FROM mongo:7.0
# 使用官方Node.js基础镜像
FROM node:18
# 设置工作目录
WORKDIR /app
# 设置北京时间
ENV TZ Asia/Shanghai
# ARG:定义构建过程中可被用户传递的变量
# ENV:定义容器中的环境变量
# 指定开发环境,传给执行命令参数
ENV env_name=production
# 将当前目录下的所有文件复制到工作目录
COPY ./web .
COPY ./exe /usr/bin
# COPY --from=0 /usr/bin/mongod /usr/local/bin/
# COPY --from=0 /usr/bin/mongosh /usr/local/bin/
# COPY --from=0 /usr/bin/mongodump /usr/local/bin/
# COPY --from=0 /usr/bin/mongorestore /usr/local/bin/
# COPY ./exe /usr/bin
# ADD https://fastdl.mongodb.org/tools/db/mongodb-database-tools-ubuntu2204-arm64-100.9.4.tgz /usr/bin
# RUN ln -s /usr/bin/mongodump /bin/mongodump
# RUN ln -s /usr/bin/mongosh /bin/mongosh
# COPY --from=0 /usr/bin/mongodump ./exe
# 安装项目依赖
RUN npm install
# 我项目使用pm2 需要全局安装一下
RUN npm install pm2 -g
# 安装pm2使用的日志组件
RUN pm2 install pm2-logrotate
####
# 定义容器启动时执行的命令
CMD ["sh", "-c","pm2-runtime start ./pm2.config.js --env ${env_name} "]
参考链接
docker-compose教程:command的使用(传命令参数)
https://blog.csdn.net/a772304419/article/details/132901091docker compose volumes参数说明 docker-compose详解
https://blog.51cto.com/u_16099321/9951573