1. 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.

image.png
Docker的文件系统是分层的,它的rootfs在mount之后会转为只读模式。 Docker在它上面添加一个新的文件系统,来达成它的只读。
事实上,从下图中,我们能看到多个只读的文件系统,Docker中把他们称为 层。
image是只读的,container部分则是可写的。
如果用户想要修改底层只读层上的文件,这个文件就会被先拷贝到上层,修改后驻留在上层,并屏蔽原有的下层文件。
image.png
容器共有两种状态: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的指令,就会执行这个命令。
image.png
Docker 为什么比VM快
1.Docker 有着比虚拟机更少的抽象层-虚拟机操作系统(Guestos)
2.Docker利用宿主机的内核,VM需要虚拟机操作系统
3.Docker加载非常快(秒级),VM慢,由于省略了虚拟机操作系统内核搭建
image.png
image.png

docker 命令

docker images

  1. docker images 查看所有本地镜像

REPOSITORY TAG IMAGE ID CREATED SIZE
REPOSITORY 镜像仓库源
TAG 镜像版本号
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小

  1. (base) dh@DHMacBook ~ % docker images --help #帮助文档
  2. Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
  3. List images
  4. Options:
  5. -a, --all Show all images (default hides intermediate images)
  6. --digests Show digests
  7. -f, --filter filter Filter output based on conditions provided
  8. --format string Pretty-print images using a Go template
  9. --no-trunc Don't truncate output
  10. -q, --quiet Only show numeric IDs
  1. $ docker image --help
  2. Usage: docker image COMMAND
  3. Manage images
  4. Commands:
  5. build Build an image from a Dockerfile
  6. history Show the history of an image
  7. import Import the contents from a tarball to create a filesystem image
  8. inspect Display detailed information on one or more images
  9. load Load an image from a tar archive or STDIN
  10. ls List images
  11. prune Remove unused images
  12. pull Pull an image or a repository from a registry
  13. push Push an image or a repository to a registry
  14. rm Remove one or more images
  15. save Save one or more images to a tar archive (streamed to STDOUT by default)
  16. tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  17. Run '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镜像

  1. docker search -f=stars=20 --limit=5 centos
  2. NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. centos The official build of CentOS. 4585 [OK]
  4. jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86 99 [OK]
  5. openshift/base-centos7 A Centos7 derived base image for Source-To-I 31

docker pull

  1. 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

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Options说明:
-a, —author string 提交的镜像作者;
-c, —change list 使用Dockerfile指令来创建镜像
-m, —message string 提交时的说明文字;
-p, —pause 将容器暂停。默认是true
eg:

  1. docker commit -m="add app" -a="denghui" tomcat2 tomcat2:20211123
  2. tomcat2:20211123 成为一个新镜像

docker tag

  1. docker tag 镜像ID 远程仓库地址/镜像名:标签

docker push

  1. docker push 远程仓库地址/镜像名:标签

docker save

  1. docker save -o 文件名 镜像

eg

  1. $ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.10.1
  2. $ docker save -o elasticsearch-7.10.1.tar docker.elastic.co/elasticsearch/elasticsearch:7.10.1

docker load

  1. docker load -i 文件名
  2. -i : 指定加载文件
  3. -q : 精简输出信息

eg

  1. $docker load -i elasticsearch-7.10.1.tar

docker image prune

  1. docker image prune --help
  2. Usage: docker image prune [OPTIONS]
  3. Remove unused images
  4. Options:
  5. -a, --all Remove all unused images, not just dangling ones
  6. --filter filter Provide filter values (e.g. 'until=<timestamp>')
  7. -f, --force Do not prompt for confirmation