原理
Docker 多阶段构建
Dockerfile 每条命令,都会添加一层镜像空间。空间层数越多,镜像体积越大。
通过多阶段构建,压缩多层空间,产出单层空间的 Docker镜像。
缺点
不仅构建出核心镜像,同时还会构建出一些依赖型镜像。
精简版 NodeJS 镜像
使用体积更小的 NodeJS 镜像,减去了 NPM,以及其他二进制文件,极大缩小基础体积。
镜像版本 | 特点 |
---|---|
gcr.io/distroless/nodejs | 体积小,兼顾安全性 |
node:x-alpine | 体积最小,但是存在兼容性问题 |
单容器方案
编写 Dockerfile
FROM node:12.13-alpine As development
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=development
COPY . .
RUN npm run build
FROM node:12.13-alpine as production
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --only=production
COPY . .
COPY --from=development /usr/src/app/dist ./dist
CMD ["node", "dist/main"]
构建镜像
docker build -t your-app-name .
运行容器
docker run -d -p 3000:3000 --restart=always your-app-name
多容器方案
编写 docker-compose.yml
version: '3.7'
services:
main:
container_name: main
build:
context: .
target: development
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
ports:
- ${SERVER_PORT}:${SERVER_PORT}
- 9229:9229
command: npm run start:dev
env_file:
- .env
networks:
- webnet
depends_on:
- redis
- postgres
redis:
container_name: redis
image: redis:5
networks:
- webnet
postgres:
container_name: postgres
image: postgres:12
networks:
- webnet
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
PG_DATA: /var/lib/postgresql/data
ports:
- 5432:5432
volumes:
- pgdata:/var/lib/postgresql/data
networks:
webnet:
volumes:
pgdata:
批量启动容器
docker-compose up --build -V
网友评论