1、镜像是什么?
一个分层存储的文件
一个软件的环境
一个镜像可以创建N个容器
一种标准化的交付
一个不包含linux内核而又精简的linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>查看镜像中各层内容及大小,
每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/中。
- 镜像仓库对应关系:
hub.yunweidashu.com --> hub.docker.com
k8sgcr.yunweidashu.com --> k8s.gcr.io
registry.yunweidashu.com --> registry.k8s.io
ghcr.yunweidashu.com --> ghcr.io
gcr.yunweidashu.com --> grc.io
搜索镜像:
[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 #下载一个镜像测一下速度
- ubuntu
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uvi4o749.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- Centos
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uvi4o749.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
- windows
1. 安装/升级Docker客户端
对于Windows 10以下的用户,推荐使用Docker Toolbox
Windows安装文件:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
对于Windows 10以上的用户 推荐使用Docker for Windows
Windows安装文件:http://mirrors.aliyun.com/docker-toolbox/windows/docker-for-windows/
2. 配置镜像加速器
针对安装了Docker Toolbox的用户,您可以参考以下配置步骤:
创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。
docker-machine create --engine-registry-mirror=https://uvi4o749.mirror.aliyuncs.com -d virtualbox default
查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。
docker-machine env default
eval "$(docker-machine env default)"
docker info
针对安装了Docker for Windows的用户,您可以参考以下配置步骤:
在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Daemon。编辑窗口内的JSON串,填写下方加速器地址:
{
"registry-mirrors": ["https://uvi4o749.mirror.aliyuncs.com"]
}
编辑完成后点击 Apply 保存按钮,等待Docker重启并应用配置的镜像加速器。
注意
Docker for Windows 和 Docker Toolbox互不兼容,如果同时安装两者的话,需要使用hyperv的参数启动。
docker-machine create --engine-registry-mirror=https://uvi4o749.mirror.aliyuncs.com -d hyperv default
Docker for Windows 有两种运行模式,一种运行Windows相关容器,一种运行传统的Linux容器。同一时间只能选择一种模式运行。
- mac
1. 安装/升级Docker客户端
对于10.10.3以下的用户 推荐使用Docker Toolbox
Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-toolbox/
对于10.10.3以上的用户 推荐使用Docker for Mac
Mac安装文件:http://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/
2. 配置镜像加速器
针对安装了Docker Toolbox的用户,您可以参考以下配置步骤:
创建一台安装有Docker环境的Linux虚拟机,指定机器名称为default,同时配置Docker加速器地址。
docker-machine create --engine-registry-mirror=https://uvi4o749.mirror.aliyuncs.com -d virtualbox default
查看机器的环境配置,并配置到本地,并通过Docker客户端访问Docker服务。
docker-machine env default
eval "$(docker-machine env default)"
docker info
针对安装了Docker for Mac的用户,您可以参考以下配置步骤:
在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。将
https://uvi4o749.mirror.aliyuncs.com加到"registry-mirrors"的数组里,点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。
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