docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。
容器技术
在容器技术出现之前都是使用虚拟机技术
虚拟机:使用一个软件,通过这个软件可以虚拟出来一台或者多台电脑。
docker容器技术,也是一种虚拟化技术。
虚拟机技术的缺点:
- 资源占用多
- 冗余步骤多
- 启动很慢
比较Docker和虚拟机的不同:
- 传统的虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个操作者系统上安装和运行软件
- 容器内的应用直接运行在宿主机上,容器时没有自己的内核的,也没有虚拟我们的硬件,所以轻便。
- 每个容器之间时隔离的,每个容器内都有一个自己的文件系统,互不影响。
docker架构
- 客户端-服务器架构。
- Docker客户端与 Docker守护进程对话,后者负责构建、运行和分发 Docker 容器的繁重工作。
- Docker 客户端和守护程序可以 在同一系统上运行,或者您可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API,通过 UNIX 套接字或网络接口进行通信。
- 另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。
基础概念
仓库
就是存放镜像的地方。仓库分为共有仓库和私有仓库。
- DockerHub(默认国外的)
- 阿里云。。。都有容器容器服务(可以配置镜像加速!)
docker对象
镜像
- 一个docker镜像好比一个只读模板,可以通过这个模板来创建容器服务。通过这个镜像看可以创建多个容器(最终服务运行或者运行就是在容器中的)。
- 通常,一个图像基于另一个图像,并带有一些额外的自定义。
- 自定义镜像(创建自己的镜像- Dockerfile )
容器:
目前就可以把这个容器理解为就是一个简易的Linux系统
用来干嘛:
容器是图像的可运行实例。Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的。
启动,停止,删除,基本命令
容器隔离
Docker 使用一种称为容器namespaces的技术来提供隔离的工作空间。当您运行容器时,Docker 会为该容器创建一组 命名空间。
这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且它的访问权限仅限于该命名空间。
容器的文件系统
当一个容器运行时,它使用图像中的各个层作为其文件系统。每个容器还有自己的“暂存空间”来创建/更新/删除文件。任何更改都不会在另一个容器中看到,即使它们使用相同的图像。
卷
容器数据的暂存
默认情况下,将其数据存储在容器文件系统中的SQLite 数据库中。/etc/todos/todo.db
其中所有数据都存储在一个文件中。虽然这对于大型应用程序来说不是最好的,但它适用于小型演示。
通过创建一个卷并将其附加(通常称为“挂载”)到存储数据的目录,我们可以持久化数据
当我们的容器写入todo.db文件时,它将被持久化到卷中的主机。
用来干嘛:
- 容器内数据的持久化
- 与其他容器或者应用共享数据
特点
- 数据卷可在容器之间共享或重用数据
- 数据卷中的更改不会包含在镜像的更新中
- 卷中的更改可以直接生效
- 数据卷的生命周期一直持续到没有容器使用它为止
分类
默认 Docker 引擎安装支持的两种主要卷类型
命名卷(具名挂载)
使用了一个命名卷来将数据持久化到我们的数据库中。如果我们只是想存储数据,命名卷非常好,因为我们不必担心数据存储在哪里。
-v 卷名:容器内路径
匿名挂载
-v 容器内路径
绑定挂载
使用绑定挂载,我们可以控制主机上的确切挂载点。我们可以使用它来持久化数据,但它通常用于向容器中提供额外的数据。
-v 宿主机路径:容器内路径
查看数据通过卷实际存在哪 ?
docker volume inspect 卷名
Mountpoint是存储数据的磁盘上的实际位置。请注意,在大多数机器上,您需要具有 root 访问权限才能从主机访问此目录。
在 Docker Desktop 中运行时,Docker 命令实际上是在您机器上的一个小型 VM 中运行。如果您想查看 Mountpoint 目录的实际内容,您需要首先进入 VM。
如果是使用windows11 + WSL2 ,那么卷的存放路径如下:
\\wsl.localhost\docker-desktop-data\version-pack-data\community\docker\volumes
基本命令
docker volume create 卷名 #创建数据卷
docker volume inspect 卷名 #显示数据卷的详细信息
docker volume ls #列出所有的数据卷
prune #删除所有未使用的 volumes,并且有 -f 选项
rm #删除一个或多个未使用的 volumes,并且有 -f 选项
容器网络
每个容器都有自己的IP地址,不同容器之间要通信需要在同一网络上
基本命令
docker network create 网络名
环境变量
镜像分层
可以看到用于在图像中创建每个图层的命令。
docker image history 镜像名
每条线代表图像中的一层。此处的显示在底部显示基础,在顶部显示最新层。使用它,您还可以快速查看每一层的大小,帮助诊断大图像。
获得完整的输出
docker image history --no-trunc 镜像名
镜像层缓存
一旦层发生变化,所有下游层也必须重新创建