相关文章html
最近公司在推动容器化和k8s,项目都要改为Docker部署。负责的工程里有几个node项目,只能从零开始学习Docker了。前端
Docker支持window, Mac, Linux, 教程参考Docker安装教程。node
建议在Mac和Linux系统里使用Docker。git
平时开发,我使用的是vscode编辑器,能够顺便安装docker插件。在插件商店搜索docker
,安装完成后,咱们能够很方便的管理Docker镜像和容器。docker
首先咱们来体验一下Docker。npm
平时工做中,若是咱们电脑的开发环境是Windows, 有一天但愿在Linux环境作一些事情,那该怎么办?(没有云服务器的前提下)大多数人这时会选择去用虚拟机安装一个ubuntu系统。不过安装虚拟机前,你得先去下载几个G的镜像,而后在VMware里配置一些参数,最后还要等待最少十几分钟的系统安装。等你安装完一个ubuntu系统,估计已经浪费了几个小时。ubuntu
然而使用Docker,你只须要几分钟!bash
# 拉取ubuntu镜像 docker pull ubuntu # 建立一个ubuntu容器而且使用终端进行交互 docker run -it --name my-ubuntu --rm ubuntu /bin/bash 复制代码
建立成功后,你就进入一个ubuntu系统里,如今你能够在其中进行任意的操做了。服务器
注意:虽然当前容器里是ubuntu系统,可是你只能把它想象成一个精简版的ubuntu,所以有不少经常使用命令,须要本身去安装。markdown
curl -v bilibili.com
复制代码
直接运行curl
命令会提示命令不存在
# 安装curl apt-get update apt-get install -y curl 复制代码
安装完成后,才能使用curl
命令
退出容器
exit 复制代码
ubuntu
镜像,node
镜像。我的镜像则是由我的开发者构建上传。ubuntu
镜像并不能和咱们进行各类交互,咱们但愿有个环境能运行ubuntu
,因而基于ubuntu
镜像建立了一个容器。咱们能够这样类比:
# 下载源代码 git clone deepred5/app # 启动app npm run start 复制代码
# 拉取镜像 docker pull deepred5/app # 建立容器 docker run deepred5/app 复制代码
Docker是基于c/s架构:咱们在Client中执行Docker命令,最后建立的Container和Image则会在Server中运行
# 能够查看server和client信息 docker info 复制代码
经常使用命令
# 查找镜像 docker search ubuntu # 拉取特定tag版本的镜像(默认是latest) docker pull ubuntu:18.0.4 # 查看下载的全部本地镜像 docker images # 删除镜像 docker rmi ubuntu:18.0.4 复制代码
构建镜像
咱们通常都是基于基础镜像来构建我的镜像。镜像是由一条条指令构建出来(Dockerfile)
咱们来构建一个node-pm2
镜像,这个镜像自带node和pm2:
建立一个node-pm2
目录,并新建一个Dockerfile
文件
mkdir node-pm2 cd node-pm2 touch Dockerfile 复制代码
编辑Dockerfile
# 基于node11基础镜像 FROM node:11 # 一些元数据,好比做者信息 LABEL maintainer="deepred5 <deepred5@gamil.com>" # 安装pm2 RUN npm install pm2 -g --registry=https://registry.npm.taobao.org # 暴露容器的端口 EXPOSE 80 443 复制代码
基于这个Dockerfile
建立咱们本身的镜像deepred5/node-pm2
docker build -t deepred5/node-pm2:1.0 .
复制代码
注意最后有一个.
查看咱们本身的镜像
# 能够看到deepred5/node-pm2镜像了 docker images 复制代码
基于deepred5/node-pm2
镜像启动一个容器
docker run -it deepred5/node-pm2:1.0 /bin/bash
复制代码
进入容器后,咱们运行pm2 -v
,能够看见pm2已经安装成功了
上传镜像
咱们本地构建的镜像若是但愿能够被其余人使用,就须要把镜像上传到仓库。登陆dockerhub,注册一个帐户。
# 登入帐户,输入用户名和密码 docker login # 上传镜像 docker push deepred5/node-pm2:1.0 复制代码
注意:deepred5/node-pm2
改为你的用户名/node-pm2
,你须要从新构建一个你的用户名/node-pm2
的镜像,而后才能上传到dockerhub
咱们平时基本都是在和容器打交道。
# 基于ubuntu镜像建立my-ubuntu容器。若是本地没有ubuntu镜像,会先去docker pull下载 docker run -it ubuntu:latest --name my-ubuntu /bin/bash 复制代码
参数解释:
-i
: 容许你对容器内的标准输入 (STDIN) 进行交互
-t
: 在新容器内指定一个伪终端或终端。
--name
: 容器的名字,默认是随机的名字
/bin/bash
: 启动容器后当即执行的命令
# 中止容器 docker stop my-ubuntu # 启动容器 docker start my-ubuntu # 删除容器 docker rm my-ubuntu # 删除全部容器 docker rm `docker ps -aq` 复制代码
# 查看正在运行的容器 docker ps # 查看全部建立过的容器(运行或者关闭) docker ps -a 复制代码
docker start my-ubuntu
启动的容器,虽然容器运行着,可是咱们没法进入到容器里。
如何再次进入到容器里?
docker exec -it my-ubuntu /bin/bash 复制代码
容器运行的两种方式
能够这样类比:
node index.js
: 交互式运行
pm2 start index.js
: 守护式运行
大部分状况都是运行守护式容器(daemonized container)
# 启动了容器,而后容器当即关闭 docker run ubuntu /bin/bash # 启动了容器,并开启了交互式的终端,只有输入exit才退出终端,退出终端后,容器仍然在后台运行 docker run -it ubuntu /bin/bash # 启动了容器,而且在后台一直运行,每隔1s输出hello world docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 复制代码
查看容器日志
docker run -d --name my_container ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 复制代码
# 查看后台运行的日志 docker logs my_container # 实时监控(相似tail -f) docker logs -f my_container # 获取最后10行 docker logs --tail 10 my_container # 实时查看最近的日志 docker logs --tail 0 -f my_container # 加上时间戳 docker logs -t my_container 复制代码