Docker学习(2):介绍

1.1 什么是Docker

1.Docker开源项目背景

Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到广泛的关注和讨论,目前已有多个相关项目(包括Docker三剑客、Kubernetes等),逐渐形成了围绕Docker容器的生态体系。

Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组件,既可以是一个 Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。

简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止都十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题.

1.2 为什么要使用Docker

1.Docker容器虚拟化的好处

通过容器来打包应用,解耦应用和运行平台。意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

2.Docker在开发和运维中的优势

Docker在开发和运维过程中,具有如下几个方面的优势:

  • 更快的交付和部署。使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,测试和运维人员可以直接使用完全相同环境来部署代码。只要开发测试过的代码,就可以确保在生产环境无缝运行。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,整个过程全程可见,使团队更容易理解应用的创建和工作过程。
  • 更高效的资源利用。Docker容器的运行不需要额外的虚拟化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。跟传统虚拟机方
    式相比,要提高一到两个数量级。
  • 更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等,同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。
  • 更简单的更新管理。使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。

3.Docker与虚拟机比较

在这里插入图片描述

第2章 核心概念与安装配置

本章首先介绍Docker的三大核心概念。

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)
    只有理解了这三个核心概念,才能顺利地理解Docker容器的整个生命周期。

2.1 核心概念

Docker的大部分操作都围绕着它的三大核心概念——镜像、容器和仓库而展开。因此,准确把握这三大核心概念对于掌握Docker技术尤为重要。

1.Docker镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

2.Docker容器

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

3.Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。有时候会看到有资料将Docker仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库称为Ubuntu仓库,其中可能包括14.04、12.04等不同版本的镜像。仓库注册服务器的示例如图2-1所示。

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
当然,用户如果不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

第3章 使用Docker镜像

镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。
Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。本章将介绍围绕镜像这一核心概念的具体操作,包括如何使用pull命令从
Docker Hub仓库中下载镜像到本地,如何查看本地已有的镜像信息和管理镜像标签,如何在远端仓库使用search命令进行搜索和过滤,如何删除镜像标签和镜像文件,如何创建用户定制的镜像并且保存为外部文件。最后,还介绍如何往Docker Hub仓库中推送自己的镜像。

3.1 获取镜像

镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。
可以使用docker pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker pull NAME[:TAG]。其中,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。
例如,获取一个Ubuntu 14.04系统的基础镜像可以使用如下的命令:

14.04: Pulling from library/ubuntu
6c953ac5d795: Pull complete
3eed5ff20a90: Pull complete
f8419ea7c1b5: Pull complete
51900bc9e720: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:97421885f3da3b23f52eeddcaa9f8f91172a8ac3cd5d3cd40b51c7aad09f66cc
Status: Downloaded newer image for ubuntu:14.04

对于Docker镜像来说,如果不显式指定TAG,则默认会选择 latest标签,这会下载仓库中最新版本的镜像。

下载过程中可以看出,镜像文件一般由若干层(layer)组成,6c953ac5d795这样的串是层的唯一id(实际上完整的 id包括256比特,由64个十六进制字符组成)。使用docker pull命令下载时会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储层的一份内容,减小了需要的存储空间。

pull子命令支持的选项主要包括:-a,--all-tags=true|false:是否获取仓库中的所有镜像,默认为否。
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用,执行ping localhost命令:

$ docker run -it ubuntu:14.04 bash
root@9c74026df12a:/# ping localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.018 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.018/0.033/0.058/0.017 ms
root@9c74026df12a:/# exit
exit

3.2 查看镜像信息

1.使用images命令列出镜像
使用docker images命令可以列出本地主机上已有镜像的基本信息。
例如,下面的命令列出了上一小节中下载的镜像信息:

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 2fa927b5cdd3 2 weeks ago 122 MB
ubuntu latest 2fa927b5cdd3 2 weeks ago 122 MB
ubuntu 14.04 8f1bd21bd25c 2 weeks ago 188 MB

在列出的信息中,可以看到以下几个字段信息。

  • 来自于哪个仓库,比如ubuntu仓库用来保存ubuntu系列的基础镜像;
  • 镜像的标签信息,比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容;
  • 镜像的ID(唯一标识镜像),如ubuntu:latest和ubuntu:16.04镜像的ID都是2fa927b5cdd3,说明它们目前实际上指向同一个镜像;
  • 创建时间,说明镜像最后的更新时间;
  • 镜像大小,优秀的镜像往往体积都较小。

其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的ID。
TAG信息用来标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,包括10.04、12.04、12.10、13.04、14.04、16.04等标签。

镜像大小信息只是表示该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。

2.使用tag命令添加镜像标签

为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意添加新的标签。例如添加一个新的myubuntu: latest镜像标签:

$ docker tag ubuntu:latest myubuntu:latest

3.使用inspect命令查看详细信息

使用docker inspect命令可以获取该镜像的详细信息,包括制作者、适应
架构、各层的数字摘要等

$ docker inspect ubuntu:14.04

返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture:

$ docker inspect -f {{".Architecture"}}
amd64

3.3 搜寻镜像

使用docker search命令可以搜索远端仓库中␀享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括:

  • –automated=true|false:仅显示自动创建的镜像,默认为否;
  • –no-trunc=true|false:输出信息不截断显示,默认为否;
  • -s,–stars=X:指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。
    例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,如下所示:
$ docker search --automated -s 3 nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 670 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 206 [OK]
million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK]
maxexcloo/nginx-php Docker framework container with Nginx and ... 57 [OK]
webdevops/php-nginx Nginx with PHP-FPM 38 [OK]
h3nrik/nginx-ldap NGINX web server with LDAP/AD, SSL and pro... 27 [OK]
bitnami/nginx Bitnami nginx Docker Image 18 [OK]
maxexcloo/nginx Docker framework container with Nginx inst... 7 [OK]
million12/nginx Nginx: extensible, nicely tuned for better... 4 [OK]
webdevops/nginx Nginx container 3 [OK]
ixbox/nginx Nginx on Alpine Linux. 3 [OK]
evild/alpine-nginx Minimalistic Docker image with Nginx 3 [OK]

3.4 删除镜像

1.使用标签删除镜像

使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE[IMAGE...],其中IMAGE可以为标签或ID。
例如,要删除掉myubuntu: latest镜像,可以使用如下命令:

$ docker rmi myubuntu:latest
Untagged: myubuntu:latest

读者可能会担心,本地的ubuntu:latest镜像是否会受此命令的影响。无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像2fa927b5cdd3的一个标签而已。

但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。
例如删除标签为ubuntu:14.04的镜像,由于该镜像没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有层:

$ docker rmi ubuntu:14.04
Untagged: ubuntu:14.04
Deleted: sha256:8f1bd21bd25c3fb1d4b00b7936a73a0664f932e11406c48a0ef19d82fd0b7342
Deleted: sha256:8ea3b9ba4dd9d448d1ca3ca7afa8989d033532c11050f5e129d267be8de9c1b4
Deleted: sha256:7db5fb90eb6ffb6b5418f76dde5f685601fad200a8f4698432ebf8ba80757576
Deleted: sha256:19a7e879151723856fb640449481c65c55fc9e186405dd74ae6919f88eccce75
Deleted: sha256:c357a3f74f16f61c2cc78dbb0ae1ff8c8f4fa79be9388db38a87c7d8010b2fe4
Deleted: sha256:a7e1c363defb1f80633f3688e945754fc4c8f1543f07114befb5e0175d569f4c

2.使用镜像ID删除镜像

当使用docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如,先利用ubuntu:14.04镜像创建一个简单的容器来输出一段话

$ docker run ubuntu:14.04 echo 'hello! I am here!'
hello! I am here!

3.5 创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
本节将重点介绍前两种方法。最后一种基于Dockerfile创建的方法将在后续章节专门予以详细介绍。

1.基于已有镜像的容器创建

该方法主要是使用docker commit命令。命令格式为docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]],主要选项包括:

  • -a,–author="":作者信息;
  • -c,–change=[]:提交的时候执行 Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m,–message="":提交消息;
  • -p,–pause=true:提交时暂停容器运行。
    下面将演示如何使用该命令创建一个新镜像。首先,启动一个镜像,并在其中进行修改操作,例如创建一个test文件,之后退出:
$ docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

记住容器的ID为a925cb40b3f0。
此时该容器跟原ubuntu:14.04镜像相比,已经发生了改变,可以使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:

$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27

顺利的话,会返回新创建的镜像的ID信息,例如9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27。
此时查看本地镜像列表,会发现新创建的镜像已经存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test 0.1 9e9c814023bc 4 seconds ago 188 MB

2.基于本地模板导入
用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用dockerimport命令。命令格式为docker import[OPTIONS]file|URL|-[REPOSITORY[:TAG]]。
要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ模板的下载地址为 http://openvz.org/Download/templates/precreated。
例如,下载了ubuntu-14.04的模板压缩包,之后使用以下命令导入:

$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

然后查看新导入的镜像,会发现它已经在本地存在了:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB

3.6 存出和载入镜像

用户可以使用docker save和docker load命令来存出和载入镜像。

1.存出镜像

如果要导出镜像到本地文件,可以使用docker save命令。例如,导出本地的ubuntu:14.04镜像为文件ubuntu_14.04.tar,如下所示:

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 8f1bd21bd25c 2 weeks ago 188 MB
...
$ docker save -o ubuntu_14.04.tar ubuntu:14.04

之后,用户就可以通过复制ubuntu_14.04.tar文件将该镜像分享给他人。

2.载入镜像

可以使用docker load将导出的tar文件再导入到本地镜像库,例如从文件ubuntu_14.04.tar导入镜像到本地镜像列表,如下所示:

$ docker load --input ubuntu_14.04.tar

$ docker load < ubuntu_14.04.tar

这将导入镜像及其相关的元数据信息(包括标签等)。导入成功后,可以使用docker images命令进行查看。

3.7 上传镜像
可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方
仓库(需要登录)。命令格式为:

docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

用户在Docker Hub网站注册后可以上传自制的镜像。例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push命令上传镜像:

$ docker tag test:latest user/test:latest
$ docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push:
Username:
Password:
Email:

第一次上传时,会提示输入登录信息或进行注册.

第4章 操作Docker容器

第5章 访问Docker仓库


来源:docker技术入门与实战

猜你喜欢

转载自blog.csdn.net/ShelleyLittlehero/article/details/83410310