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发生了变化:

docker从入门到精(fang)通(qi)(一)_第1张图片
第一个容器
我们登陆到了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然后创建镜像并运行容器。

你可能感兴趣的:(docker从入门到精(fang)通(qi)(一))