1、镜像是什么?
一个分层存储的文件
一个软件的环境
一个镜像可以创建N个容器
一种标准化的交付
一个不包含linux内核而又精简的linux操作系统
镜像不是一个单一的文件,而是有多层构成。我们可以通过docker history <ID/NAME>查看镜像中各层内容及大小,
每层对应着Dockerfile中的一条指令。Docker镜像默认存储在/var/lib/docker/中。
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来!
2、镜像命令
搜索镜像:
[root@linux-node1 ~]# docker search nginx
下载镜像:
docker pull 镜像名[:tag]
[root@docker ~]# docker pull mysql
Using default tag: latest #如果不写tag,默认就是latest
#指定版本下载
[root@docker ~]# docker pull mysql:5.7
镜像从哪里来?
1.从远程仓库下载
2.朋友拷贝给你
3.自己制作一个镜像Dockerfile
查看镜像:
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 2 months ago 133MB
[root@node1 ~]#
### 解释:
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的id
[root@node1 ~]# docker images -aq
f6d0b4767a6c
[root@node1 ~]#
删除镜像:
[root@docker ~]# docker rmi -f 容器id #删除指定的容器
[root@docker ~]# docker rmi -f 容器id 容器id 容器id #删除多个容器
[root@docker ~]# docker rmi -f $(docker images -aq) #删除全部容器
导入和导出镜像:
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a70d36bc331a 8 weeks ago 449MB
# 导出镜像
[root@node1 ~]# docker save a70d36bc331a > mysql_5.7.tar
# 导入镜像
[root@node1 ~]# docker load < mysql_5.7.tar
# 此时导入镜像 没有tag
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a70d36bc331a 8 weeks ago 449MB
# 手动tag
[root@node1 ~]# docker tag a70d36bc331a hebye/mysql:5.7
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hebye/mysql 5.7 a70d36bc331a 8 weeks ago 449MB
查看镜像的详细信息:
[root@node1 ~]# docker inspect hebye/mysql:5.7
[
{
"Id": "sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5",
"RepoTags": [
"hebye/mysql:5.7"
],
"RepoDigests": [],
"Parent": "",
"Comment": "",
"Created": "2021-01-18T23:26:26.468135822Z",
"Container": "4ef9ed634d32fe6960e734b5bd1810d8f56f750644d99af1f8232e9277e38b58",
"ContainerConfig": {
"Hostname": "4ef9ed634d32",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.33-1debian10"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"mysqld\"]"
],
"Image": "sha256:1d6b659572ac013436b65038f4aeed50516efdda6e54e08b19173e709e25256c",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "19.03.12",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.33-1debian10"
],
"Cmd": [
"mysqld"
],
"Image": "sha256:1d6b659572ac013436b65038f4aeed50516efdda6e54e08b19173e709e25256c",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 448718278,
"VirtualSize": 448718278,
"GraphDriver": {
"Data": {
"LowerDir": "/data/docker/overlay2/2c48bc41668db259d327fae4913552bf58abfa319d6919f86f8206a264a1e6d8/diff:/data/docker/overlay2/a511251094e100e74978e138ced42cba511e2eb3a4eb554a48f4c3fef4564dc2/diff:/data/docker/overlay2/48e15b2f083ffd8a68ccc7f4750c23a2fbbfcab767992516634fca7cf2ac74c0/diff:/data/docker/overlay2/02a9a52a96fcc40f7cc580006165fe7b8cb67561348158e2f4972011621f075b/diff:/data/docker/overlay2/87eb64c1776372a9af530382d954c36b06b8684c1d3027822a386fb182ebd32f/diff:/data/docker/overlay2/df095f22c2d83a2c90baa07e3dd35dd37e0319d0fa5997b6c5ea9108475aaa99/diff:/data/docker/overlay2/b7d41b4453703fd2d00c129afc6973272f67356fd5e84dc40a28e33a08bda263/diff:/data/docker/overlay2/23bade477ae007c9ba489554537ec73617ae135b74122f500ce3a9b4a56cb3e6/diff:/data/docker/overlay2/48a57fa664c087bfcff7510160e858eb7dfe01efb52352866bcde88e29190e3d/diff:/data/docker/overlay2/0a4c54f8a9f93652d3f43fd1fc3433751bc1e748df45d7e4ef6f45d386ea0ead/diff",
"MergedDir": "/data/docker/overlay2/7682138e498e64a8461e11ac880d765cbf31c32a23433ec9b20e00b1c8ac858f/merged",
"UpperDir": "/data/docker/overlay2/7682138e498e64a8461e11ac880d765cbf31c32a23433ec9b20e00b1c8ac858f/diff",
"WorkDir": "/data/docker/overlay2/7682138e498e64a8461e11ac880d765cbf31c32a23433ec9b20e00b1c8ac858f/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864",
"sha256:ef4a33cee7a02ffa3c1dd5d2618dcb95e37b899fb7e90d0bb2df32a37396e174",
"sha256:74c86dffd46f095d4961730b731a33b19c1abd19f0a7ec1b81ddf09e6d3dfe85",
"sha256:6d23902c2a54f36f80946d7225044b2681bac18570af3a58970e325b40ac0d60",
"sha256:c484a3b6d84133f3618780f11216facc49f743cefc86e04409f28784a3a0a733",
"sha256:0394a41efa739604258181808606eb47798a83383ff52241547583939ffb297c",
"sha256:98d98806c8acefda16226c37045e3733a751c3cb165fde1182cbc324cde06f78",
"sha256:06e3384a2b84d5b30d9ca62f6fbfe13b4386ae3ec550f2344c46cb30049c72c1",
"sha256:60b9eaeaaabc71e6d58e3864ca091bce171ca48be3d4da0538a8aa50444c2fda",
"sha256:0774d1a514a9588f13100211a91bffcd74419f9b3dd9525b13ac09bc55e19abf",
"sha256:bbf075073d316135801e4661bb94ea73ab98697c741e9a8213e914d711267796"
]
},
"Metadata": {
"LastTagTime": "2021-03-17T10:40:16.265124691+08:00"
}
}
]
[root@node1 ~]#
3、镜像与容器联系
容器其实是在镜像的最上面加了一层读写层,在运行容器里时,会先从镜像里把要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动也就丢失了。所以无论多少个容器共享一个镜像,所做的写操作都是从镜像文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高磁盘利用率。
若想持久化这些改动,可以通过docker commit 将容器保存成一个新镜像。
4、管理镜像常用命令
ls ————列出镜像
build ————构建镜像来自Dockerfile
histiry ————查看镜像历史
inspect ————显示一个或多个镜像详细信息
pull ————从镜像仓库拉取镜像
push ————推送一个镜像到镜像仓库
rm ————移除一个或多个镜像
prune ————移除未使用的镜像。没有被标记或被任何容器引用的
tag ————创建一个引用源镜像标记目的镜像
export ————导出容器文件系统到tar归档文件
import ————导入容器文件系统tar归档文件创建镜像
save ————保存一个或多个镜像到一个tar归档文件
load ————加载镜像来自tar归档或标准输入
5、制作镜像
#容器内安装软件包,然后制作成镜像
docker commit -m "提交的描述信息" -a "作者信息" 容器id 目标镜像名:[TAG]
# 启动容器
[root@node1 ~]# docker run -d --name web -h web nginx
# 进入容器,安装软件包
[root@node1 ~]# docker exec -it web /bin/sh
tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
EOF
# apt-get update && apt-get install curl -y
# exit
# 镜像固化
(docker commit -p 0c2b8465b4dd hebye/nginx:curl)
[root@node1 ~]# docker commit -m "nginx_curl" -a "hebye" 94247b341fd7 hebye/nginx:curl
sha256:400af07a2fbeb4ee33a757a5e15140784c2932a223155e5412a27c77a293912e
[root@node1 ~]#