写给前端工程师看的Docker教程-基础篇

相关文章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
复制代码

基本概念

  1. 镜像(Image):相似于虚拟机中的镜像。镜像有两种:基础镜像和我的镜像。基础镜像由各大厂商提供,好比ubuntu镜像,node镜像。我的镜像则是由我的开发者构建上传。
  2. 容器(Container):相似于一个轻量级的沙盒。容器是基于镜像来建立的,ubuntu镜像并不能和咱们进行各类交互,咱们但愿有个环境能运行ubuntu,因而基于ubuntu镜像建立了一个容器。
  3. 仓库(Repository):相似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。

咱们能够这样类比:

# 下载源代码
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
复制代码

镜像(Image)

经常使用命令

# 查找镜像
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

容器(Container)

咱们平时基本都是在和容器打交道。

# 基于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
复制代码

容器运行的两种方式

  • 交互式运行(-it)
  • 守护式运行(没有交互式会话,长期运行,适合运行应用程序和服务)(-d)

能够这样类比:

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
复制代码

参考

相关文章
相关标签/搜索