Docker(二)之基础操作

云计算

  • 一种资源的服务模式,该模式可以实现随时随地,便捷按需地从可配置计算资源共享池中获取所需的资源,资源能够快速供应并释放,大大减少了资源管理工作的开销;

经典的云计算架构

{% asset_img cloud-layer.png %}

  • IaaS: Infrastructure as a Service,基础设施即服务;
  • PaaS: Platform as a Service,平台即服务;
  • SaaS: Software as a Service,软件即服务;

为什么要使用Docker?

  • Docker是基于LXC的高级容器引擎,使用GO语言开发并遵从Apache 2.0开源协议;

  • Docker封装整个软件运行时环境,它提供了一个简单, 轻量的建模方式,使开发生命周期更高效快速,鼓励了面向服务的架构设计,用于构建,发布和运行分布式应用的平台,它是一个跨平台,可移植并且实现轻量级操作系统虚拟化的解决方案;

  • Docker的基础是LXC等技术,在LXC的基础上Docker进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便;

  • Docker简化了CI(持续集成)与CD(持续交付)的构建流程;

  • 容器技术与传统虚拟机性能对比:

{% asset_img docker-1.png %}

  • Docker与虚拟机构建对比:

{% asset_img docker-2.png %}

  • Docker容器本质上是宿主机上的一个进程,Docker通过namespace实现了资源隔离;
  • 通过cgroups实现了资源的限制,通过写时复制机制copy-on-write实现了高效的文件操作;
  • Docker有五个命名空间:进程、网络、挂载、宿主和共享内存,为了隔离有问题的应用,运用Namespace将进程隔离,为进程或进程组创建已隔离的运行空间,为进程提供不同的命名空间视图;这样,每一个隔离出来的进程组,对外就表现为一个container

镜像(image)

  • Docker镜像就是一个只读的模板,镜像可以用来创建Docker容器;Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用;
  • 镜像是一种文件结构,Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上;

容器(container)

  • 容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除;每个容器都是相互隔离的、保证安全的平台;
  • 我们可以把容器看做是一个简易版的Linux环境,Docker利用容器来运行应用,镜像是只读的,容器在启动的时候创建一层可写层作为最上层;

仓库(repository)

  • 仓库是集中存放镜像文件的场所,仓库注册服务器Registry上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签tag
  • 目前,最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载;
  • 仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。
  • Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务;

Docker的主要操作

{% asset_img docker-3.png %}

获取帮助信息

  • 格式:docker --help
  • 获取子命令的帮助信息:
    • 格式一:docker help ps
    • 格式二:docker ps --help

获取Docker运行的环境信息

  • 格式:docker info

获取Docker的版本信息

  • 格式一:docker version
  • 格式二:docker -v

获取本地的镜像

  • 格式:docker images [OPTION] [REGISTRY[:TAG]]
  • 选项:
    • -a:获取所有镜像,默认隐藏中间层的镜像;
    • -q:仅获取镜像的ID值;
    • --digests:显示镜像摘要;

检索镜像

  • 格式:docker search [OPTION] NAME
  • 选项:
    • --limit NUM:定义搜索到的最大结果数,默认为25
    • -f, --filter FILTER:根据提供的条件过滤输出;
      • 根据镜像点赞次数过滤:docker search -f stars=6 centos

拉取镜像

  • 格式:docker pull [OPTION] NAME[:TAG]
  • 选项:
    • -a:拉取指定镜像的所有TAG,而非默认的latest
    • --disable-content-trust:跳过镜像验证,默认为True

推送镜像

  • 格式:docker push [OPTION] NAME[:TAG]
  • 选项:
    • --disable-content-trust:跳过镜像签名,默认为True

删除镜像

  • 格式:docker rmi [OPTION] IMAGE [IMAGE ...]
  • 选项:
    • -f:强制删除镜像,若已有容器基于该镜像构建,默认无法删除该镜像;
    • --no-prune:不删除未加标签的上一层;

存储镜像

  • 格式:docker save [OPTIONS] IMAGE [IMAGE ...]

  • 选项:

    • -o:指定输出的归档名,而不是STDOUT
  • 示例:

    • ubuntu镜像存为归档:
    1
    
    $ docker save -o ubuntu_14.04.tar ubuntu:14.04
    

加载镜像

  • 格式:docker load [OPTION]

  • 选项:

    • -i NAME:指定要加载的镜像归档;
    • -q, --quiet:静默加载,抑制加载进度;
  • 示例:

    • 将归档加载到本地镜像:
    1
    
    $ docker load -i ubuntu_14.04.tar
    

为镜像设置新的标签

  • 格式:docker tag OLDIMAGE[:TAG] NEWIMAGE[:TAG]

使用Dockerfile构建镜像

  • 格式:docker build [OPTIONS] PATH|URL|-
  • 选项:
    • -t TAG:为镜像设置标签;
    • -q, --quiet:静默构建,抑制构建输出,并打印成功的镜像ID
    • --no-cache:构建过程中不使用缓存;

获取本地的容器

  • 格式:docker ps [OPTION]
  • 选项:
    • -a:获取所有的容器,默认仅显示运行中的容器;
    • -q, --quiet:仅获取容器的ID值;

创建容器

  • 格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
  • 选项:
    • -i, --interactive:使用交互模式,始终保持输入流STDIN开放;
    • -t, --tty:分配一个伪终端,一般与-i选项配合使用;
    • -v, --volume:用于挂载一个volume,可以使用多个-v同时挂载多个volume
    • --volumes-from:用于挂载一个数据卷容器,可以使用多个--volumes-from同时挂载多个数据卷容器;
    • -p, --publish:用于将容器的端口与宿主机的端口之间形成映射;
    • --name NAME:指定启动容器的名称,默认为指定随机名称;
    • --rm:当容器退出时,删除它;
    • --hostname:指定容器的hostname
    • -w, --workdir:指定容器的工作目录;
  • 选项格式:
    • -v[host-dir]:[container-dir]:[rw|ro]
    • -p[host-port]:[container-port]
    • --volumes-fromvalue
    • -wpath

运行容器

  • 格式:docker run [OPTION] IMAGE [COMMAND] [ARG ...]

  • 选项:

    • -i, --interactive:使用交互模式,始终保持输入流STDIN开放;
    • -t, --tty:分配一个伪终端,一般与-i选项配合使用;
    • -d, --detach:在后台运行容器并打印容器的ID
    • -v, --volume:用于挂载一个volume,可以使用多个-v同时挂载多个volume
    • -p, --publish:用于将容器的端口与宿主机的端口之间形成映射;
    • --name NAME:指定启动容器的名称,默认为指定随机名称;
    • -w, --workdir:指定容器的工作目录;
  • 选项格式:

    • -v[host-dir]:[container-dir]:[rw|ro]
    • -p[host-port]:[container-port]
    • -wpath
  • 示例:

    • 运行hello-world容器:
    1
    
    $ docker run hello-word
    
    • 运行ubuntu容器并分配伪终端:
    1
    
    $ docker run -it ubuntu /bin/bash
    

连接容器

  • 格式:docker attach [OPTIONS] CONTAINER
  • 不建议使用,建议使用docker exec -it

启动容器

  • 格式:docker start [OPTIONS] CONTAINER [CONTAINER ...]

停止容器

  • 格式:docker stop [OPTIONS] CONTAINER [CONTAINER ...]

重启容器

  • 格式:docker restart [OPTIONS] CONTAINER [CONTAINER ...]

终止容器

  • 格式:docker kill [OPTIONS] CONTAINER [CONTAINER...]

获取容器的日志

  • 格式:docker logs [OPTION] CONTAINER
  • 选项:
    • -f:跟随日志尾部,实时输出;
    • -t:为每一条日志加上时间戳;
    • --details:获取详细的日志信息;

获取容器的进程

  • 格式:docker top CONTAINER

获取容器的端口配置

  • 格式:docker port CONTAINER [PORT]

获取对容器文件系统的更改

  • 格式:docker diff CONTAINER
  • 状态:
    • A:已添加的文件;
    • D:已删除的文件;
    • C:已更改的文件;

删除容器

  • 格式:docker rm [OPTIONS] CONTAINER [CONTAINER ...]
  • 选项:
    • -f, --force:强制删除正在运行的容器;
    • -l, --link:删除与容器关联的链接;
    • -v, --volumes:删除与容器关联的volumes

从容器中复制文件到宿主机

  • 格式:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

在1个正在运行的容器中执行1条命令

  • 格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG ...]

  • 选项:

    • -d, --detach:分离模式,在后台运行命令;
    • -i, --interactive:使用交互模式,始终保持输入流STDIN开放;
    • -t, --tty:分配一个伪终端,一般与-i选项配合使用;
    • -w, --workdir:指定容器的工作目录;
  • 示例:

    • 连接容器:
    1
    
    $ docker exec -it centos /bin/bash
    

导出容器快照至本地文件

  • 格式:docker export [OPTIONS] CONTAINER
  • 选项:
    • -o:指定输出的镜像归档名;

导入容器快照至本地镜像

  • 格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

  • 示例:

    • 从远程URL导入:
    1
    
    $ docker import http://example.com/exampleimage.tgz
    
    • 从本地文件导入(通过pipeSTDIN):
    1
    
    $ cat exampleimage.tgz | docker import - exampleimagelocal:new
    
    • 从本地文件导入(通过归档文件):
    1
    
    $ docker import /path/to/exampleimage.tgz
    

获取镜像或容器的详细信息

  • 格式:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]

  • 选项:

    • -f:获取指定内容;
  • 示例:

    • 获取镜像的Architecture架构信息:
    1
    
    $ docker inspect -f {{".Architecture"}} [ID | NAME]
    
    • 获取容器的IP地址信息:
    1
    
    $ docker inspect -f {{".NetworkSettings.IPAddress"}} [ID | NAME]
    

小技巧

  • 停止本地所有的正在运行的容器:
1
$ docker stop $(docker ps -q)
  • 删除本地所有的容器:
1
$ docker rm $(docker ps -aq)
  • 删除本地所有的镜像:
1
$ docker rmi -f $(docker images -q)

快捷键

  • Ctrl + P, Ctrl + Q:退出交互式但不结束容器;