docker从入门到精(fang)通(qi)(一)

导语:一篇我自己的docker学习总结,重在基础,如有错误,欢迎各种讨论、建议、批评、指正。

1、docker是什么

docker是一种Linux容器(LXC,即linux container)引擎,它与传统的虚拟化技术的区别在于容器本身不做硬件层级的虚拟化,而是一种操作系统级的虚拟化技术,通过Linux内核的一些特性(namespace、control group)实现容器与容器、容器与宿主机之间的隔离,它是一种半虚拟化技术。
docker的特点有:

  • 拥有独立的根文件系统、存储空间和网络
  • 只能创建Linux容器
  • 极快的启动速度与极低的运行开销
  • 引擎运行的依赖环境非常简单
  • 可将应用及其依赖环境一起打包到容器中

2、docker有什么

在docker官网上有这么几款开源工具:

  • docker engine:基本的完整功能docker包,包含docker引擎和客户端,适用于单台主机
  • docker compose:一个用于一组不同功能容器的docker工具。例如用django搭建一个博客时,需要同时用到nginx容器、mysql容器、redis容器,可以使用docker compose进行统一编排
  • docker registry:私有docker镜像仓库搭建工具,docker中的每一个容器都是从镜像建立的。
  • docker machine:一个帮助我们简化部署docker引擎的工具,可以通过一条命令在各种架构中部署docker
  • docker swarm:一个docker机群的编排调度工具,类似工具还有google出品的kubernetes

docker由哪几部分组成呢?

  • docker 引擎:即docker daemon,docker守护进程,它根据镜像生成容器,运行容器。docker引擎有点像虚拟光驱,iso文件就是docker镜像,而容器就是我们在资源管理器中看到的虚拟光驱加载的光盘
  • docker 客户端:用来向daemon发送指令,这也说明docker是一个C/S架构程序
  • docker 镜像:即docker image,容器产生的图纸和材料。docker的容器镜像是基于一种特殊的层式文件系统,这种方式便于镜像的重复利用与容器回滚,更多信息可以看一下这篇文章还有这一篇
  • docker 仓库:即docker registry,镜像仓库,有docker公司搭建的公有库docker hub,由于速度的问题可以使用国内的一些公共库比如daocloud或者自建私有库,docker的仓库概念与git、github相似
  • docker 容器:即docker container,docker所建立的虚拟化实例,类似传统虚拟化里的虚拟机

3、docker怎么装

安装前的检查

docker依赖条件极少,各平台安装包发行较为完善,安装过程也非常简单。安装之前首先要检查以下先决条件:

  • 安装主机必须是64位CPU架构的机器
  • 操作系统内核为3.8或更高
  • 内核必须支持以下几种存储驱动之一(一篇深入探讨存储驱动的文章)
    • Device Mapper
    • AUFS
    • vfs
    • btrfs
    • ZFS(docker1.7中引入)
    • overlay1或2
      -通常默认驱动是Device Mapper或AUFS
  • 内核必须开启cgroup、namespace功能

docker安装

具体安装ubuntu使用apt-get安装docker-engine包,redhat/centos 6.X中需先添加epel源后使用yum安装docker-io包。
P.S. Ubuntu中如果使用了UFW,需要修改/etc/default/ufw文件中的配置并重新加载:
DEFAULT_FORWARD_POLICY="ACCEPT"(默认是DROP)
$ sudo ufw reload

docker服务器启动

redhat/centos 6.X中:
$ sudo service docker start
redhat/centos 7.X中:
$ sudo systemctl start docker

4、docker怎么玩

启动docker服务器:docker daemon

要想创建运行容器,首先要运行docker守护进程,docker daemon命令在1.16版本开始被dockerd命令代替。以下是一些启动docker守护进程时的可选参数:

$ dockerd --help

Usage:  dockerd COMMAND

A self-sufficient runtime for containers.

Options:
  -b, --bridge string            [指定守护进程使用的网桥接口,默认是docker0] Attach containers to a network bridge
  -D, --debug                    [启用调试模式] Enable debug mode
  -g, --graph string             [设置守护进程运行时根目录] Root of the Docker runtime (default "/var/lib/docker")
  -G, --group string             [设置unix socket的属组] Group for the unix socket (default "docker")
  -H, --host list                [指定守护进程的通信接口,可以是一个unix socket、IP、域名] Daemon socket(s) to connect to (default [])
  -l, --log-level string         [设置日志等级] Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
  -p, --pidfile string           [指定守护进程PID文件地址] Path to use for daemon PID file (default "/var/run/docker.pid")
  -s, --storage-driver string    [设置存储驱动] Storage driver to use
  -v, --version                  [查看docker版本] Print version information and quit

创建并运行一个容器

docker守护进程也启动好了,不管别的,先运行一个容器尝尝:
docker run -i -t ubunt /bin/bash
稍等片刻,我们会发现shell发生了变化:

第一个容器
我们登陆到了ID为ed7751d079c3的容器中,一个基于官方ubuntu镜像的容器已经摆在面前。可以像操作一个ubuntu虚拟机那样折腾这个容器了。

那么这个命令运行过程中发生了什么?

  • docker在本地查找名为ubuntu的镜像,没找到
  • 由于未指明tag,docker将会从docker hub拉取ubuntu:latest这个镜像,latest就是默认的tag,最新版
  • 然后我们经过漫长的等待(有可能)会看到几行乱码后面跟着Pull complete,镜像就下载完了。这其中每一行实际上是镜像的每一层,乱码是每一层的ID,这一层又一层实际上从Dockerfile(用于创建镜像的文件)生成的。Dockerfile怎么玩?以后再写。。。
  • 镜像有了docker开始创建容器,-i表示打开容器的STDIN,-t分配一个伪tty终端,然后运行bash shell

docker命令

docker从1.13开始对现有的40多个顶级命令进行组织整理,形成一组管理命令,让用户使用和理解命令更方便更容易。
现有管理命令如下:

  container   Manage containers(容器管理)
  image       Manage images(镜像管理)
  network     Manage networks(docker内部网络管理)
  node        Manage Swarm nodes(swarm节点管理)
  plugin      Manage plugins(插件管理)
  secret      Manage Docker secrets(密钥管理)
  service     Manage services(docker 服务管理,负责
  让运行在docker中的应用保持一个理想可用的状态。此处理解不到位,待深入)
  stack       Manage Docker stacks(docker捆绑包管理,即docker compose创建的一组容器。此处理解不到位,待深入)
  swarm       Manage Swarm(Swarm集群管理)
  system      Manage Docker(docker服务器管理)
  volume      Manage volumes(卷管理)

管理命令展开

1.容器命令:docker container

该命令包括与docker容器相关的操作
docker container attach|commit|cp|create|diff|exec|export|inspect|kill|logs|ls| pause|port|prune|rename|restart|rm|run|start|stats|stop|top|unpause|update|wait
常用子命令如下:

  ls          列出容器
  logs        获取容器日志
  inspect     显示容器详细信息
  diff        显示容器变化(A-add 新增,C-change 改变,D-delete 删除)
  stats       实时显示容器的物理资源资源占用情况
  top         显示容器中正在运行的进程
  port        列出容器与宿主机所有端口映射
  exec        在一个正在运行的容器中执行一条命令
  attach      连接至容器的stdout、stdin、stderr
  cp          在容器用宿主机之间复制文件
  create      从镜像创建一个新容器
  run         新建一个容器并执行一条命令
  rm          删除容器
  prune       删除所有停止容器
  rename      重命名一个容器
  start       启动容器
  stop        停止容器(发送SIGTERM后再发送SIGKILL)
  restart     重启容器
  kill        强行停止容器(直接发送SIGKILL)
  pause       使用cgroup的freezer顺序挂起/解挂容器中所有进程
  unpause     解除容器挂起
  update      更新容器自身的配置参数(如容器CPU、内存的分配参数等)
  commit      将容器的变化创建为一个新的镜像(就是把在容器内执行的一些命令写到一个新的镜像层商)
  export      将容器导出为镜像,生成一个tar包(export导出的镜像会丢失镜像层结构,无法回滚)
  wait        阻塞指定容器直到容器停止,并返回退出码

2、镜像命令:docker image

该命令包括与docker镜像相关的操作
docker image build|history|import|inspect|load|ls|prune|pull|push|rm|save|tag
常用子命令如下:

  build       从Dockerfile创建一个镜像
  history     显示一个镜像的创建历史
  inspect     显示镜像详细信息
  ls          列出本地镜像
  prune       删除所有没有使用的镜像
  pull        从仓库拉去一个镜像(默认是从docker hub)
  push        向仓库上传一个镜像(默认是从docker hub)
  rm          删除一个镜像
  save        将镜像导出,如果不指定文件,将直接输出至STDOUT
  load        对应docker image save,将save导出的tar包导入成镜像,或者从STDIN直接输入
  import      对应docker container export,将export导出的tar包导入成镜像
  tag         为镜像添加TAG,便于镜像管理

补充一个命令:
docker search [OPTIONS] TERM
该命令用于搜索仓库中的镜像(默认还是在docker hub中搜索)。

3、docker服务器命令:docker system

该命令包括整个docker的一些相关操作
docker system df|events|info|prune
常用子命令有:

  df          显示本机docker占用的硬盘空间,包括镜像、容器还有卷
  events      实时显示docker服务器的事件
  info        显示整个docker服务器信息,比如容器数量,镜像数量等等等等
  prune       删除所有没有使用的数据,比如停止的容器,没用到的镜像等待

4、还有一些顶级命令。。。。

这个我也不知道是啥的东西已经被我写成一个纯粹的命令堆叠了。。。无所谓了。。。。当成是个命令查询手册吧。。。
docker login|logout|search
这三个命令没有对应的管理命令子命令,其实就是docker仓库的登陆、注销、查询(默认当然还是对docker hub的),其他的顶级命令都有对应的管理命令子命令。

剩下的管理命令子命令诸如volume、network、stack、service之类的怎么不介绍?看多了你也吐,写多了我也恶心。当然最重要的是我还没研究明白。以上这些对于docker最基本使用已经足够了,可以折腾一会了。

下一期,我写一下docker的一些简单的使用场景,以及怎么写dockerfile然后创建镜像并运行容器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,506评论 15 147
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,377评论 0 27
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,468评论 0 120
  • 七八岁光景,最是调皮时。 一有假期,爸妈就要往乡下送。城里人忙,管不住。城里太井然有序,怕惹事。 乡下的橘子树,春...
    麦克不姓麦阅读 692评论 0 1
  • 所谓管理者并不只是那些主管、经理、被统称为领导的高级管理人员,作为平凡人,只要是从事知识性工作,用行动和决策来提高...
    老牛痞阅读 658评论 0 0