本文共 3412 字,大约阅读时间需要 11 分钟。
最近在做一个 node 全栈开发项目,涉及服务端技术栈的搭建,其中服务端采用了 nginx + koa + postgresql。为了解决部署环境的繁琐操作问题,逐渐引入了 Docker 技术,通过自动化操作大大简化了环境搭建和部署流程。
Docker 是一种轻量级的虚拟化技术,它通过容器的方式运行应用程序。容器是一个隔离的沙盒环境,只包含应用程序及其所需的库和依赖。与传统虚拟机不同,容器运行时占用的资源极其有限,这使得在生产环境中运行容器集群变得更加高效和灵活。
镜像和容器的关系类似于类与对象的关系。镜像可以看作是容器的模板,容器是通过镜像实例化而来,一个镜像可以生成多个容器。
在本地环境下使用 Docker 可以通过 Docker Desktop 进行操作。对于 Windows 和 macOS 用户,推荐使用 Kitematic 这类桌面管理工具。虽然 Docker Desktop 提供了直观的操作界面,但命令行操作仍然是必不可少的,因为很多复杂操作只能通过命令完成。
docker pull nginx:1.19.0-alpine 获取指定镜像。docker rmi 命令删除不需要的镜像。docker images 查看所有下载的镜像。docker run --name web -p 8080:80 -v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.19.0-alpine。 --name web:指定容器名称。-p 8080:80:将容器内的 80 端口映射到本地 8080 端口。-v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro:将本地配置文件挂载到容器。-d:后台运行容器。docker ps。docker rm web。为了构建高效的镜像,推荐使用 Dockerfile。以下是一个简单的 Nginx 镜像构建示例:
FROM node:14.5.0-alpine3.12WORKDIR /usr/src/appCOPY package*.json ./COPY process.yml .RUN npm set registry https://registry.npm.taobao.org/ && npm install pm2 -g && npm installCMD ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"]EXPOSE 3010
当项目需要多容器协作时, Docker-compose 是一个强大的工具。通过配置 docker-compose.yml 文件,可以定义多个服务容器,并通过一条命令启动所有服务。例如:
version: '3'services: db: image: postgres:12.3-alpine environment: - TZ=Asia/Shanghai - POSTGRES_PASSWORD=xxxx volumes: - ./postgres/data:/var/lib/postgresql/data - ./postgres/init:/docker-entrypoint-initdb.d ports: - 5432:5432 restart: always expose: - 5432 app: image: koa-pg volumes: - ./dist:/usr/src/app/dist - ./logs:/usr/src/app/logs build: . environment: - TZ=Asia/Shanghai restart: always depends_on: - db links: - db expose: - 3010 nginx: image: nginx:1.19.0-alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8080:80 environment: - TZ=Asia/Shanghai restart: always depends_on: - app links: - app expose: - 8080
# Node服务镜像FROM node:14.5.0-alpine3.12WORKDIR /usr/src/appCOPY package*.json ./COPY process.yml .RUN npm set registry https://registry.npm.taobao.org/ && npm install pm2 -g && npm installCMD ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"]EXPOSE 3010
version: '3'services: db: image: postgres:12.3-alpine container_name: postgres environment: - TZ=Asia/Shanghai - POSTGRES_PASSWORD=xxxx volumes: - ./postgres/data:/var/lib/postgresql/data - ./postgres/init:/docker-entrypoint-initdb.d ports: - 5432:5432 restart: always app: image: koa-pg container_name: koa volumes: - ./dist:/usr/src/app/dist - ./logs:/usr/src/app/logs build: . environment: - TZ=Asia/Shanghai restart: always depends_on: - db links: - db expose: - 3010 nginx: image: nginx:1.19.0-alpine container_name: nginx volumes: - ./nginx.conf:/etc/nginx/nginx.conf ports: - 8080:80 environment: - TZ=Asia/Shanghai restart: always depends_on: - app links: - app expose: - 8080
在本地或目标服务器上运行:
docker-compose up
这种方式不仅适用于本地开发,也可以轻松扩展到多服务器的部署环境。只需修改 docker-compose.yml 中的服务数量和配置即可完成多容器部署,极大提升了部署效率。
转载地址:http://tcduz.baihongyu.com/