最近在学习 Docker,并用 Docker 从新部署了cdfang-spider项目,使用 docker 后确实大幅度地下降了部署难度。若是你也想用 Docker 来部署本身的项目,那就让咱们一块儿往下看。node
本文经过如下 3 个方面来聊聊 Docker:git
在好久之前,发布一个 App 应用,应该是这样的。首先购买一台物理服务器,而后手动安装对应的操做系统,搭建 App 应用运行环境,部署 App 应用,最后才能被其余人访问。这样作看似没毛病,但可能会形成几个问题:github
部署很是慢。web
成本很是高。docker
资源浪费。shell
难于迁移和扩展。npm
为了解决物理设备的诸多问题,出现了虚拟机。虚拟机出现以后大大地下降了部署难度,要想部署一个应用程序,新建一个虚拟机就能够了,还能够根据应用程序的大小,分配合适的系统资源。服务器
虚拟技术有如下几个特色:网络
虚拟化技术实现了物理层的隔离,但却还有如下问题:架构
为了更方便的部署项目,出现了容器化技术,主要有如下几个特色:
Docker 是容器化技术的一种,也是最流行的一个。Docker 提供了一种隔离机制,它将不一样应用程序的依赖项和库打包在一块儿,运行在不一样的容器中,从而实现应用层的隔离。
容器化技术大都是基于 Linux 内核提供的两个机制:Cgroups(实现资源按需分配)和 Namespace(实现任务隔离)。
虚拟化和容器化都是目前主流的的部署技术,二者之间的差异以下:
Docker 的核心是在 Docker Engine 层实现应用层的隔离。
Docker 分层 |
---|
Application(应用层) |
Container(容器层) |
Docker Engine (隔离层) |
Host OS 操做系统 |
infrastructure(基础设施) |
Docker 分为 Client 和 Server 两个部分,咱们在 Client 中执行 Docker 命令,最后建立的 Container 和 Image 则会在 Server 中运行。Dcoker 架构以下图所示:
Image 主要用来打包应用程序以及它的依赖环境,为 Container 提供必要的环境以及安装好的应用程序。Image 自己并不能执行,只能经过 Container 去运行。
Image 主要有如下几点特征:
Image 能够经过 Dockerfile 去构建,也能够经过 DockerHub 上去拉取。
Container 是运行 Image 的实例,经过 docker run image
便可启动并运行一个 Container。
Container 主要有如下几点特征:
使用 Dcoker 部署项目经常会生成不少个容器,这些容器默认只能经过 ip 地址进行访问,但新建一个容器所产生的 ip 地址是不可控的,这就给容器之间通讯带来了必定的麻烦。Docker 中使用 Network 来管理容器之间的通讯,只要两个 Conteiner 处于同一个 Network 之中,就能够经过容器名去互相通讯。
Docker 中内置 5 中类型的 Network :
除了这 5 中 Network 以外,用户也能够自定义编写 Network Plugin。
Docker Compose 是一个工具,这个工具能够经过一个 yml 文件定义多容器的 Docker 应用。经过一条命令就能够根据 yml 文件的定义去建立或者管理多个容器。接下来分别使用命令行和 Docker Compose 的方式来对比一下建立容器的方式。
docker pull yhlben/cdfang-spider docker pull mongo docker network create webapp-network docker run -d --network webapp-network -v ~/data/db:/data/db mongo docker run -p 8082:8082 --network webapp-network -d yhlben/cdfang-spider
可见,手动建立容器,须要在命令行中手动执行不少命令,这些命令一旦敲错了,就得重来,不便于容器的管理。
一、新建 docker-compose.yml 文件。
version: '3.7' services: database: image: mongo restart: always volumes: - ~/data/db:/data/db networks: - webapp-network web: image: yhlben/cdfang-spider depends_on: - database ports: - 8082:8082 networks: - webapp-network networks: webapp-network: driver: bridge
二、运行 docker-compose
docker-compose up -d
可见,使用 Docker Compose 建立容器只须要提早编写好 yml 文件,而后执行一条命令就好了,比起手动敲命令,更加方便。
除此以外,Docker Compose 还可使用 docker-compose -scale
扩展多个相容的容器,用来实现负载均衡,能够扩容,也能够减容。例如:实现无缝部署项目,先扩容一个新的 Container,当 Container 启动完毕后,加入到集群中,而后更新老容器,更新完后再加入集群中。
Docker Compose 的配置文件通常定义在 docker-compose.yml
文件中,主要的配置项以下:
services
docker run
,能够给 service 指定 network 和 volume 的引用。networks
docker network create xxxx
。volumes
docker volume create xxx
。更多配置项能够参考官方文档 compose-file
接下来以 cdfang-spider 项目为例,使用 Docker 部署项目。
一、编写 Dockerfile 文件。
# 加载基础镜像 FROM node # 注释 LABEL maintainer = "yhlben <yinhengliben@gmail.com>" # 建立工做目录 RUN rm -rf /app RUN mkdir /app WORKDIR /app # 安装项目依赖 COPY . /app RUN npm install RUN npm run build RUN mv ./dist/* ./ # 对外暴露端口 EXPOSE 8082 # 启动 Image 时执行命令 CMD BUILD_ENV=docker node app.js
二、经过 Dockerfile 文件构建 Image。
docker build -t yhlben/cdfang-spider .
三、拉取 mongo 官方 Image。
docker pull mongo
四、建立 network,让两个容器能够相互通讯。
docker network create webapp-network
五、运行容器
docker run -d --network webapp-network -v ~/data/db:/data/db mongo docker run -p 8082:8082 --network webapp-network -d yhlben/cdfang-spider
六、经过访问 localhost:8082 访问项目。
一、编写 Dockerfile 文件。
# 加载基础镜像 FROM node # 注释 LABEL maintainer = "yhlben <yinhengliben@gmail.com>" # 建立工做目录 RUN rm -rf /app RUN mkdir /app WORKDIR /app # 安装项目依赖 COPY . /app RUN npm install RUN npm run build RUN mv ./dist/* ./ # 对外暴露端口 EXPOSE 8082 # 启动 Image 时执行命令 CMD BUILD_ENV=docker node app.js
二、在 dockerHub 上受权 github 项目,这样当 github 项目有更新时,会自动执行 Dockerfile 进行构建,并将构建结果保存到 dockerHub 仓库中。
三、编写 docker-compose.yml 文件。
version: '3.7' services: database: image: mongo restart: always volumes: - ~/data/db:/data/db networks: - webapp-network web: image: yhlben/cdfang-spider depends_on: - database ports: - 8082:8082 networks: - webapp-network networks: webapp-network: driver: bridge
四、一键启动,确保已安装 docker-compose。
docker-compose up -d
五、经过访问 localhost:8082 访问项目。
经过 Docker 部署完项目后,感觉很不错,主要分如下几点:
最后,附上项目源码地址:cdfang-spider
本项目使用单机部署,即全部的容器都在同一台服务器上。除此以外,docker 还支持分布式容器部署,可使用 docker swarm 或者 kubernetes 来管理,目前还在学习中,争取早日整理好分享给你们,感谢你们支持!