- docker run 的流程
开始->docker在本地寻找镜像->直接使用/去dockerHUB下载->下载到本地
docker 概念
docker 概念
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
简单地理解,Docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据.
docker 文件系统
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS(联合文件系统)
Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像,一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
按照docker官网上的说法,docker的文件系统分为两层:bootfs和rootfs
bootfs包含了bootloader和linux内核。用户是不能对这层作任何修改的。在内核启动之后,bootfs实际上会unmount掉。
rootfs则包含了一般系统上的常见目录结构,类似于/dev, /proc, /bin等等以及一些基本的文件和命令。对于linux上不同版本的问题,docker可以同时运行多个rootfs.

Docker的文件系统是分层的,它的rootfs在mount之后会转为只读模式。 Docker在它上面添加一个新的文件系统,来达成它的只读。
事实上,从下图中,我们能看到多个只读的文件系统,Docker中把他们称为 层。
image是只读的,container部分则是可写的。
如果用户想要修改底层只读层上的文件,这个文件就会被先拷贝到上层,修改后驻留在上层,并屏蔽原有的下层文件。
容器共有两种状态:running 和 exited,用户也可以用docker commit 命令将一个容器压制为image,供后续使用。
ref: docker 架构 (文件系统, 层, 容器) https://blog.csdn.net/11b202/article/details/21389067
平时我们的虚拟机的centOS 都很大,但是Docker的centOS才200多M,主要原因是对于一个精简的centos 自己只使用rootfs,rootfs可以很小(只保留基础命令),同时底层使用Host的kernel,不同的Linux发行版bootfs基本是一致的,rootfs 有差别。
docker 特点
docker镜像都是只读的,当容器启动时,一个新的可写层被加载镜像的顶部,这一层通常叫作容器层,容器层之下都叫镜像层;
1.镜像是分层(Layer)的
即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
2.镜像是只读的(read-only)
镜像在构建完成之后,便不可以再修改,当容器启动时,一个新的可写层被加载到镜像顶层,称之为镜像层。这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,这一层称之为容器层,原本下载(docker pull)下来的称之为镜像层,因为容器是可以动态改变的
docker 和虚拟机区别
Docker 是client-server 结构系统,Docker 的守护进程运行在主机上,通过Socket从客户端访问。
Docker server接收到client-server的指令,就会执行这个命令。
Docker 为什么比VM快
1.Docker 有着比虚拟机更少的抽象层-虚拟机操作系统(Guestos)
2.Docker利用宿主机的内核,VM需要虚拟机操作系统
3.Docker加载非常快(秒级),VM慢,由于省略了虚拟机操作系统内核搭建
docker 命令
docker images
docker images 查看所有本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
REPOSITORY 镜像仓库源
TAG 镜像版本号
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小
(base) dh@DHMacBook ~ % docker images --help #帮助文档Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]List imagesOptions:-a, --all Show all images (default hides intermediate images)--digests Show digests-f, --filter filter Filter output based on conditions provided--format string Pretty-print images using a Go template--no-trunc Don't truncate output-q, --quiet Only show numeric IDs
$ docker image --helpUsage: docker image COMMANDManage imagesCommands:build Build an image from a Dockerfilehistory Show the history of an imageimport Import the contents from a tarball to create a filesystem imageinspect Display detailed information on one or more imagesload Load an image from a tar archive or STDINls List imagesprune Remove unused imagespull Pull an image or a repository from a registrypush Push an image or a repository to a registryrm Remove one or more imagessave Save one or more images to a tar archive (streamed to STDOUT by default)tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGERun 'docker image COMMAND --help' for more information on a command.
| 命令 | 说明 |
|---|---|
| build | 通过Dockerfile构建镜像的命令 |
| history | 显示镜像构建历史过程 |
| import | 导入一个由容器 |
| inspect | 显示一个镜像的详细信息 |
| load | 从一个文件或标准输入流中导入镜像 |
| ls | 查看镜像列表 |
| prune | 删除未使用的镜像 |
| pull | 从registry拉取镜像 |
| push | 推送镜像到registry |
| rm | 删除镜像 |
| save | 将镜像打包成tar压缩文件 |
| tag | 给镜像打标签 |
虚悬镜像/
下面一些特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>。这类无标签镜像也被称为虚悬镜像(dangling image)
docker search
国外:docker hub: https://hub.docker.com
国内:七牛云镜像:https://hub.qiniu.com/home
docker search 可选的参数说明:
-f, —filter filter 根据条件过滤输出is-automated=(true|false), is-official=(true|false), stars=
—format string 使用go模板语法搜索输出
—limit int 搜索结果分页条数,默认25条
—no-trunc 显示完整镜像信息
显示start不小于20的 前五个centos镜像
docker search -f=stars=20 --limit=5 centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDcentos The official build of CentOS. 4585 [OK]jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 99 [OK]openshift/base-centos7 A Centos7 derived base image for Source-To-I… 31
docker pull
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker run
/bin/sh:放在镜像名后的是命令,交互式 Shell,有了它,可以不运行CMD的内容,在调试服务的时候可以使容器run起来,然后进入容器内debug
docker
docker rmi
想要删除运行过的images必须首先删除它的container(docker rm container),docker rmi images 才能成功
或者docker rmi -f images
docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Options说明:
-a, —author string 提交的镜像作者;
-c, —change list 使用Dockerfile指令来创建镜像
-m, —message string 提交时的说明文字;
-p, —pause 将容器暂停。默认是true
eg:
docker commit -m="add app" -a="denghui" tomcat2 tomcat2:20211123tomcat2:20211123 成为一个新镜像
docker tag
docker tag 镜像ID 远程仓库地址/镜像名:标签
docker push
docker push 远程仓库地址/镜像名:标签
docker save
docker save -o 文件名 镜像
eg
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1$ docker save -o elasticsearch-7.10.1.tar docker.elastic.co/elasticsearch/elasticsearch:7.10.1
docker load
docker load -i 文件名-i : 指定加载文件-q : 精简输出信息
eg
$docker load -i elasticsearch-7.10.1.tar
docker image prune
docker image prune --helpUsage: docker image prune [OPTIONS]Remove unused imagesOptions:-a, --all Remove all unused images, not just dangling ones--filter filter Provide filter values (e.g. 'until=<timestamp>')-f, --force Do not prompt for confirmation
