Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发起者是dotCloud公司。Docker自开源后受到普遍的关注和讨论,目前已有多个相关项目(包括Docker三剑客、Kubernetes等),逐渐造成了围绕Docker容器的生态体系。php
Docker的构想是要实现“Build,Ship and Run Any App,Anywhere”,即经过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件“一次封装,处处运行”的目的。这里的应用组件,既能够是一个 Web应用、一个编译环境,也能够是一套数据库平台服务,甚至是一个操做系统或集群。nginx
简单地讲,读者能够将Docker容器理解为一种轻量级的沙盒(sandbox)。每一个容器内运行着一个应用,不一样的容器相互隔离,容器之间也能够经过网络互相通讯。容器的建立和中止都十分快速,几乎跟建立和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。不少时候,甚至直接把容器看成应用自己也没有任何问题.web
经过容器来打包应用,解耦应用和运行平台。意味着迁移的时候,只须要在新的服务器上启动须要的容器就能够了,不管新旧服务器是不是同一类型的平台。这无疑将节约大量的宝贵时间,并下降部署过程出现问题的风险。docker
Docker在开发和运维过程当中,具备以下几个方面的优点:数据库
本章首先介绍Docker的三大核心概念。ubuntu
Docker的大部分操做都围绕着它的三大核心概念——镜像、容器和仓库而展开。所以,准确把握这三大核心概念对于掌握Docker技术尤其重要。bash
Docker镜像相似于虚拟机镜像,能够将它理解为一个只读的模板。例如,一个镜像能够包含一个基本的操做系统环境,里面仅安装了Apache应用程序(或用户须要的其余软件)。能够把它称为一个Apache镜像。镜像是建立Docker容器的基础。经过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来建立和更新现有的镜像,用户甚至能够从网上下载一个已经作好的应用镜像,并直接使用。服务器
Docker容器相似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像建立的应用运行实例。能够将其启动、开始、中止、删除,而这些容器都是彼此相互隔离的、互不可见的。能够把容器看作是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。网络
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层建立一个可写层。架构
Docker仓库相似于代码仓库,它是Docker集中存放镜像文件的场所。有时候会看到有资料将Docker仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器是存放仓库的地方,其上每每存放着多个仓库。每一个仓库集中存放某一类镜像,每每包括多个镜像文件,经过不一样的标签(tag)来进行区分。例如存放Ubuntu操做系统镜像的仓库称为Ubuntu仓库,其中可能包括14.0四、12.04等不一样版本的镜像。仓库注册服务器的示例如图2-1所示。
根据所存储的镜像公开分享与否,Docker仓库能够分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。国内很多云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,能够提供稳定的国内访问。
固然,用户若是不但愿公开分享本身的镜像文件,Docker也支持用户在本地网络内建立一个只能本身访问的私有仓库。当用户建立了本身的镜像以后就可使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另一台机器上使用该镜像时,只须要将其从仓库上pull下来就能够了。
镜像(image)是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键词。
Docker运行容器前须要本地存在对应的镜像,若是镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也能够经过配置,使用自定义的镜像仓库。本章将介绍围绕镜像这一核心概念的具体操做,包括如何使用pull命令从
Docker Hub仓库中下载镜像到本地,如何查看本地已有的镜像信息和管理镜像标签,如何在远端仓库使用search命令进行搜索和过滤,如何删除镜像标签和镜像文件,如何建立用户定制的镜像而且保存为外部文件。最后,还介绍如何往Docker Hub仓库中推送本身的镜像。
镜像是运行容器的前提,官方的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
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
在列出的信息中,能够看到如下几个字段信息。
其中镜像的ID信息十分重要,它惟一标识了镜像。在使用镜像ID的时候,通常可使用该ID的前若干个字符组成的可区分串来替代完整的ID。
TAG信息用来标记来自同一个仓库的不一样镜像。例如ubuntu仓库中有多个镜像,经过TAG信息来区分发行版本,包括10.0四、12.0四、12.十、13.0四、14.0四、16.04等标签。
镜像大小信息只是表示该镜像的逻辑体积大小,实际上因为相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像的逻辑体积之和。
为了方便在后续工做中使用特定镜像,还可使用docker tag命令来为本地镜像任意添加新的标签。例如添加一个新的myubuntu: latest镜像标签:
$ docker tag ubuntu:latest myubuntu:latest
使用docker inspect命令能够获取该镜像的详细信息,包括制做者、适应
架构、各层的数字摘要等
$ docker inspect ubuntu:14.04
返回的是一个JSON格式的消息,若是咱们只要其中一项内容时,可使用参数-f来指定,例如,获取镜像的Architecture:
$ docker inspect -f {{".Architecture"}} amd64
使用docker search命令能够搜索远端仓库中␀享的镜像,默认搜索官方仓库中的镜像。用法为docker search TERM,支持的参数主要包括:
$ 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]
使用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
当使用docker rmi命令,而且后面跟上镜像的ID(也能够是能进行区分的部分ID串前缀)时,会先尝试删除全部指向该镜像的标签,而后删除该镜像文件自己。
注意,当有该镜像建立的容器存在时,镜像文件默认是没法被删除的,例如,先利用ubuntu:14.04镜像建立一个简单的容器来输出一段话
$ docker run ubuntu:14.04 echo 'hello! I am here!' hello! I am here!
建立镜像的方法主要有三种:基于已有镜像的容器建立、基于本地模板导入、基于Dockerfile建立。
本节将重点介绍前两种方法。最后一种基于Dockerfile建立的方法将在后续章节专门予以详细介绍。
该方法主要是使用docker commit命令。命令格式为docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]
,主要选项包括:
$ 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
用户可使用docker save和docker load命令来存出和载入镜像。
若是要导出镜像到本地文件,可使用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文件将该镜像分享给他人。
可使用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:
第一次上传时,会提示输入登陆信息或进行注册.
容器是镜像的一个运行实例。所不一样的是,镜像是静态的只读文件,而容器带有运行时须要的可写文件层,同时,容器中的应用进程处于运行状态.
命令:create start run wait logs
可使用 docker [container] create命令新建一个容器
$ docker create -it ubuntu:latest af8f4f922dafee22c8fe6cd2aelld16e250 7d61flblfa55b36e94db7ef45178
docker [container] start
所须要的命令主要为 docker [container ]run,等价于先执行 docker [container]
create 命令,再执行 docker [container] start 命令
更多的时候,须要让 Docker 容器在后台以守护态( Daemonized )形式运行 此时,能够
经过添加-d 参数来实现
例如,下面的命令会在后台运行容器
$ docker -d ubuntu /bin/ sh -c "while true; do echo hello world; sleep l; done ” ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846
$ docker logs ce554267d7a4 hello world
命令:pause/unpause stop prune
可使用 docker [container] pause CONTAINER [CONTAINER … ]命令来暂停一个运行中的容器;
例如,启动一个容器,并将其暂停:
$ docker run --name test --rm -it ubuntu bash $ docker pause test $ docker ps
可使用 docker [container] stop 来终止一个运行中的容器 该命令的格式为
docker [container] stop [-t | --time[=10]] [CONTAINER ...]
若是须要进入容器进行操做,推荐使用官方的 attach/exec 命令
attach Dock 自带的命令,命令格式为:
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
--detach-keys[=[]]:指定退出 attach 模式的快捷键序列, --no-stdin=true|false :是否关闭标准输入, --sig-proxy=true|false :是否代理收到的系统信号给应用进程,默认为 true
…
docker [container] rm
命令格式为
docker [container) rm [-f|--force) [-1|--link] [-v|--volumes] CONTAINER [CONTAINER ...]
docker [container] export [-o|--output [=""]] CONTAINER
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]
命令:inspect top stats
查看容器详情可使用
docker container inspect [OPTIONS] CONTAINER [CONTAINER…]子命令
$ docker container inspect test
用 docker [container] top [OPTIONS] CONTAINER [CONTAINER…]子命令
$ docker top test
docker [container] stats [OPTIONS] [CONTAINER … ]
命令:cp diff port update
container cp 命令支持在容器和主机之间复制文件 命令格式为 docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
container diff 看容器内文件系统的变动 命令格式为 docker [container] diff CONTAINER
container port 命令能够查看容器的端口映射’状况 命令格式为 docker container
port CONTAINER [PRIVATE_PORT[/PROTO]] 。
例如,查看 test 容器的端口映射状况:
$ docker container port test 9000/tcp - > o.o o 0:9000
container update 命令能够更新容器的一些运行时配置,主要是一些资源限制份额
命令格式为:
docker [container] update [OPTIONS] CONTAINER [CONTAINER...]
…
来源:docker技术入门与实战