Docker镜像由文件系统叠加组成。最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有什么交互。实际上,当一个容器启动后,它将会被移到内存中,而引导文件系统则会被卸载(unmount),以留出更多的内存供initrd磁盘镜像使用。
rootfs可以是一种或多种操作系统(如Debian或者Ubuntu文件系统)。
传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,它会被切换为读写模式。但是Docker中root文件只会是只读模式,并且Docker利用联合加载技术会在root文件系统上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。
Dcoker将这样的文件系统称为镜像。一个镜像可以放到另一镜像的顶部。位于下面的镜像称为父镜像,可以以此类推,直到镜像栈的最底部,最底部的镜像称为基础基础镜像。最后,当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个读写层中执行的。
当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。比如想修改一个文件,这个文件首先会从该读写层下面的只读层复制到该读写层。该文件的只读版本依然存在,但是已被读写层中的该文件副本所隐藏。
栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器是可以修改的,他们都有自己的状态,并且是可以启动和停止的。容器的这种特点加上镜像分层框架,使我们可以快速构建镜像并运行包含我们自己应用程序和服务容器。
一、获取镜像
可以使用docker pull命令从网络上下载镜像。命令格式docker pull NAME[:TAG]。如果不指定TAG,默认选择latest标签,即下载仓库中最新版本的镜像。
[root@localhost ~]# sudo docker pull centos
下载特定版本的镜像:
[root@localhost ~]# sudo docker pull ubuntu:14.04
从其他服务器的仓库下载镜像:
[root@localhost ~]# sudo docker pull dl.dockerpool.com:5000/ubuntu
二、查看镜像
1、使用docker images命令列出本地所有镜像:
[root@localhost ~]# sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 4.0 6580d037abd5 47 hours ago 598.1 MB
mytomcat 3.0 54607a3a5195 2 days ago 516.8 MB
centos 7 561b424305df 2 weeks ago 434.5 MB
ouruser/sinatra v2 57fd9b213d64 2 weeks ago 452.9 MB
REPOSITORY:来自于哪个库;
TAG:镜像的标签信息;
IMAGE ID:镜像的ID号(唯一);
CREATED:创建时间;
SIZE:镜像大小;
var/lib/docker/containers目录下面看到所有的容器。
2、使用docker tag命令为本地镜像添加新的标签:
[root@localhost ~]# sudo docker tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:14.04
3、使用docker inspect命令可以获取镜像的详细信息:
[root@localhost ~]# sudo docker inspect 6580d037abd5
[
{
"Id": "sha256:6580d037abd5100c6e84e176fb8f27e32d9e4d8184fd1c21dbe35898da5ab2ce",
"RepoTags": [
"mytomcat:4.0"
],
"RepoDigests": [],
"Parent": "sha256:54607a3a51959cabec991991130f52c241a65f46e9d5eea4b503f0a414d5cde1",
"Comment": "",
"Created": "2017-10-25T05:59:46.393076408Z",
"Container": "a81547038c2da62cf5d8e357a82d306525d3fc5910100c292d87fd22e58cda7b",
"ContainerConfig": {
"Hostname": "a81547038c2d",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "mytomcat:3.0",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"build-date": "20170911",
"license": "GPLv2",
"name": "CentOS Base Image",
"vendor": "CentOS"
}
},
"DockerVersion": "1.12.6",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"build-date": "20170911",
"license": "GPLv2",
"name": "CentOS Base Image",
"vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 598118717,
"VirtualSize": 598118717,
"GraphDriver": {
"Name": "devicemapper",
"Data": {
"DeviceId": "35",
"DeviceName": "docker-253:1-2373897-832dbc49d7740bdf8ba5bab881e2192e7e20eb1165e6755204fc1cdd9c55f7e7",
"DeviceSize": "10737418240"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:cf516324493c00941ac20020801553e87ed24c564fb3f269409ad138945948d4",
"sha256:7085e133a3ca53dc3524cbcc098b1124b2028f02ae8416e4ae3fade58c50eeb7",
"sha256:53db44f0a26cf7e66046c51480503e5e3d5f7fc3a5d077205866edc87e9e693b",
"sha256:029cf7363934ffd781469d672a46eeac626c156c884479f50ef73e0bc6f87198",
"sha256:39ba7093c1cf096732962c9435f66e7b253bef027430b8e1ecb4eda1f0e9dec0"
]
}
}
]
docker inspect命令返回的是一个JSON格式的消息,只查看其中一项内容,可以使用-f参数来指定:
[root@localhost ~]# sudo docker inspect -f {{".Architecture"}} 6580d037abd5
amd64
三、搜索镜像
使用docker search命令可以搜索远端仓库中的镜像,默认搜索Docker Hub官方仓库中的镜像。使用docker search TERM,支持参数包括:
--automated=false仅显示自动创建的镜像。
--no-trunc=false输出信息不截断显示。
--s, --starts=0指定仅显示评价为指定星级以上的镜像。
[root@localhost ~]# sudo docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 3744 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 103 [OK]
docker.io docker.io/jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x8... 88 [OK]
docker.io docker.io/tutum/centos Simple CentOS docker image with SSH access 33
docker.io docker.io/imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 31 [OK]
docker.io docker.io/gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 21
返回数据项包括镜像名称、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。
四、删除镜像
IMAGE...],其中IMAGE可以为标签或ID。
[root@localhost ~]# sudo docker rmi docker.io/training/sinatra
Untagged: docker.io/training/sinatra:latest
Untagged: docker.io/training/sinatra@sha256:03fc0cd265cbc28723e4efd446f9f2f37b4790cf9cc12f1b9203c79fb86b6772
注意,当有用该镜像创建的容器存在时,需要先删除镜像创建的容器,再删除镜像。可以使用-f来强制删除该镜像,但是不建议使用这种方式来强制删除。
[root@localhost ~]# sudo docker rmi -f docker.io/training/sinatra
五、创建镜像
创建镜像有三种方法:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
1、基于已有镜像的容器创建
使用docker commit命令,其命令格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],包括:
-a,--author="" 作者信息
-m,--message="" 提交信息
-p, --pause=true 提交时暂停容器运行
[root@localhost ~]# sudo docker commit -m "add a file" -a "test" 6580d037abd5 test
2、基于本地模板导入
可以直接从一个操作系统模板文件导入一个镜像。可以到https://openvz.org/Download/template/precreated下载镜像模板,下载后将镜像模板上传到宿主机,可以使用以下命令导入:
[root@localhost ~]# sudo cat centos-7-x86_64.tar.gz |docker import - centos:7
六、导出和载入镜像
使用docker save和docker load命令来存出和载入镜像。
1、存出镜像
[root@localhost ~]# sudo docker save -o centos_7.tar centos:7
2、载入镜像
[root@localhost ~]# sudo docker load --input centos_7.tar
或
[root@localhost ~]# sudo docker load < centos_7.tar
七、上传镜像
使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录),命令格式docker push NAME[:TAG]。
需要在DockerHub网站注册后,才可以上传镜像。