镜像是动态的容器的静态表示,包括容器所要运行的应用代码以及运行时的配置。Docker镜像包括一个或者多个只读层(read-only layers),所以,镜像一旦被建立就不再能被修改了,一个运行着的Docker容器时一个镜像的实例(instantiation)。从同一个镜像中运行的容器包含有相同的应用代码和运行时依赖。可是不像镜像是静态的,每一个运行着的容器都有一个可写层(writable layer,也成为容器层 container layer),它位于底下的若干只读层之上。运行时的全部变化,包括对数据和文件的写和更新,都会保存在这个层中,所以,从同一个镜像运行的多个容器包含了不一样的容器层。php
关于镜像是什么总结:html
1.一个分层存储的文件mysql
2.一个软件的环境linux
3.一个镜像能够建立N个容器nginx
4.又称一种标准化的交付web
5.一个不包含Linux内核又精简的Liunx操做系统sql
助理解:镜像不是单一的文件,而是多层构成,咱们能够经过docker history <ID/NAME> 查看镜像中各层内容及其大小,每层对应着一个Dockerfile中的一条指令,另外docker镜像存储在/var/lib/docker/<storage-d'river>中。docker
镜像从哪里来的呢?apache
Docker hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像,地址为:https://hub.docker.com/search/?q=&type=imagejson
镜像加速器的配置:https://www.daocloud.io/mirror
配置方法:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sg | sh -s http://f1361db2.m.daocloud.io
Docker有三种方式建立镜像:
举例说明:一台主机上安装的时Centos操做系统,如今上面跑了一个Ubuntu容器。此时,Host OS时Centos,Guest OS是Ubuntu。Guest OS也被称为容器的Base Image。
说明:
容器的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内核。
从上面内容能够看出,容器把linux镜像从内核空间和用户空间进行了分开管理,对host OS而言,它更侧重与内核,加上少许的用户空间内容;对Guest OS 而言,它只侧重于用户空间,只包括库文件,编译器,配置文件,以及用户代码。
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
基于Dockerfile生成镜像:
https://www.cnblogs.com/ylqh/p/10617105.html
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 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归档或标准输入