4.4 删除容器
可以使用docker rm命令删除处于终止状态的容器,命令格式为docker rm[OPTIONS]CONTAINER[CONTAINERhttp://www.hzcourse.com/resource/readBook? path=/openresources/teach_ebook/uncompressed/15029/OEBPS/Text/...]。支持的选项包括:
·-f,--force=false强行终止并删除一个运行中的容器。
·-l,--link=false删除容器的连接,但保留容器。
·-v,--volumes=false删除容器挂载的数据卷。
例如,查看处于终止状态的容器并删除如下所示:
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ce554267d7a4 ubuntu:latest "/bin/sh -c 'while t 3 minutes ago Exited (-1) 13 seconds ago determined_pike d58050081fe3 ubuntu:latest "/bin/bash" About an hour ago Exited (0) About an hour ago berserk_brattain e812617b41f6 ubuntu:latest "echo 'hello! I am h 2 hours ago Exited (0) 3 minutes ago $ sudo docker rm ce554267d7a4 $ ce554267d7a4如果要删除一个运行中的容器,可以添加-f参数。Docker会发送SIGKILL信号给容器,终止其中的应用:
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" 2aed76caf8292c7da6d24c3c7f3a81a135af942ed1707a79f85955217d4dd594
$ sudo docker rm 2ae
Error response from daemon: You cannot remove a running container. Stop the container before attempting removal or use -f 2014/11/03 04:05:24 Error: failed to remove one or more containers
$ sudo docker rm -f 2ae
2ae
4.5 导入和导出容器
导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用docker export命令,该命令格式为docker export CONTAINER。
查看所有的容器如下所示:
$ sudo docker ps -a
| CONTAINER ID ce554267d7a4 d58050081fe3 e812617b41f6 | IMAGE | COMMAND |
| ubuntu:latest ubuntu:latest ubuntu:latest |
CREATED STATUS PORTS NAMES
"/bin/sh -c 'while t" 3 minutes ago Exited (-1) 13 seconds ago determined_pike
"/bin/bash" About an hour ago Exited (0) About an hour ago berserk_brattain
"echo 'hello! I am h" 2 hours ago Exited (0) 3 minutes ago silly_leakey
分别导出ce554267d7a4容器和e812617b41f6容器到test_for_run.tar文件和test_for_stop.tar文件:
$ sudo docker export ce5 >test_for_run.tar $ ls
test_for_run.tar
$ sudo docker export e81 >test_for_stop.tar $ ls
test_for_run.tar test_for_stop.tar
可将这些文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移。
导入容器
导出的文件又可以使用docker import命令导入,成为镜像,例如:
$ cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
| REPOSITORY test/ubuntu | TAG v1.0 | IMAGE ID 9d37a6082e97 | CREATED About a minute ago | VIRTUAL SIZE171.3 MB |
读者可能会记得,笔者在之前章节曾介绍过使用docker load命令来导入一个镜像文件。
实际上,既可以使用docker load命令来导入镜像存储文件到本地的镜像库,又可以使用docker import命令来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
4.6 本章小结
容器是直接提供应用服务的组件,也是Docker实现快速的启停和高效服务性能的基础。
通过本章内容的介绍和示例,相信已经掌握了对容器整个生命周期进行管理的各项操作命令。
在生产环境中,因为容器自身的轻量级特性,笔者推荐使用容器时在容器前段引入HA(高可靠性)机制,例如使用HAProxy工具来代理容器访问,这样在容器出现故障时候,可以快速切换到其他容器,还可以自动重启故障容器。
第5章 仓库
仓库(Repository)是集中存放镜像的地方。
一个容易与之混淆的概念是注册服务器(Registry)。实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器地址,ubuntu是仓库名。
仓库又分公共仓库和私有仓库,在本章笔者将分别展示如何使用DockerHub官方仓库进行登录、下载等基本操作,以及使用DockerPool社区提供的仓库下载镜像;最后还将介绍创建和使用私有仓库的基本操作。
5.1 Docker Hub
目前Docker官方维护了一个公共仓库https://hub.docker.com,其中已经包括15000多个的镜像。大部分需求都可以通过在Docker Hub中直接下载镜像来实现,如图5-1所示。
登录
可以通过执行docker login命令来输入用户名、密码和邮箱来完成注册和登录。注册成功后,本地用户目录的.dockercfg中将保存用户的认证信息。
基本操作
用户无需登录即可通过docker search命令来查找官方仓库中的镜像,并利用docker pull命令来将它下载到本地。
在搜寻镜像的章节,已经具体介绍了如何使用docker pull命令。例如以centos为关键词进行搜索:
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 465 [OK]
tianon/centos CentOS 5 and 6, created using rinse insteahttp://www.hzcourse.com/resource/readBook?path=/openresources/teach_ebook/uncompressed/15029/OEBPS/Text/... 28
blalor/centos Bare-bones base CentOS 6.5 image 6 [OK]
saltstack/centos-6-minimal 6 [OK]
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 insteadhttp://www.hzcourse.com/resource/readBook?path=/openresources/teach_ebook/uncompressed/15029/OEBPS/Text/..http://www.hzcourse.co
http://www.hzcourse.com/resource/readBook?path=/openresources/teach_ebook/uncompressed/15029/OEBPS/Text/...
根据是否为官方提供,可将这些镜像资源分为两类。一种是类似centos这样的基础镜像,称为基础或根镜像。这些镜像是由Docker公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名
字。
还有一种类型,比如tianon/centos镜像,它是由DockerHub的用户tianon创建并维护的,带有用户名称为前缀,表明是某用户的某仓库。可以通过用户名称前缀user_name/来指定使用某个用户提供
的镜像,比如tianon用户的镜像前缀为tianon/。
另外,在查找的时候通过-s N参数可以指定仅显示评价为N星以上的镜像。
下载官方centos镜像到本地如下所示:
$ sudo docker pull centos
Pulling repository centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete用户也可以在登录后通过docker push命令来将本地镜像推送到Docker Hub。
自动创建
自动创建(Automated Builds)功能对于需要经常升级镜像内程序来说十分方便。有时候,用户创建了镜像,安装了某个软件,如果软件发布新版本则需要手动更新镜像。
而自动创建功能使得用户通过Docker Hub指定跟踪一个目标网站(目前支持GitHub或BitBucket)上的项目,一旦项目发现新的提交,则自动执行创建。
要配置自动创建,包括如下的步骤:
1)创建并登录Docker Hub,以及目标网站;*在目标网站中连接帐户到Docker Hub。
2)在Docker Hub中配置一个自动创建。
3)选取一个目标网站中的项目(需要含Dockerfile)和分支。
4)指定Dockerfile的位置,并提交创建。
之后,可以在Docker Hub的“自动创建”页面中跟踪每次创建的状态。
5.2 Docker Pool简介
Docker Pool(http://dockerpool.com)是国内专业的Docker技术社区,目前也提供了官方镜像的下载管理服务,如图5-2所示。
查看镜像
访问http://www.dockerpool.com/downloads,即可看到已有的仓库和存储的镜像,包括CentOS、Ubuntu、Java、Mongo、MySQL、Nginx等热门仓库和镜像。
以CentOS仓库为例,其中包括Centos 5、CentOS 6和CentOS 7等镜像。
下载镜像
下载镜像也是使用docker pull命令,但是要在镜像名称前添加注册服务器的具体地址dl.dockerpool.com:5000。
例如,要下载ubuntu仓库的12.04镜像,可以使用:
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04
通过docker images命令来查看下载到本地的镜像:
$ sudo docker images
dl.dockerpool.com:5000/ubuntu 12.04 ae7818fad1bc 1 min ago 116.2 MB
下载后,可以更新镜像的标签,与官方标签保持一致:$ sudo docker tag dl.dockerpool.com:5000/ubuntu:12.04 ubuntu:12.04
需要注意的是,从Docker Pool下载的镜像文件,与官方镜像文件是完全一致的。
另外,阿里云等服务商也已经提供了Docker镜像的下载服务。当然,最便捷的方式还是搭建本地的仓库服务器,将在后续章节予以介绍。
5.3 创建和使用私有仓库
使用registry镜像创建私有仓库
安装Docker后,可以通过官方提供的registry镜像来简单搭建一套本地私有仓库环境:
$ sudo docker run -d -p 5000:5000 registry
这将自动下载并启动一个registry容器,创建本地的私有仓库服务。
默认情况下,会将仓库创建在容器的/tmp/registry目录下。可以通过-v参数来将镜像文件存放在本地的指定路径上。
例如下面的例子将上传的镜像放到/opt/data/registry目录:
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
此时,在本地将启动一个私有仓库服务,监听端口为5000。
管理私有仓库镜像
首先在本书环境的笔记本上(Linux Mint)搭建私有仓库,查看其地址为10.0.2.2:5000。然后在虚拟机系统(Ubuntu 14.04)里测试上传和下载镜像。
在Ubuntu 14.04系统查看已有的镜像:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 days ago 199.3 MB
使用docker tag命令将这个镜像标记为10.0.2.2:5000/test(格式为docker tag IMAGE[:TAG][REGISTRYHOST/][USERNAME/]NAME[:TAG]):
[REGISTRYHOST/][USERNAME/]NAME[:TAG]) :
$ sudo docker tag ubuntu:14.04 10.0.2.2:5000/test
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 ba5877dc9bec 6 days ago 199.3 MB
10.0.2.2:5000/test latest ba5877dc9bec 6 days ago 199.3 MB
使用docker push上传标记的镜像:
$ sudo docker push 10.0.2.2:5000/test
The push refers to a repository [10.0.2.2:5000/test] (len: 1)
Sending image list
Pushing repository 10.0.2.2:5000/test (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 9bad880da3d2 already pushed, skipping
Image 25f11f5fb0cb already pushed, skipping
Image ebc34468f71d already pushed, skipping
Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://10.0.2.2:5000/v1/repositories/test/tags/latest}
用curl查看仓库10.0.2.2:5000中的镜像:
$ curl http://10.0.2.2:5000/v1/search
{"num_results": 1, "query": "", "results": [{"description": "", "name": "library/test"}]}
在结果中可以看到{"description":"", "name":"library/test"},表明镜像已经成功上传了。
现在可以到任意一台能访问到10.0.2.2地址的机器去下载这个镜像了:
$ sudo docker pull 10.0.2.2:5000/test
Pulling repository 10.0.2.2:5000/test
ba5877dc9bec: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25f11f5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
10.0.2.2:5000/test latest ba5877dc9bec 6 days ago 199.3 MB
下载后,还可以添加一个更通用的标签ubuntu:14.04:
$ sudo docker tag 10.0.2.2:5000/test ubuntu:14.04
5.4 本章小结
仓库概念的引入,为Docker镜像文件的分发和管理提供了便捷的途径。本章介绍的DockerHub和DockerPool两个公共仓库服务,可以方便个人用户进行镜像的下载和使用等操作。
在企业的生产环境中,则往往需要使用私有仓库来维护内部镜像。在本书第二部分的实战案例中,将介绍私有仓库的更多配置选项。