前段时间作了个node
全栈项目,服务端技术栈是 nginx
+ koa
+ postgresql
。其中在centos
上搭建环境和部署都挺费周折,部署测试服务器,接着上线的时候又部署生产环境服务器。这中间就有不少既无聊又费精力,吃力不讨好的"体力活"。因此就开始思考怎么自动化这部分搭建部署的工做,也就引出了Docker
。node
Docker
是比虚拟机还要轻量级的虚拟化技术,它虚拟化的实体就叫作容器。容器自己就是一个隔离了做用域的sandbox
,同时它只包含了基础库和自己承载的服务,很是精简。容器运行起来后就只是宿主机中的一个进程而已,占用的资源是很是小的,这就为操做系统上运行容器集群创造了条件,可操做性和灵活性极佳。nginx
镜像和容器又是什么关系呢?能够把镜像当作是类(class
),容器当作对象(object
),容器是由镜像实例化产生出来的,固然一个镜像能够生成多个容器。web
若是不在服务器,咱们在客户端要怎么使用 Docker
呢?在 Windows
和 OSX
上可使用 Docker Desktop
,再加上 Kitematic
,这两个都是桌面管理工具,常规的操做方面很是便利。Docker Desktop
和 Kitematic
只是可视化了部分操做,命令行仍是必备的,由于不少操做也只能命令行才行。redis
关于镜像标签,好比nginx:1.19.0-alpine
,1.19.0是 nginx
的版本号,alpine
是os的代号。sql
Jessie: debian 8docker
Stretch: debian 9数据库
Buster: debian 10npm
Alpine: Alpine,推荐使用,由于体积很是小json
Alpine
是体积最小的一个版本,有些甚至是其余版本的四分之一。这意味着构建镜像更快,运行效率更高,由于加载的组件更加少,无形中也意味着漏洞更少更安全。centos
docker pull nginx:1.19.0-alpine
--name web:指定容器名称为web
-p 8080:80: 容器nginx监听端口为80,映射到本地端口8080
-v xxxx:xxxx:这里是用本地配置文件映射到容器nginx配置文件
-d:后台运行
nginx:1.19.0-alpine:使用的镜像
docker run --name web -p 8080:80 -v /usr/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx:1.19.0-alpine
docker images #显示镜像 docker rmi xxx #删除镜像 docker ps #显示运行的容器 docker rm xxx #删除容器
构建镜像比较方便的是使用Dockerfile
,它就是镜像的配置文件,只要有Dockerfile
,随时能够构建镜像。以下就是构建一个很是简单的nginx
镜像,from
就是构建时使用的基础镜像:
FROM nginx COPY nginx.conf /etc/nginx/nginx.conf
当咱们的项目不只只有单个容器,而是须要运行多个容器,并且容器之间还须要互相通讯的时候,就须要更强大的管理工具了。好比k8s
,但咱们目前的小项目使用官方自带的Docker-compose
已经足矣。
首先须要docker-compose.yml
配置文件,好比下面就是两个容器的模板,image
表示使用的镜像,ports
则表示端口映射,volumes
则是须要映射的数据卷:
version: "3" services: webapp: image: web ports: - "8080:80" volumes: - "/data" redis: image: "redis:alpine"
接着可使用如下命令行进行操做:
docker-compose build [options] [SERVICE...] #构建(从新构建)项目中的服务容器 docker-compose up -d # 运行 compose 项目,后台执行
docker-compose up
是个很是强大的命令,它将尝试自动完成包括构建镜像,(从新)建立服务,启动服务,并关联服务相关容器的一系列操做。连接的服务都将会被自动启动,除非已经处于运行状态。能够说,大部分时候均可以直接经过该命令来启动一个项目。
有了上面的基础,接着就能够构建咱们本身的项目了,首先是node
服务的dockerfile
,主要作了以下步骤
npm
包pm2
启动容器FROM node:14.5.0-alpine3.12 # 工做目录 WORKDIR /usr/src/app # 复制配置文件 COPY package*.json ./ COPY process.yml ./ RUN npm set registry https://registry.npm.taobao.org/ \ && npm install pm2 -g \ && npm install # 使用pm2管理 CMD ["pm2-runtime", "process.yml", "--only", "app", "--env", "production"] EXPOSE 3010
接着配置 docker-compose.yml
postgres
,其中数据卷 volumes
映射了数据库目录和初始化脚步node
服务,其中的build
是映射上面dockerfile
所在的目录;depends_on
表示依赖的容器、启动前后,这里先启动db再启动node
;links
表示将db的名称映射到app容器depend_on
于app容器,同时配置转发node
的服务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 #始终重启,生产环境中推荐配置为 always expose: - 5432 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: # host名代替ip配置nginx的转发 - app expose: - 8080
配置完咱们的项目以后,接着就是运行起来
docker-compose up
在咱们的本地开发机是如此,部署到服务器也是如此,你想要部署几台服务器就部署几台,只要装了docker
,都是一句命令行就能解决的事情。
要启动几个容器,修改下docker-compose.yml
的配置,再次docker-compose up
,so easy !