项目完成后交付客户的是镜像,方便设置环境进行部署,这里记录下一些配置。
数据库:mysql5.7 redis:4 nodejs:16 nodejs-thinkjs:3
由于不熟悉docker,看了半天视频想通过dockerfile来实现,最后发现还是挺麻烦的,尤其是mysql的一些密码配置等,还有各种命令报错啥的。
最后查了下docker-compose
,发现并没有想象的复杂,最终使用了它。
Dockerfile中书写关于web相关的一些配置和属性,如下:
# Mengfu Project Docker Image
# version 0.1
FROM node:16.14-slim
LABEL maintainer="chrunlee <chrunlee@foxmail.com>"
WORKDIR /usr/local/mengfu
COPY . .
RUN cd admin && npm install && cd ../admin-template && npm install && npm run build:prod
EXPOSE 8360
CMD ["node","/usr/local/mengfu/admin/production.js"]
node采用的slim版本,然后构建完成后暴露8360端口,并启动product.js
.
在没有使用docker
之前,服务端管理进程是使用的pm2
,这里把pm2
取消了,docker
本身就带有守护作用。
FROM node:16.14-slim
基础镜像使用,可以从hub.docker.com
查找
LABEL maintainer="author
WORKDIR 工作目录
version: "3.7"
services:
mysql:
image: mysql:5.7
restart: always
volumes:
- ./mysql:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d/
ports:
- 13306:3306
expose:
- 3306
networks:
- front-web
privileged: true
container_name: mysql
environment:
- "MYSQL_ROOT_PASSWORD=root"
- "MYSQL_DATABASE=mengfu"
- "TZ=Asia/Shanghai"
command:
--default-time-zone="+8:00"
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--max_connections=1000
--innodb_lock_wait_timeout=500
redis:
image: redis:6-alpine3.17
restart: always
ports:
- 16379:6379
expose:
- 6379
networks:
- front-web
privileged: true
environment:
- "TZ=Asia/Shanghai"
container_name: redis
command: redis-server --appendonly yes
web:
build: .
container_name: web
ports:
- 8360:8360
volumes:
- ./admin/www:/usr/local/mengfu/admin/www
- ./admin/runtime:/usr/local/mengfu/admin/runtime
- ./admin/logs:/usr/local/mengfu/admin/logs
- ./admin/view:/usr/local/mengfu/admin/view
environment:
- "DOCKER=true"
- "REDIS_PORT=6379"
- "REDIS_HOST=server_redis"
- "MYSQL_HOST=server_mysql"
- "MYSQL_PORT=3306"
networks:
- front-web
depends_on:
- redis
- mysql
links:
- redis:server_redis
- mysql:server_mysql
networks:
front-web:
driver: bridge
这里面我自己需要注意的几个问题是: ports expose depends_on links volumes
.
depends_on : 依赖,web依赖redis mysql ,需要这里标明
links : 将其他服务连接到当前的容器,比如: - redis:server_redis ,那么在项目中连接redis则可以使用new Reids({host : server_redis})
来进行连接。
__ports __: 这里是将容器内的端口映射给宿主机端口,可以从宿主机直接访问
expose: 将容器内的端口暴露给其他容器使用
volumes: 共享卷,这里一般可以指定代码目录,以后如果有代码更新,则可以直接拉取后重启容器即可。
environment: 环境变量,需要配合容器内使用,比如:nodejs ,可以通过 process.env.REDIS_PORT
来获取
有初始化的sql数据,可以在volumes
中执行。
volumes:
- ./mysql:/var/lib/mysql
- ./init:/docker-entrypoint-initdb.d/
docker compose up -d
docker compose up -d --build
3.重启某个容器
docker compose restart web
docker rm -fv NAME
docker rmi NAME
转载请注明出处: https://chrunlee.cn/article/docker-nodejs-mysql-redis.html