做者简介:koala,专一完整的 Node.js 技术栈分享,从 JavaScript 到 Node.js,再到后端数据库,祝您成为优秀的高级 Node.js 工程师。【程序员成长指北】做者,Github 博客开源项目 github.com/koala-codin…javascript
关于 Docker 的概念是确实不太好总结,下面我经过四点向你说明 Docker 究竟是个什么东西。html
看一张 Docker 架构图java
左边大框框是咱们进行 Docker 操做的宿主机,其运行了一个 Docker daemon 的核心守护程序,负责构建、运行和分发 Docker 容器。node
在宿主机中安装了 Docker 客户端,其与 Docker daemon 守护进程进行通讯,客户端会将 build、pull、run 等命令发送到 Docker daemon 守护进程进行执行。linux
右框框为 Docker 注册表存储 Docker 镜像,是一个全部 Docker 用户共享 Docker 镜像的服务,Docker daemon 守护进程与之进行交互。nginx
下面是对架构中基本组成说明,比较详细,你们看的时候能够对着架构图看。概念这个东西,你看下就好,怎么记都记不住的,只有你经常使用的东西才会记住和想着去记住它,看完本文,能够把下面的应用实践一遍。git
镜像仓库,存储大量镜像,能够从镜像仓库拉取和推送镜像。程序员
相似虚拟机快照,从仓库拉取,或者在现有工具镜像上建立新镜像。经过镜像能够启动容器。github
从镜像中建立应用环境,以单进程的方式运行。对外公开服务。是一种短暂的和一次性的环境。mongodb
数据卷能够完成数据持久化,数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,能够提供不少有用的特性:
Docker 容器之间的网络交互,可使用端口映射
的方式,其余容器能够直接经过端口实现。除该方式外还有一个容器链接(linking)系统
也能够达到容器交互。(本文中 node 链接 mongodb 使用的是端口映射的方式)
关于Docker 网络模块,容器链接详情推荐这篇文章: Docker的网络模式详解
使用 Koa2
初始化一个 Node
项目,经过 Mongose
中间件 链接 Mogodb
数据库,实现一个基础接口 Mogodb
插入数据。 项目地址:github.com/koala-codin…
首先在项目根目录下建立 .dockerignore 文件,把不须要打包进 Docker Image 里的文件进行过滤
# /usr/src/nodejs/dockerstudy/.dockerignore
.git
node_modules
复制代码
在项目的根目录中建立 Dockerfile
文件(Dockerfile 这里重点讲一下)
部署 Node项目
的时候,会有一个 Dockerfile
文件配置
# /usr/src/nodejs/hello-docker/Dockerfile
FROM node:10.0
# 在容器中建立一个目录
RUN mkdir -p /usr/src/nodejs/
# 定位到容器的工做目录
WORKDIR /usr/src/nodejs/
# RUN/COPY 是分层的,package.json 提早,只要没修改,就不会从新安装包
COPY package.json /usr/src/app/package.json
RUN cd /usr/src/app/
RUN npm i
# 把当前目录下的全部文件拷贝到 Image 的 /usr/src/nodejs/ 目录下
COPY . /usr/src/nodejs/
EXPOSE 3000
CMD npm start
复制代码
配置参数说明( DockerFile 学习):
FROM:FROM 是构建镜像的基础源镜像,该 Image 文件继承官方的 node image。
详细说明:Dockerfile 中 FROM 是必备的指令,而且必须是第一条指令! 它引入一个镜像做为咱们要构建镜像的基础层,就好像咱们首先要安装好操做系统,才能够在操做系统上面安装软件同样。
RUN:后面跟的是在容器中要执行的命令。
详细说明:每个 RUN
指令都会新创建一层,在其上执行这些命令,咱们频繁使用 RUN
指令会建立大量镜像层,然而 Union FS
是有最大层数限制的,不能超过 127
层,并且咱们应该把每一层中我用文件清除,好比一些没用的依赖,来防止镜像臃肿。
WORKDIR:容器的工做目录
COPY:拷贝文件至容器的工做目录下,.dockerignore 指定的文件不会拷贝
EXPOSE:将容器内的某个端口导出供外部访问
CMD:Dockerfile 执行写一个 CMD 不然后面的会被覆盖,CMD 后面的命令是容器每次启动执行的命令,多个命令之间可使用 && 连接,例如 CMD git pull && npm start
详细说明:CMD
指令用来在启动容器的时候,指定默认的容器主进程的启动命令和参数。 它有两种形式
CMD echo 1
CMD ["npm", "run", "test"] 必须是双引号
复制代码
第一种执行的命令会被包装程,CMD [ "sh", "-c", "echo 1" ] JSON
数组形式,通常推荐 JSON
数组形式。 容器中的应用都应该之前台执行,而不是启动后台服务,容器内没有后台服务的概念。 对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义。 好比 CMD service nginx start
它等同于 CMD [ "sh", "-c", "service nginx start"]
主进程其实是 sh
,sh
也就结束了,sh
做为主进程退出了。
ENV(补充)
ENV
指令用来设置环境变量,它有两种形式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
复制代码
定义了环境变量,那么在后续的指令中,就可使用这个环境变量。
代码环节暂且告一段落,将带有 Dockerfile 提交到 github 或 gitlab等。
以个人服务器 centos7
为例,已安装好 Docker
。
首先检出代码,把项目克隆到指定目录
git clone https://github.com/koala-coding/dockerstudy
复制代码
进入目录构建
cd dockerstudy
docker build -t dockerstudy .
复制代码
build
命令用来制做镜像,-t
是给镜像打标签,-f
参数是指定Dockerfile
路径,因为咱们使用的是默认Dockerfile
名称,因此能够不一样填写该参数。最后一个.
也不要省略,表示Dockerfile
文件的所在目录, 表明是当前路径,它指定镜像构建的上下文。咱们刚才说过,真正制做镜像的是docker server
,当咱们执行build
命令时,docker client
会将上下文路径下的全部内容打包,而后上传给docker server
。这样当咱们要在 Dockerfile 文件中执行 如COPY
指令,就能够将上下文中的文件复制到镜像中去了。
构建目标名称 dockerstudy,是一个镜像,能够经过 docker images 来列出全部的镜像。
通常应该会将 Dockerfile
置于一个空目录下,或者项目根目录下。若是该目录下没有所需文件,那么应该把所需文件复制一份过来。若是目录下有些东西确实不但愿构建时传给 Docker
引擎,那么能够用.gitignore
同样的语法写一个 .dockerignore
。
经过镜像 dockerstudy
建立一个容器并运行。
docker run --name dockerstudycontainer -d -p 3000:3000 dockerstudy
复制代码
说明:建立的容器名称是 dockerstudycontainer
,你能够理解为 pid
,这个名称惟一,建立以后若是不删除会一直存在。-p 用来指定端口映射,将容器的端口
3000映射到主机
3000`端口上,这样就可外部访问了。
此时在宿主机中可使用curl
测试服务器提供的服务是否正常
curl localhost:3000
复制代码
或者能够直接在浏览器中请求接口看一下输出
建立容器后,有时候须要看一下容器资源占用,使用docker stats
docker stats dockerstudycontainer
复制代码
若是是购买的阿里云或者腾讯云服务器,注意这里将本身购买的 centos 服务器
3000
端口开放,在安全组
进入容器
docker ls -a 查看全部容器,包括当前容器的id
docker exec -it <id> bash
复制代码
日志检查 查看运行日志,“50425b8f2ef3” 为容器 ID
$ docker logs -f 50425b8f2ef3
复制代码
可是到了这里我还有个问题,那我真想看日志文件的时候,也不能每一个容器进去看日志,好浪费时间啊!有没有什么更高的方式?我会在下一篇文章《线上环境如何优雅的打印,保存,分析日志》中写到。
docker pull mongo
复制代码
建立一个docker容器
docker run -p 27017:27017 -v /data/db --name docker_mongodb -d mongo
复制代码
在上面的命令中,几个命令参数的详细解释以下:
-p
参数主动将容器内部端口给暴漏出来,将服务器的 27017
端口映射到容器的 27017
端口,这样在外网就可经过 服务器的 27017
端口访问到咱们的服务,Mongodb 默认端口为 27017
。最终访问的仍是本机的端口)测试链接容器中的 Mongodb
以上是 MongoDB 容器建立后的信息。 接下来,咱们使用 Robo 3T 图形界面软件尝试打开数据库。 打开 RoBo 3T,选择新建链接,按照下图填入相关数据库信息,保存。
注意其中的权限认证。链接数据库时候可能失败,会出现问题,这时候注意一个问题,安全组问题,须要把安全组中的
27017
的 Mongodb 数据库端口打开
Compose 是 Docker 官方开源的一个项目,能够管理多个 Docker 容器组成一个应用,例如 Web 服务,除了服务自己还有数据库、Redis、Nginx 等一系列相关联服务须要安装。
有个 Compose 的支持,咱们只须要定义一个 YAML 格式的配置文件(docker-compose.yml),来编写一个项目所须要的多个容器配置及调用关系,经过简单的命令便可同时开始或者关闭这些容器。Compose 定位是定义和运行多个 Docker 容器的应用。在这篇文章中不具体讲 DockerCompose 使用,主要讲清楚 Docker 基本架构各部分的应用,多实践下哦!
环境隔离('隔离,安全')
Docker 实现了资源隔离,一台机器运行多个容器互无影响。
更高效的资源利用(节约成本)
Docker 容器的运行不须要额外的虚拟化管理程序的支持,它是内核级的虚拟化,能够实现更高的性能,同时对资源的额外需求很低。
更快速的交付部署(敏捷)
使用 Docker,开发人员能够利用镜像快速构建一套标准的研发环境,开发完成后,测试和运维人员能够直接经过使用相同的环境来部署代码。
更易迁移扩展(可移植性)
Docker 容器几乎能够在任意的平台上运行,包括虚拟机、公有云、私有云、我的电脑、服务器等,这种兼容性让用户能够在不一样平台之间轻松的迁移应用。
更简单的更新管理(高效)
使用 Dockerfile,只须要不多的配置修改,就能够替代以往大量的更新工做。而且全部修改都是以增量的方式进行分发和更新,从而实现自动化和高效的容器管理。
docker pull [镜像名称:版本] 拉取镜像
docker images 镜像列表
docker rmi [镜像名称:版本] 删除镜像
docker history [镜像名称] 镜像操做记录
docker tag [镜像名称:版本][新镜像名称:新版本]
docker inspect [镜像名称:版本] 查看镜像详细
docker search [关键字] 搜索镜像
docker login 镜像登录
复制代码
docker ps -a 容器列表(全部容器)
docker ps 查看全部(运行的)容器
docker exec -ti <id> bash 以 bash 命令进入容器内
docker run -ti --name [容器名称][镜像名称:版本] bash 启动容器并进入
docker logs 查看容器日志
docker top <container_id> 查看容器最近的一个进程
docker run -ti --name [容器名称] -p 8080:80 [镜像名称:版本] bash 端口映射
docker rm <container_id> 删除容器
docker stop <container_id> 中止容器
docker start <container_id> 开启容器
docker restart <container_id> 重启容器
docker inspect <container_id> 查看容器详情
docker commit [容器名称] my_image:v1.0 容器提交为新的镜像
复制代码
在上面实战中已经详细讲解,能够返回看,这里就再也不重复写。
读完本文后,你应该掌握了 Docker 的基本使用,对 Docker 这个概念不那么陌生了,而且知道了它的应用场景,能够本身实践下,这个过程也会出现不少问题的,实践才能更好的记住那些知识以及经常使用命令。