1、镜像是什么?
一个分层存储的文件
一个软件的环境
一个镜像可以创建N个容器
一种标准化的交付
一个不包含linux内核而又精简的linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>查看镜像中各层内容及大小,
每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/中。
搜索镜像:
[root@linux-node1 ~]# docker search nginx
下载镜像
[root@linux-node1 ~]# docker pull nginx
镜像从哪里来?
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
地址:https://hub.docker.com/explore
配置镜像加速器:https://www.daocloud.io/mirrorcurl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
#配置加速器:
[root@linux-node1 ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
[root@linux-node1 ~]# cat /etc/docker/daemon.json #查看配置结果
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
[root@linux-node1 ~]# systemctl restart docker.service #配置完成后重启
[root@linux-node1 ~]# docker pull centos #下载一个镜像测一下速度
2、镜像与容器联系
Writable Container
Add Apache Image
Add Emacs Image
Debian Base Image
bootfs
kernel
容器其实是在镜像的最上面加了一层读写层,在运行容器里文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像
查看本地已有镜像:
[root@linux-node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 02256cfb0e4b 31 hours ago 109MB
centos latest 1e1148e4cc2c 3 weeks ago 202MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
创建一个容器nginx后台启动:
[root@linux-node1 ~]# docker run -itd nginx
创建一个docker容器默认会从宿主机挂载/resolv.conf /hostname /hosts 这三个文件:
[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep resolv.conf
"ResolvConfPath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/resolv.conf",
[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep hostname
"HostnamePath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/hostname",
[root@linux-node1 ~]# docker inspect 47cb511b8faf|grep hosts
"HostsPath": "/var/lib/docker/containers/47cb511b8fafa6c8fceba82198c12c9eaae19dd699995d422d9f55efaed4e704/hosts",
容器存储对应宿主机的位置:
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6-init/diff:/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff:/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
"MergedDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/merged",
"UpperDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/diff",
"WorkDir": "/var/lib/docker/overlay2/0b747104a0a8deaef8824f23cc1b57a2d2ad501e8e56d1fbbff0a61645e340c6/work"
},
3、管理镜像常用命令
ls ————列出镜像
build ————构建镜像来自Dockerfile
histiry ————查看镜像历史
inspect ————显示一个或多个镜像详细信息
pull ————从镜像仓库拉取镜像
push ————推送一个镜像到镜像仓库
rm ————移除一个或多个镜像
prune ————移除未使用的镜像。没有被标记或被任何容器引用的
tag ————创建一个引用源镜像标记目的镜像
export ————导出容器文件系统到tar归档文件
import ————导入容器文件系统tar归档文件创建镜像
save ————保存一个或多个镜像到一个tar归档文件
load ————加载镜像来自tar归档或标准输入
例子:
[root@linux-node1 ~]# docker image ls #列出镜像(新的方式)
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 02256cfb0e4b 6 days ago 109MB
centos latest 1e1148e4cc2c 3 weeks ago 202MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
[root@linux-node1 ~]# docker images #列出镜像(老的方式)
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 02256cfb0e4b 6 days ago 109MB
centos latest 1e1148e4cc2c 3 weeks ago 202MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
[root@linux-node1 ~]# docker image inspect nginx:latest #显示镜像信息
[
{
"Id": "sha256:02256cfb0e4bd19bdb74a077cee8ab26dd14d2e54402878a848e172a85a5cec7",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:726ad789543f7ecededeba6b68147d86aff5d33f9b5c7ddeef0340a389d2f465"
],
"Parent": "",
"Comment": "",
"Created": "2018-12-26T23:20:18.874449006Z",
"Container": "38acc26b719d83b9a8895e34c3241ffb4e7b242037398cb495dacbd87f6e98cd",
"ContainerConfig": {
"Hostname": "38acc26b719d",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"ArgsEscaped": true,
"Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"ArgsEscaped": true,
"Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 109169260,
"VirtualSize": 109169260,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
"MergedDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/merged",
"UpperDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff",
"WorkDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
"sha256:2978900fe42b72766df5e07855abd2bb46bbf6c2f12453fbd8e7dc313ab63978",
"sha256:3c0285ad7db909a5658daa2f52817b4bc2a344ece95800e965f80e0a1ae547ea"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
[root@linux-node1 ~]# docker inspect nginx #显示镜像信息
[
{
"Id": "sha256:02256cfb0e4bd19bdb74a077cee8ab26dd14d2e54402878a848e172a85a5cec7",
"RepoTags": [
"nginx:latest"
],
"RepoDigests": [
"nginx@sha256:726ad789543f7ecededeba6b68147d86aff5d33f9b5c7ddeef0340a389d2f465"
],
"Parent": "",
"Comment": "",
"Created": "2018-12-26T23:20:18.874449006Z",
"Container": "38acc26b719d83b9a8895e34c3241ffb4e7b242037398cb495dacbd87f6e98cd",
"ContainerConfig": {
"Hostname": "38acc26b719d",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"ArgsEscaped": true,
"Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.15.8-1~stretch",
"NJS_VERSION=1.15.8.0.2.7-1~stretch"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"ArgsEscaped": true,
"Image": "sha256:86e6b30c0d2583dd451dd10582dd644cda524e5f1aac743fa3d8efb896f271be",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 109169260,
"VirtualSize": 109169260,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/c9d822f8a4c8219b2b34b594f407bf247bde13299e03a05bd7a0fd0f9dde0317/diff:/var/lib/docker/overlay2/e667dae3d4a0983ebabed19877230ee897748c70575849fa2ea5845c0b5edcf2/diff",
"MergedDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/merged",
"UpperDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/diff",
"WorkDir": "/var/lib/docker/overlay2/e32a7bca511ccdabcb99b6218f89e9d5e86609d15b2ee5b08034686c59a9ec79/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3",
"sha256:2978900fe42b72766df5e07855abd2bb46bbf6c2f12453fbd8e7dc313ab63978",
"sha256:3c0285ad7db909a5658daa2f52817b4bc2a344ece95800e965f80e0a1ae547ea"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
[root@linux-node1 ~]# docker pull nginx:1.14 #下载一个nginx1.14镜像
1.14: Pulling from library/nginx
177e7ef0df69: Pull complete
132d4353ecd5: Pull complete
9482632c8a8f: Pull complete
Digest: sha256:dbdb714212692aec98c262add7f3f3eddc170ea47cd493d0403145c09c302c31
Status: Downloaded newer image for nginx:1.14
[root@linux-node1 ~]# docker image rm nginx:1.14 #删除nginx:1.14镜像
Untagged: nginx:1.14
Untagged: nginx@sha256:dbdb714212692aec98c262add7f3f3eddc170ea47cd493d0403145c09c302c31
Deleted: sha256:3f55d5bb33f3ae6e7f232c82f3bc09f2aa8029d9d213bf69324c95ac1cb9d7ae
Deleted: sha256:d178dd6080618d71e1b85319821b265d20c422511f59f58f4ad84d6341a497a2
Deleted: sha256:2784880ce5781d29eed1af54c19774de0f6fabd3d63db6e0bd2103d4febedbc0
Deleted: sha256:7b4e562e58dcb7fbe1e27bb274f0ff8bfeb2fd965203380436e159df9f218900
[root@linux-node1 ~]# docker image prune #移除未使用的镜像
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
4、保存镜像及加载镜像
[root@linux-node1 ~]# docker image save centos > centos.tar #保存centos镜像到归档tar
[root@linux-node1 ~]# du -sh centos.tar
201M centos.tar
[root@linux-node1 ~]# docker image rm centos:latest #删除centos镜像
Untagged: centos:latest
Untagged: centos@sha256:38777a4106f0072649128ea4236241345a3ed21c55abbbd53bad5342549f6126
Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb
Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956
[root@linux-node1 ~]# docker image load < centos.tar #加载已归档的镜像
071d8bd76517: Loading layer [==================================================>] 210.2MB/210.2MB
Loaded image: centos:latest