docker images 介绍
镜像是动态的容器的静态表示,包括容器所要运行的应用代码以及运行时的配置。Docker镜像包括一个或者多个只读层(read-only layers),因此,镜像一旦被创建就再也不能被修改了,一个运行着的Docker容器时一个镜像的实例(instantiation)。从同一个镜像中运行的容器包含有相同的应用代码和运行时依赖。但是不像镜像是静态的,每个运行着的容器都有一个可写层(writable layer,也成为容器层 container layer),它位于底下的若干只读层之上。运行时的所有变化,包括对数据和文件的写和更新,都会保存在这个层中,因此,从同一个镜像运行的多个容器包含了不同的容器层。
关于镜像是什么总结:
1.一个分层存储的文件
2.一个软件的环境
3.一个镜像可以创建N个容器
4.又称一种标准化的交付
5.一个不包含Linux内核又精简的Liunx操作系统
助理解:镜像不是单一的文件,而是多层构成,我们可以通过docker history <ID/NAME> 查看镜像中各层内容及其大小,每层对应着一个Dockerfile中的一条指令,另外docker镜像存储在/var/lib/docker/<storage-d'river>中。
镜像从哪里来的呢?
Docker hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像,地址为:https://hub.docker.com/search/?q=&type=image
镜像加速器的配置:https://www.daocloud.io/mirror
配置方法:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sg | sh -s http://f1361db2.m.daocloud.io
Docker有三种方式创建镜像:
- 基于已有镜像的容器创建:创建一个容器,运行若干命令后,在使用docker commit来生成一个新的镜像。不建议使用这种方案。
- 基于本地模板导入,使用OpenVZ提供的模板来创建,docker import来生成新的镜像。不经常用。
- 基于Dockerfile创建,创建一个Dockerfile,然后在使用docker build来创建一个镜像,大多数都会使用Dockerfile来创建镜像。
镜像相关的基础理论
1. 理解Host OS ,Guest OS and Base image相关理论
举例说明:一台主机上安装的时Centos操作系统,现在上面跑了一个Ubuntu容器。此时,Host OS时Centos,Guest OS是Ubuntu。Guest OS也被称为容器的Base Image。
说明:
- linux内核和版本:所有 Linux 发行版都采用相同的 Linux 内核(kernel),然后所有发行版对内核都有轻微改动。这些改动都会上传回 linux 社区,并被合并。
- linux容器环境:因为所有Linux发行版都包含同一个linux 内核(有轻微修改),以及不同的自己的软件,因此,会很容易地将某个 userland 软件安装在linux 内核上,来模拟不同的发行版环境。比如说,在 Ubuntu 上运行 Centos 容器,这意味着从 Centos 获取 userland 软件,运行在 Ubuntu 内核上。因此,这就像在同一个操作系统(linux 内核)上运行不同的 userland 软件(发行版的)。这就是为什么Docker 不支持在 Linux 主机上运行 FreeBSD 或者windows 容器。
容器的base image 并不是真正的base OS,base image 会远远的比 base OS更轻量。它只安装发行版特殊的部分
base image的用途或者作用是什么呢?
docker容器文件系统与host OS是隔离的,容器镜像中的应用软件无法看到主机文件系统,除非将主机文件系统挂载为容器的卷。因此,可以想象一下,你容器中的应用依赖于各种操作系统库,因此我们不得不将这些库打包到镜像之中,另外,base image会让我们使用到各个发行版的包管理系统,比如yum 和 apt-get。而且,各个linux发行版的base image也不是普通的发行版,而是一个简化了的版本。而且,base image并不带有linux内核,因为主机会使用主机的内核。
因此,需要注重理解image 和 OS这两个概念,之所以成为base OS,是因为base image中并不包括完整的OS,而这一点,是容器与虚拟机之间的本质区别之一。容器是共享主机上的linux内核。
2. Container Base image
从上面内容可以看出,容器把linux镜像从内核空间和用户空间进行了分开管理,对host OS而言,它更侧重与内核,加上少量的用户空间内容;对Guest OS 而言,它只侧重于用户空间,只包括库文件,编译器,配置文件,以及用户代码。
docker images详细用法
1.获取镜像
用法:docker pull NAME[:TAG],如果没有显示TAG,则默认是latest标签,也就是最新版本的镜像。
root@S1:~# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
898c46f3b1a1: Pull complete
63366dfa0a50: Pull complete
041d4cd74a92: Pull complete
6e1bee0f8701: Pull complete
Digest: sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Status: Downloaded newer image for ubuntu:latest
默认下载的是最新的ubuntu镜像,默认下载的镜像地址registry.hub.docker.com
相当于如下命令:
docker pull registry.hub.docker.com/ubuntu:latest
root@S1:~# docker run -d -t -i ubuntu /bin/bash
082d88976a54d5b05ae39fd5eed6ccff28a6a8881bde553cd48efd75ac3bd754
2.查看镜像信息:
使用docker images 命令可以列出本地主机已有的镜像。
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 94e814e2efa8 2 weeks ago 88.9MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
REPOSITORY:来自哪一个仓库,比如ubuntu仓库
TAG:镜像的标签信息,最新的
镜像的id号:这个是唯一的
镜像创建时间
镜像大小
其中镜像的id信息非常重要,因为他是唯一标识了镜像
tag信息用于标记来自同一个仓库的不同镜像,后续工作我们可以使用tag为本地镜像添加新的标签,我们也可以将它用于ci/cd相结合起来使用(后续文章会介绍到,尽情关注)
eg:添加一个新的标签:
root@S1:~# docker tag ubuntu:latest ubuntu:16.04
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 94e814e2efa8 2 weeks ago 88.9MB
ubuntu latest 94e814e2efa8 2 weeks ago 88.9MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
这里细心的同学会发现,不同的标签的镜像的ID是完全一致的,说明它们实际上指向了同一个镜像文件,只是名字不同而已,可以理解为linux的软连接或者window的快捷方式。
查看镜像的详细信息
root@S1:~# docker inspect 94e814e2efa8
[
{
"Id": "sha256:94e814e2efa8845d95b2112d54497fbad173e45121ce9255b93401392f538499",
"RepoTags": [
"ubuntu:16.04",
"ubuntu:latest"
],
"RepoDigests": [
"ubuntu@sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8"
],
"Parent": "",
"Comment": "",
"Created": "2019-03-12T00:20:17.419392342Z",
"Container": "94772adb8869651410d18062838667884a555cf1878d567734e99dc695d6f5bf",
"ContainerConfig": {
"Hostname": "94772adb8869",
"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/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:881686baf75637792ebd93d88243b6f5bb89833ce325f9e32e2e70208f0efb64",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.06.1-ce",
"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"
],
"ArgsEscaped": true,
"Image": "sha256:881686baf75637792ebd93d88243b6f5bb89833ce325f9e32e2e70208f0efb64",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 88908191,
"VirtualSize": 88908191,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/e9af142ff18154b104fcae496ca9cdba91a7de36d929738a61fb044df3fd21cb/diff:/var/lib/docker/overlay2/4ebe2a5f541f89e24fc6a4c6f22817e0b5e39358ee9ba507f792e606386c2727/diff:/var/lib/docker/overlay2/66fa62d0da114b8b02bd376cc4507b196dccccf0c1f9635d9db5d5706e95cc39/diff",
"MergedDir": "/var/lib/docker/overlay2/ef8439354f7b197a7bbfa74fa6b0dfd0dabf4bd8009b7528ce5b1d0992b290a5/merged",
"UpperDir": "/var/lib/docker/overlay2/ef8439354f7b197a7bbfa74fa6b0dfd0dabf4bd8009b7528ce5b1d0992b290a5/diff",
"WorkDir": "/var/lib/docker/overlay2/ef8439354f7b197a7bbfa74fa6b0dfd0dabf4bd8009b7528ce5b1d0992b290a5/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:762d8e1a60542b83df67c13ec0d75517e5104dee84d8aa7fe5401113f89854d9",
"sha256:e45cfbc98a505924878945fdb23138b8be5d2fbe8836c6a5ab1ac31afd28aa69",
"sha256:d60e01b37e74f12aa90456c74e161f3a3e7c690b056c2974407c9e1f4c51d25b",
"sha256:b57c79f4a9f3f7e87b38c17ab61a55428d3391e417acaa5f2f761c0e7e3af409"
]
},
"Metadata": {
"LastTagTime": "2019-03-26T19:07:55.36713665+08:00"
}
}
]
docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f 参数来指定,如:
root@S1:~# docker inspect -f {{".Metadata"}} 94e814e2efa8
{2019-03-26 19:07:55.36713665 +0800 CST}
3.搜寻镜像:
使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索Docker Hub官方仓库中的镜像,用法:docker search TERM
root@S1:~# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 7955 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2660 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 598 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 176 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 110
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 92 [OK]
centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 50 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 49
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 41
tutum/mysql Base docker image to run a MySQL database se… 31
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 25 [OK]
bitnami/mysql Bitnami MySQL Docker Image 25 [OK]
zabbix/zabbix-web-apache-mysql Zabbix frontend based on Apache web-server w… 24 [OK]
zabbix/zabbix-proxy-mysql Zabbix proxy with MySQL database support 20 [OK]
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 20
centos/mysql-56-centos7 MySQL 5.6 SQL database server 13
circleci/mysql MySQL is a widely used, open-source relation… 12
mysql/mysql-router MySQL Router provides transparent routing be… 8
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
dsteinkopf/backup-all-mysql backup all DBs in a mysql server 6 [OK]
jelastic/mysql An image of the MySQL database server mainta… 1
cloudposse/mysql Improved `mysql` service with support for `m… 0 [OK]
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 0 [OK]
返回了很多包含关键字的镜像,其中包括镜像名字,描述,星级(表示该镜像的受欢迎程度),是否官方创建,是否自动创建等
默认的输出结果是按照星级评价进行排序的,官方的镜像说明是官方项目组创建和维护的,automated资源则是允许用户验证镜像的来源和内容。
个人建议:如果自己的线上服务使用的化,自己写dockerfile构建镜像比较好
4.删除镜像
docker rmi 命令可以删除镜像,命令格式docker rmi ID/REPOSITORY:TAG(可以为标签或者ID)
使用镜像标签删除镜像: 如果一个镜像有两个或两个以上的标签,删除的只是标签。
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 94e814e2efa8 2 weeks ago 88.9MB
ubuntu latest 94e814e2efa8 2 weeks ago 88.9MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
root@S1:~# docker rmi ubuntu:16.04
Untagged: ubuntu:16.04
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 94e814e2efa8 2 weeks ago 88.9MB
hello-world latest fce289e99eb9 2 months ago 1.84kB
现在只剩下一个标签的时候,再去用标签删除的话,会将镜像永久的删除,如下:
root@S1:~# docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:017eef0b616011647b269b5c65826e2e2ebddbe5d1f8c1e56b3599fb14fabec8
Deleted: sha256:94e814e2efa8845d95b2112d54497fbad173e45121ce9255b93401392f538499
Deleted: sha256:e783d8ee44ce099d51cbe699f699a04e43c9af445d85d8576f0172ba92e4e16c
Deleted: sha256:cc7fae10c2d465c5e4b95167987eaa53ae01a13df6894493efc5b28b95c1bba2
Deleted: sha256:99fc3504db138523ca958c0c1887dd5e8b59f8104fbd6fd4eed485c3e25d2446
Deleted: sha256:762d8e1a60542b83df67c13ec0d75517e5104dee84d8aa7fe5401113f89854d9
使用镜像ID删除镜像:
当使用docker rmi 命令后面跟上镜像的ID(也可以是ID能区分的部分前缀)时,会尝试先删除所有指向该镜像的标签,然后删除该镜像文件本身。如果有该镜像的容器存在时,镜像文件默认时无法被删除的,(可以用-f强制删除 但是不推荐)例如:
root@S1:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59fa4f00d111 ubuntu:16.04 "/bin/bash" 5 minutes ago Up 4 minutes pensive_napier
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 9361ce633ff1 2 weeks ago 118MB
root@S1:~# docker stop 59fa4f00d111
d59fa4f00d111
root@S1:~# docker rm 59fa4f00d111
59fa4f00d111
root@S1:~# docker rmi 9361ce633ff1
Untagged: ubuntu:16.04
Untagged: ubuntu@sha256:58d0da8bc2f434983c6ca4713b08be00ff5586eb5cdff47bcde4b2e88fd40f88
Deleted: sha256:9361ce633ff193349d54bed380a5afe86043b09fd6ea8da7549dbbedfc2a7077
Deleted: sha256:59a6856f439d187f3ce3381d0a6b0816db99cc3d8468bcf8c9d1c39d2071dcff
Deleted: sha256:82997a16a0d57ac7d8b416c0d83f5841193b6a56a7844b486ab6324730867fe0
Deleted: sha256:5c6983f277f26021b5e38501fdf06fa29f7158a93641f3f10aedbdc9869121d0
Deleted: sha256:aa54c2bc12290df2851a94b8834cae75e4627219d2b423d4d3db8b0a497e79a2
root@S1:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
删除镜像的规则,应该先删除容器,在删除镜像,之前的版本删除还在容器的镜像还会生成一个临时镜像,ubuntu16.04系统,docker18.09的是可以强制删除掉的
5.创建镜像
基于已有镜像的容器创建:该方法主要是使用docker commit 命令,命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG] ],主要选项包括:
-a --author=‘ ’ 作者信息
-c --change 对创建的镜像应用Dockerfile指令
-m --message=‘ ’ 提交信息
-p --pause=true 提交镜像的时候 暂停容器的运行
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
启动一个镜像 并作出修改
root@iZhp38fvkcax587xnn2552Z:~# docker run -it ubuntu:14.04 /bin/bash
root@b0ca2a732416:/# mkdir 1 2 3
root@b0ca2a732416:/# touch 4
root@b0ca2a732416:/# exit
exit
这里需要记住这个容器的id号
root@iZhp38fvkcax587xnn2552Z:~# docker commit -m "add files" -a "Docker newimages" b0ca2a732416 file
sha256:03aa8fcfd2f18c4ce1c4ef35be02fced08313ba62b11d03fddcc7875c80fab34
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 6 seconds ago 188MB
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
基于本地模板导入:
也可以充一个操作系统模板文件导入一个镜像。在这里,推荐使用OpenVZ提供的模板来创建。OPENVZ模板的下载地址:https://download.openvz.org/template/precreated/
root@iZhp38fvkcax587xnn2552Z:~# wget https://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
--2019-03-28 19:21:24-- https://download.openvz.org/template/precreated/ubuntu-14.04-x86-minimal.tar.gz
Resolving download.openvz.org (download.openvz.org)... 185.231.241.69
Connecting to download.openvz.org (download.openvz.org)|185.231.241.69|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 76242510 (73M) [application/x-gzip]
Saving to: ‘ubuntu-14.04-x86-minimal.tar.gz’
ubuntu-14.04-x86-minimal.tar.gz 100%[==============================================================================>] 72.71M 58.7KB/s in 21m 52s
2019-03-28 19:43:19 (56.8 KB/s) - ‘ubuntu-14.04-x86-minimal.tar.gz’ saved [76242510/76242510]
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 About an hour ago 188MB
nginx latest 2bcb04bdb83f 37 hours ago 109MB
root@iZhp38fvkcax587xnn2552Z:~# cat ubuntu-14.04-x86-minimal.tar.gz | docker import - ubuntu:14.04
sha256:5863575f1996d4738399f0b3b4c03fe5ab69098b370eb587fc2163367ffcff72
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 5863575f1996 About a minute ago 205MB
file latest 03aa8fcfd2f1 About an hour ago 188MB
nginx latest 2bcb04bdb83f 37 hours ago 109MB
6.导出和载入镜像
导出镜像:使用docker save命令,导出本地的ubuntu:14.04的镜像文件为:ubuntu_14.04.tar
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 13 minutes ago 188MB
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
root@iZhp38fvkcax587xnn2552Z:~# docker save -o ubuntu_14.04.tar ubuntu:14.04
导入镜像:使用docker load从本地文件导入到本地的镜像库中,例如:
root@iZhp38fvkcax587xnn2552Z:~# ls
ubuntu_14.04.tar
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 17 minutes ago 188MB
root@iZhp38fvkcax587xnn2552Z:~# docker load --input ubuntu_14.04.tar
Loaded image: ubuntu:14.04
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 18 minutes ago 188MB
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
root@iZhp38fvkcax587xnn2552Z:~# docker rmi ubuntu:14.04
Untagged: ubuntu:14.04
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 18 minutes ago 188MB
root@iZhp38fvkcax587xnn2552Z:~# docker load < ubuntu_14.04.tar
Loaded image: ubuntu:14.04
root@iZhp38fvkcax587xnn2552Z:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
file latest 03aa8fcfd2f1 18 minutes ago 188MB
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
7.上传镜像
使用docker push上传镜像到仓库,默认上传到Dockerhub官方仓库(需要认证),命令格式: docker push NAME[:TAG]。
用户在DockerHub网站注册后,可以上传自制的镜像,上传方式如下:
上传镜像需要登陆到docker hub上
root@S1:~# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhangzhanling
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
root@S1:~# docker tag ubuntu:14.04 zhangzhanling/ubuntu:14.04
root@S1:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 390582d83ead 2 weeks ago 188MB
zhangzhanling/ubuntu 14.04 390582d83ead 2 weeks ago 188MB
上传镜像
root@S1:~# docker push zhangzhanling/ubuntu
The push refers to repository [docker.io/zhangzhanling/ubuntu]
5f96fa66dc12: Mounted from library/ubuntu
dda5ec330bd9: Mounted from library/ubuntu
11a0c2f551fd: Mounted from library/ubuntu
eef560b4ec4f: Mounted from library/ubuntu
14.04: digest: sha256:76f6920c51a2e9da1fccca4b81a84af0ff287449282d6a04c33adeaeeb4df60d size: 1152
镜像与容器的联系
容器是在镜像的最上面加了一个读写层,在运行容器里的文件改动时,会先从镜像里要写的文件复制到容器自己的文件系统中(读写层)。
如果容器删除了,最上面的读写层也就删除了,改动就丢失了,所以无论多少个容器共享一个镜像,所做的写操作都是从镜像的文件系统中复制过来操作的,并不会修改镜像的源文件,这种方式提高了磁盘利用率。
如果想持久化这些改动,可以通过docker commit将容器保存为一个新镜像
本地镜像需要可以从远端镜像服务器上pull或者push镜像文件,镜像可以实例化成容器,容器也可以commit成镜像
汇总docker images常用的相关命令
docker image 【options】
ls :列出镜像 docker image ls 或者 docker images
build : 通过dockerfile构建镜像
history :查看镜像历史
inspect:显示一个或者多个镜像详细信息
pull:从镜像仓库拉去镜像
push:推送一个镜像到镜像仓库
rm:移除一个或者多个镜像
prune:移除未使用的镜像,没有被标记或被任何容器引用的
tag:创建一个引用源镜像标记的目标镜像
export:导出容器文件系统到tar归档文件
import:导入容器文件系统tar归档文件创建镜像
save:保存一个或多个镜像到一个tar归档文件
load:加载镜像来自tar归档或标准输入