概述
1. 主页面
在带有 GUI 的系统中,如 Windoiws、Ubuntu Desktop、Mac(一般不会在MacOS上使用 Docker,仅供练习)上,通过下载并安装 Docker Desktop 不仅获得了基本的 docker-cli,同时拥有了一个图形化的 UI 管理界面,这个 UI 界面具备了 Docker 的基本管理功能。其基本界面如图所示:
在其 SideBar 区域可以对右侧主页面进行切换,包括:“Containers”(容器页面)、“Images”(镜像页面)、“Volumns”(空间页面)、“Builds”(构建页面)、“Dev Enviroments”(开发环境页面)、“Docker Scout”(高级图像分析页面)。
在Docker Desktop主界面的 Header中设置按钮可以切换到设置页面,如图所示:
2. Container页面
2.1 容器主页面
Docker Desktop 的 Container 页面提供了对 Docker 容器的详细视图和管理选项。以下是该页面的主要功能和组件的详细介绍:
容器状态图表
显示图表:此选项允许用户查看容器的资源使用情况,例如 CPU 和内存使用情况。
- 容器 CPU 使用率:显示当前容器的 CPU 使用率,例如“0.00% / 1000%(10 核心可用)”,表示当前 CPU 使用率是 0.00%,总共有 1000% 的 CPU 资源(对应于 10 个核心)。
- 容器内存使用率:显示当前容器的内存使用情况,例如“4.09MB / 7.5GB”,表示当前使用了 4.09 MB 的内存,总共有 7.5 GB 可用。
容器列表
- 只显示运行中的容器:此选项允许用户筛选只显示当前正在运行的容器。
- 删除:用户可以选择一个或多个容器进行删除操作。
容器详细信息
每个容器在列表中都有以下详细信息:
- 名称:容器的名称,例如“happy_wilbur”。
- 镜像:容器使用的镜像 ID,例如“89537e78a991”。
- 状态:容器的当前状态,如“运行中”、“已退出”或“已退出(255)”等。
- CPU (%):容器当前的 CPU 使用率。
- 端口:容器开放的端口信息,如“443:443”。可以选择“显示所有端口”查看更多端口信息。
- 最后启动时间:容器最后一次启动的时间,例如“1 小时前”或“20 天前”。
- 操作:针对每个容器的操作选项,如查看详情、停止、重启等。
底部操作栏
- 选择数量提示:显示用户在容器列表中选择的容器数量,例如“选中 1 个,共 3 个”。
2.2 容器详情页
打开指定容器的省略菜单,点击“View details”(查看详情)选项可以打开“容器”
1.Logs(日志)
Docker 容器的日志记录了容器内部运行过程中产生的各种输出信息,这些信息对于理解和监控容器的运行状态、调试问题以及安全审计非常重要。
Docker 容器日志通常包含以下类型的信息:
- 应用日志:
- 容器内运行的应用程序产生的标准输出和标准错误。
- 比如,Web 服务器的访问日志、错误日志等。
- 系统日志:
- 操作系统层面的消息,如启动日志、系统错误等。
- 包括对系统资源的调用结果,如文件操作、网络请求等。
- 服务状态变化:
- 服务的启动、停止、重启以及任何异常终止。
- 更新或配置更改的记录。
- 安全相关信息:
- 安全警告、错误或其他安全相关的事件。
- 登录尝试、权限变更等信息。
- 依赖关系变化:
- 安装、更新或删除软件包的记录。
- 比如,APT 或 YUM 管理器的日志。
- 资源使用情况:
- CPU、内存、磁盘使用情况的快照。
- 网络流量和连接状态信息。
- 交互操作:
- 用户与容器交互的记录,如通过 Docker 命令行执行的命令。
- 比如,你提供的日志中的
apt update
和apt upgrade
命令及其输出。
这些日志信息可以通过 Docker 日志驱动程序(如 json-file
、syslog
、journald
等)进行管理,支持日志的轮转、清理以及远程传输等功能。管理员和开发者依赖这些日志来确保容器的健康运行,进行问题诊断和性能调优。
2.检查(Inspect)
inspect
命令在 Docker 中被广泛使用,用于获取容器和镜像的元数据。它主要包含以下信息:
- 基本信息:
Id
: 容器的唯一标识符。Created
: 容器创建的时间戳。Path
: 容器启动时执行的命令。Args
: 启动命令的参数列表。
- 状态(State):
Status
: 容器当前的状态(如running
)。Running
: 容器是否正在运行。Paused
: 容器是否已暂停。Restarting
: 容器是否正在重启。OOMKilled
: 容器是否因为内存不足而被杀死。Dead
: 容器是否已死亡。Pid
: 容器进程的 ID。ExitCode
: 容器退出时的退出码。Error
: 容器的错误信息。StartedAt
: 容器最近一次启动的时间。FinishedAt
: 容器最近一次终止的时间。
- 镜像(Image):
- 容器使用的镜像的 SHA256 散列值。
- 文件路径:
ResolvConfPath
,HostnamePath
,HostsPath
,LogPath
: 容器内相关文件的路径。
- 容器名称(Name):
- 容器的名称。
- HostConfig:
- 包含了容器的配置信息,如绑定的端口、日志配置、网络模式、重启策略、资源限制等。
PortBindings
: 映射到宿主机的端口。RestartPolicy
: 容器的重启策略。
- 网络设置(NetworkSettings):
- 容器的网络配置,如 IP 地址、网关、MAC 地址等。
- 图形驱动(GraphDriver):
- 与容器文件系统有关的信息,包括不同层的路径。
- 配置(Config):
- 容器的一些基本配置,如环境变量、命令、工作目录、暴露的端口等。
下面是一个 Docker Container 的 Inspect样本:
{ // 容器的唯一标识符 "Id": "89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736", // 容器创建的时间戳 "Created": "2023-12-21T18:21:59.4061895Z", // 容器启动时执行的命令 "Path": "/bin/bash", // 启动命令的参数列表 "Args": [], "State": { "Status": "running", // 容器当前状态(运行中) "Running": true, // 容器是否正在运行 "Paused": false, // 容器是否已暂停 "Restarting": false, // 容器是否正在重启 "OOMKilled": false, // 容器是否因内存溢出而被杀死 "Dead": false, // 容器是否已死亡 "Pid": 957, // 容器进程的 ID "ExitCode": 0, // 容器退出时的退出码 "Error": "", // 容器的错误信息 // 容器最近一次启动的时间 "StartedAt": "2024-01-02T01:57:49.549667529Z", // 容器最近一次终止的时间 "FinishedAt": "2023-12-25T00:22:00.3188126Z" }, // 容器使用的镜像的散列值 "Image": "sha256:b6548eacb0639263e9d8abfee48f8ac8b327102a05335b67572f715c580a968e", // DNS 解析配置文件路径 "ResolvConfPath": "/var/lib/docker/containers/89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736/resolv.conf", // 容器主机名文件路径 "HostnamePath": "/var/lib/docker/containers/89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736/hostname", // 容器 hosts 文件路径 "HostsPath": "/var/lib/docker/containers/89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736/hosts", // 容器日志文件路径 "LogPath": "/var/lib/docker/containers/89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736/89537e78a991f604c00738ddbf4bd1437356e7145e316d401692451f174ba736-json.log", // 容器的名称 "Name": "/happy_wilbur", // 容器重启次数 "RestartCount": 0, // 使用的存储驱动 "Driver": "overlay2", // 容器平台 "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", // 正在运行的执行命令的 ID "ExecIDs": [ "150c2f32d99fbce403388a36dd7d0cc5b78ac1f6575f73b5863f26dbde9d694c" ], // 容器的宿主机配置 "HostConfig": { // 绑定的卷 "Binds": null, "ContainerIDFile": "", // 日志配置 "LogConfig": { "Type": "json-file", "Config": {} }, // 网络模式 "NetworkMode": "default", // 端口绑定 "PortBindings": { "443/tcp": [ { "HostIp": "", "HostPort": "443" } ], "80/tcp": [ { "HostIp": "", "HostPort": "80" } ], "8888/tcp": [ { "HostIp": "", "HostPort": "8888" } ] }, // 重启策略 "RestartPolicy": { "Name": "no", // 不自动重启 "MaximumRetryCount": 0 // 最大重试次数 }, "AutoRemove": false, // 当容器停止时是否自动移除容器 "VolumeDriver": "", // 容器使用的卷驱动 "VolumesFrom": null, // 允许容器从其他容器挂载卷 // 容器内控制台的大小,格式为 [高, 宽] "ConsoleSize": [ 30, 120 ], // 用于增加容器的 Linux 能力 "CapAdd": null, // 用于删除容器的 Linux 能力 "CapDrop": null, // 容器的 cgroup 命名空间模式 "CgroupnsMode": "host", // 容器的 DNS 服务器 "Dns": [], // 容器的 DNS 选项 "DnsOptions": [], // 容器的 DNS 搜索域 "DnsSearch": [], // 容器的 /etc/hosts 中额外添加的主机名记录 "ExtraHosts": null, // 容器内进程要添加的额外用户组 ID "GroupAdd": null, // 容器的 IPC 命名空间模式 "IpcMode": "private", // 容器的 cgroup 配置 "Cgroup": "", // 容器与其他容器的链接 "Links": null, // 容器的 OOM 评分调整值 "OomScoreAdj": 0, // 容器的进程 ID 命名空间模式 "PidMode": "", // 是否以特权模式运行容器 "Privileged": false, // 是否将所有暴露的端口映射到主机上 "PublishAllPorts": false, // 容器的根文件系统是否为只读 "ReadonlyRootfs": false, // 容器的安全选项 "SecurityOpt": null, // 容器的 UTS 命名空间模式 "UTSMode": "", // 容器的用户命名空间模式 "UsernsMode": "", // 容器的共享内存大小 "ShmSize": 67108864, // : 容器使用的运行时 "Runtime": "runc", // 容器的隔离技术 "Isolation": "", // 分配给容器的相对 CPU 权重 // 在同一宿主机上运行的所有容器的默认值是 1024。 // 因此,如果一个容器的 CpuShares 设置为 512, // 它将获得一半的 CPU 时间相比于设置为 1024 的容器 "CpuShares": 0, // 容器可以使用的最大内存量(单位为字节) // 如果容器超过此限制,它可能会被终止 "Memory": 0, // 以 1e9 分之一核心为单位分配给容器的 CPU // 例如,设置为 500000000 表示分配 0.5 个 CPU 核心 "NanoCpus": 0, // 容器的 cgroup 父节点 "CgroupParent": "", // 容器在 I/O 操作中的权重(范围为 10 到 1000) "BlkioWeight": 0, // 特定块设备的 I/O 权重 "BlkioWeightDevice": [], // 限制特定块设备的读取速率(字节/秒) "BlkioDeviceReadBps": [], // 限制特定块设备的写入速率(字节/秒) "BlkioDeviceWriteBps": [], // 限制特定块设备的读取 I/O 操作数(操作/秒) "BlkioDeviceReadIOps": [], // 限制特定块设备的写入 I/O 操作数(操作/秒) "BlkioDeviceWriteIOps": [], // CPU 调度周期的长度(微秒) // 与 CpuQuota 一起用于限制 CPU 使用率 "CpuPeriod": 0, // 指定周期内可使用的 CPU 时间(微秒) "CpuQuota": 0, // 实时 CPU 调度周期的长度(微秒) "CpuRealtimePeriod": 0, // 实时 CPU 调度的时间配额(微秒) "CpuRealtimeRuntime": 0, // 容器可以使用的 CPU 核心 "CpusetCpus": "", // 容器可以使用的内存节点 "CpusetMems": "", // 容器允许访问的设备 "Devices": [], // 自定义设备 cgroup 规则 "DeviceCgroupRules": null, // 容器的设备请求 "DeviceRequests": null, // 容器的内存保留限制 // Docker 会尽量保证容器至少有这么多内存 "MemoryReservation": 0, // 容器使用的最大内存 + swap 空间量 // 设置为 -1 表示不限制 swap "MemorySwap": 0, // 一个 0 到 100 的值,表示容器对 swap 的倾向 // 较低的值更倾向于使用 RAM // 较高的值更倾向于使用 swap "MemorySwappiness": null, // 是否禁用 OOM Killer "OomKillDisable": false, // 容器的进程数限制 "PidsLimit": null, // 容器的用户限制 "Ulimits": null, // 分配给容器的 CPU 核心数 "CpuCount": 0, // 在 Windows 系统上,限制容器可以使用的总 CPU 百分比 "CpuPercent": 0, // 限制容器每秒可以执行的最大 I/O 操作数 "IOMaximumIOps": 0, // 限制容器的 I/O 带宽(单位为字节/秒) "IOMaximumBandwidth": 0, // 容器中的路径限制 // 这些路径在容器内被“屏蔽”,容器内的进程看到的是一个空内容或最小内容的文件 // 这主要用于安全和隔离 "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], // 这些路径在容器中是只读的 // 用于防止容器修改宿主机的关键系统文件 "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, // 图形驱动信息 "GraphDriver": { "Data": { // 较低层的目录 "LowerDir": "/var/lib/docker/overlay2/99e2c6e5f2b1edbd8897b662b97acfa316000b99a06acd50891ba3900e4fa273-init/diff:/var/lib/docker/overlay2/fa49f6c7b02c1ad173fe44e91854ef575bfa34491ca80d7b6228edce141b8f7d/diff", // 合并后的目录 "MergedDir": "/var/lib/docker/overlay2/99e2c6e5f2b1edbd8897b662b97acfa316000b99a06acd50891ba3900e4fa273/merged", // 较上层的目录 "UpperDir": "/var/lib/docker/overlay2/99e2c6e5f2b1edbd8897b662b97acfa316000b99a06acd50891ba3900e4fa273/diff", // 工作目录 "WorkDir": "/var/lib/docker/overlay2/99e2c6e5f2b1edbd8897b662b97acfa316000b99a06acd50891ba3900e4fa273/work" }, // 驱动名称 "Name": "overlay2" }, // 挂载点 "Mounts": [], // ... 容器的基本配置,如主机名、环境变量、命令等 ... "Config": { // 容器内的主机名 "Hostname": "89537e78a991", // 容器内的域名 "Domainname": "", // 容器内的用户 "User": "", // 是否将容器的标准输入附加到宿主机的输入 "AttachStdin": true, // 是否将容器的标准输出附加到宿主机的输出 "AttachStdout": true, // 是否将容器的标准错误附加到宿主机的错误输出 "AttachStderr": true, // 容器暴露的端口 "ExposedPorts": { "443/tcp": {}, "80/tcp": {}, "8888/tcp": {} }, // 容器是否分配一个伪 TTY 终端 "Tty": true, // 是否开放容器的标准输入 "OpenStdin": true, // 是否在容器的标准输入上读取数据一次后关闭 "StdinOnce": true, // 容器的环境变量 "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], // 容器启动时执行的命令 "Cmd": [ "/bin/bash" ], // 创建容器时使用的镜像 "Image": "b6548eacb063", // 容器挂载的卷 "Volumes": null, // 容器的工作目录 "WorkingDir": "", // 容器启动时执行的入口点 "Entrypoint": null, // 构建该镜像时将执行的命令 "OnBuild": null, // 容器的标签 "Labels": { "org.opencontainers.image.ref.name": "ubuntu", "org.opencontainers.image.version": "22.04" } }, // 网络设置 "NetworkSettings": { // 容器所使用的网络桥接名称 "Bridge": "", // 容器的沙盒 ID "SandboxID": "ced3b2acaf400d1ee19ad37528497c586ee3362cfbcc5d51892cdf3ace6ed4fc", // 容器网络的发夹模式 "HairpinMode": false, // 容器的本地 IPv6 地址 "LinkLocalIPv6Address": "", // 容器的本地 IPv6 前缀长度 "LinkLocalIPv6PrefixLen": 0, // 容器暴露的端口及其映射到宿主机的端口 "Ports": { "443/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "443" } ], "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "80" } ], "8888/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "8888" } ] }, // 容器的网络沙盒键值 "SandboxKey": "/var/run/docker/netns/ced3b2acaf40", // 容器的次要 IPv4 地址 "SecondaryIPAddresses": null, // 容器的次要 IPv6 地址 "SecondaryIPv6Addresses": null, // 容器网络端点的 ID "EndpointID": "5c446150fe0837fc20d93869efa7c74eb7e0705f67e39e8be1192ed1596b4f56", // 容器的网关地址 "Gateway": "172.17.0.1", // 容器的全局 IPv6 地址 "GlobalIPv6Address": "", // 容器的全局 前缀长度 "GlobalIPv6PrefixLen": 0, // 容器的 IP 地址 "IPAddress": "172.17.0.2", // 容器的前缀长度 "IPPrefixLen": 16, // 容器的 IPv6 网关地址 "IPv6Gateway": "", // 容器的 MAC 地址 "MacAddress": "02:42:ac:11:00:02", // 容器连接的网络及其相关配置 "Networks": { // 使用的网络类型,这里是 Docker 默认的桥接网络 "bridge": { // IP 地址管理配置 "IPAMConfig": null, // 容器与其他容器的链接 "Links": null, // 网络别名 "Aliases": null, // 容器的 MAC 地址 "MacAddress": "02:42:ac:11:00:02", // 网络的唯一标识符 "NetworkID": "10e4822cc08307946f6c0f9928438b1a318cea9f2f3dc9716a8c1edbf70a0514", // 网络端点的唯一标识符 "EndpointID": "5c446150fe0837fc20d93869efa7c74eb7e0705f67e39e8be1192ed1596b4f56", // 网络网关的 IP 地址 "Gateway": "172.17.0.1", // 容器在 Docker 网络中的 IP 地址 "IPAddress": "172.17.0.2", // IP 地址的前缀长度 // 通常与子网掩码相关 "IPPrefixLen": 16, // 容器的 IPv6 网关 "IPv6Gateway": "", // 容器的 IPv6 地址 "GlobalIPv6Address": "", // 容器的 IPv6 前缀长度 "GlobalIPv6PrefixLen": 0, // 网络驱动的特定选项 "DriverOpts": null } } } }
这个 inspect 输出提供了容器的详细快照,包括它的配置、状态和网络设置。这对于调试、监控和理解容器的行为非常有用。例如,如果你需要知道容器为什么没有正确启动,可以检查 State 部分查看 Error 字段。如果你想知道容器暴露哪些端口,可以查看 NetworkSettings 部分。这些信息对于日常的 Docker 使用和管理至关重要。
3. Bind mounts
(1)用途
在 Docker 中,Bind Mounts 是一种将宿主机上的文件或目录挂载到容器中的机制。这允许容器访问和修改宿主机上的文件和目录。其用途具体包含了以下几个方面:
- 共享数据:容器可以使用 bind mounts 从宿主机访问数据,也可以将其输出数据到宿主机。
- 配置管理:将配置文件放置在宿主机上,然后通过 bind mount 挂载到容器内,便于管理和更新配置。
- 日志处理:将容器的日志文件直接输出到宿主机,便于集中管理和分析。
- 开发环境:在开发过程中,可以将源代码目录挂载到容器内,使得代码更改可以立即在容器内反映。
(2)特点
Bind mounts 在 Docker 的使用中非常常见,其特点如下:
- 直接映射:Bind mount 直接映射宿主机上的文件或目录到容器内部。它们不是 Docker 托管的,而是直接使用宿主机的文件系统。
- 数据持久化:通过 bind mounts,可以在容器停止或删除后保持数据的持久化,因为数据实际上存储在宿主机上。
- 即时更新:在宿主机上对挂载的文件或目录所做的更改会立即反映在容器中,反之亦然。
(3)创建和使用
Bind mounts 在创建容器时通过 docker run
命令的 -v
或 --mount
选项指定。例如:
docker run -v /path/on/host:/path/in/container ...
或
docker run --mount type=bind,source=/path/on/host,target=/path/in/container ...
这里,/path/on/host
是宿主机上的路径,/path/in/container
是容器内的目标路径。
(4)注意事项
- 安全:Bind mounts 可以让容器访问宿主机的敏感文件和目录,因此需要小心处理权限和安全问题。
- 依赖:容器对宿主机路径的依赖可能导致在不同环境下容器的可移植性降低。
总之,Bind mounts 是 Docker 中一种非常强大和灵活的功能,允许容器与宿主机系统进行高效的数据共享和交互。正确使用时,它们可以极大地增强容器的实用性和灵活性。
4. Exec(执行)
执行页面包含一个模拟终端子窗口,可以在该子窗口中执行命令:
5. Files(文件)
文件页面提供了容器中目录和文件的树形目录浏览方式。当下可以在该页面直接导入导出和删除文件,并且内置了一个带有语法高亮的文本编辑器,允许操作者对文本进行编辑和修改:
6. Stats(状态)
状态页面提供了容器各种参数的监控面板,包括了CPU使用率、内存使用率、磁盘读写、网络 I/O:
3. Images(镜像)页面
3.1 Images页面功能
Docker Desktop 的 Images 页面是管理 Docker 镜像的中心界面,它提供了对本地存储的 Docker 镜像进行查看、管理和操作的功能。其主要功能包括:
- 镜像管理:用户可以查看、删除或更新存储在本地的 Docker 镜像。
- 容器创建:从这些镜像可以创建新的容器。
- 资源监控:监控镜像所占用的磁盘空间。
- 版本控制:管理不同版本的镜像,方便回滚和更新。
- 镜像分享:导出镜像以供他人使用或上传到远程仓库。
通过截图可以看到在其页面布局中展示的镜像可以分为“Local”(本地)、“Hub”、“Artifactory”三个部分
3.2 Local 标签页
在 Local 标签页中,用户可以管理存储在本地计算机上的 Docker 镜像。其主要功能包括:
- 镜像列表:显示本地存储的所有 Docker 镜像,包括镜像名、标签、状态(是否正在使用)、创建时间和大小。
- 空间信息:显示当前使用的和总共可用的镜像存储空间。
- 镜像操作:提供对镜像进行的各种操作,如运行、删除、查看详情等。
- 搜索功能:允许用户搜索特定的本地镜像。
- 刷新状态:展示上次刷新镜像列表的时间。
3.3 Hub 标签页
在 Hub 标签页中,用户可以连接到 Docker Hub,这是一个用于发现和共享容器镜像的云服务。其主要功能和特点包括:
- 搜索和浏览:允许用户搜索和浏览 Docker Hub 上的公共和私有镜像库。
- 镜像信息:显示镜像的标签、操作系统、潜在的安全漏洞、最后推送时间和大小。
- 仪表盘:查看镜像的安全评估报告。
- 镜像拉取:直接从 Docker Hub 拉取镜像到本地。
- 分页浏览:对镜像列表进行分页处理,方便用户浏览。
3.3 Artifactory 标签页
Artifactory 标签页提供了与 JFrog Artifactory 的集成,这是一个先进的二进制仓库管理平台。其功能包括:
- 仓库集成:通过 Docker Scout 连接到 Artifactory 仓库,实现远程集成。
- 镜像分析:拉取 Artifactory 仓库中的镜像,并在本地运行 Docker Scout 的镜像分析。
4. 构建页面
Docker Desktop 的 Builds 页面是 Docker Desktop 的一个重要组成部分,为用户提供了一个方便的界面来从源代码构建、管理和监控 Docker 镜像。这个页面对于那些需要频繁构建和更新容器镜像的开发者尤其有用。其主要功能包括:
- 镜像构建:从源代码或 Dockerfile 构建新的 Docker 镜像。这是该页面的核心功能。
- 构建历史和状态监控:查看以前的构建历史和当前构建的状态。
- 选择和管理构建器:可以选择或更改用于构建镜像的构建器(例如 Docker 的 BuildKit)。
- 平台选择:支持为不同的平台(如 Linux, Windows)构建镜像。
通过截图可以看到在其页面布局中:
- 构建记录(Build records):展示了历史构建的列表,包括构建的 ID、名称、使用的构建器、状态、持续时间、创建时间和作者等信息。
- 搜索和过滤:用户可以搜索特定的构建记录或通过过滤器(如“仅显示我的构建”)查看特定的记录。
- 指示和指南:提供了使用指南,例如如何启动新的构建(通常是通过在终端运行
docker build .
命令)。
- 无活动构建提示:当没有进行中的构建时,会显示相应的信息。
5. 开发环境
Docker Desktop的Dev Environments页面旨在简化和改进开发团队的工作流程:
- 定义项目配置:Dev Environments页面允许你将项目的配置以代码的形式定义。这意味着你可以使用Docker Compose或其他容器编排工具来创建配置文件,明确定义项目所需的所有容器、服务和依赖关系。这将环境配置从手动设置转变为可管理的代码。
- 分发项目:一旦项目配置被定义为代码,你可以轻松地将其分享给你的开发团队。这有助于确保每个开发人员都能使用相同的环境和配置,减少了因环境差异而导致的问题。
- 协同开发:Dev Environments页面使整个团队能够轻松启动项目的完整环境,包括容器、服务和依赖项。这意味着所有开发人员都可以在相同的环境中工作,确保了代码的一致性和可重复性。
- 示例运行:页面还提供了一个示例运行选项,允许你快速了解如何使用Dev Environments页面来管理项目的环境。这有助于新用户迅速掌握该功能的工作原理。
通过这些功能,Dev Environments页面使开发团队更容易定义、分享和协作在统一的开发环境下工作,从而提高了开发效率,减少了环境配置问题,并促进了团队之间的协作和项目的一致性。
点击创建(“Create”)按钮用于创建一个全面的开发环境:
5.1 Overview(概览)
- 此部分提供了对正在创建的Dev环境的概述。
- 它描述了Dev环境的主要目的,即在本地使用容器作为完整的开发环境。
- 强调了能够一键共享代码(包括依赖项)给团队成员的便捷性。
- 提到了能够在Visual Studio Code中快速切换分支或并行运行它们的功能,以加快开发速度。
5.2 Setup(设置)
- 此步骤通常包括配置Dev环境的详细设置。
- 用户可能需要选择使用的容器镜像、定义容器的运行参数、指定共享代码的位置等。
- 这一步旨在确保Dev环境满足特定项目或开发需求。
如果选择一个存在的 Git 仓库,且使用 VSCode,需要安装“Dev Container”插件:
插件地址为:https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers
5.3 Preparing(准备)
- 在此阶段,Docker将根据你的设置创建和配置Dev环境。
- 这可能涉及拉取和构建容器镜像、设置网络连接以及将项目代码和依赖项加载到容器中。
- 这是Dev环境准备工作的阶段。
5.4 Ready(就绪)
- 一旦Dev环境创建并配置完成,用户将看到Dev环境已经准备就绪。
- 在此阶段,你可以点击"Start"按钮启动Dev环境,然后就可以开始使用它来开发项目了。
- 这是Dev环境的最后准备和启动阶段。
创建完成后可以看到已经创建的环境:
6. Scout(高级图像分析)页面
6.1 Docker Scout简介
容器镜像通常是由其他容器镜像和软件包的层构建而成的。这些层和包可能包含使你的容器及其运行的应用程序容易受到攻击的漏洞。
Docker Scout 可以帮助你主动发现并修复这些漏洞,帮助你创建更安全的软件供应链。它通过分析你的镜像并创建一个完整的包和层清单,称为 软件物料清单(SBOM)。然后,它将此清单与持续更新的漏洞数据库进行关联,以识别你镜像中的漏洞。
你可以在 Docker Desktop、Docker Hub、Docker CLI 和 Docker Scout 仪表板 中使用 Docker Scout。Docker Scout 还支持与第三方系统集成,有关更多信息,请参阅集成 Docker Scout。
6.2 Docker Scout 快速入门
该指南翻译与官方给出的案例,更多信息参考:https://github.com/docker/scout-demo-service
Docker Scout 分析镜像内容并生成包和检测到的漏洞的详细报告。它可以为你提供修复镜像分析发现的问题的建议。
本指南采用一个容易受攻击的容器镜像,向你展示如何使用 Docker Scout 识别和修复漏洞,比较不同时间的镜像版本,并与团队共享结果。
第 1 步:设置
这个示例项目包含一个容易受攻击的 Node.js 应用程序,你可以使用它来跟随操作。
克隆其仓库:
$ git clone https://github.com/docker/scout-demo-service.git
进入目录:
$ cd scout-demo-service
构建镜像,命名为与你将推送到的组织匹配,并标记为 v1
:
$ docker build -t ORG_NAME/scout-demo:v1 .
在 Docker Hub 上创建并推送仓库:
$ docker push ORG_NAME/scout-demo:v1
重要
在推送前,请确保你已登录到 Docker CLI 或 Docker Desktop。
第 2 步:启用 Docker Scout
Docker Scout 默认分析所有本地镜像。要分析远程仓库中的镜像,你需要首先启用它。你可以从 Docker Hub、Docker Scout 仪表板和 CLI 进行此操作。在概述指南中了解如何操作。
- 使用
docker login
命令登录到你的 Docker 帐户,或在 Docker Desktop 中使用登录按钮。
- 使用 Docker CLI
docker scout repo enable
命令启用现有仓库的分析:
$ docker scout repo enable --org ORG_NAME ORG_NAME/scout-demo
第 3 步:分析镜像
构建后,你可以使用 Docker Desktop 或 docker scout
CLI 命令查看 Docker Scout 检测到的。
- 使用 Docker Desktop,在镜像视图中选择镜像名称以查看镜像层视图。在镜像层次结构部分,你可以
看到哪些层引入了及其详细信息。
- 选择第 5 层以重点关注该层引入的。
- 切换express 4.17.1旁边的披露三角形,然后是 CVE ID(在本例中为
CVE-2022-24999
)以查看的详细信息。
你也可以使用 Docker CLI 查看相同的结果。
$ docker scout cves ORG_NAME/scout-demo:v1
Docker Scout 通过从多个来源不断地摄取和整合漏洞数据来创建并维护其漏洞数据库。这些来源包括许多可识别的包仓库和值得信赖的安全追踪器。你可以在咨询数据库文档中找到更多详细信息。
提示
了解如何使用 CLI 命令
scout cves
过滤结果。
第 4 步:修复应用
Docker Scout 建议的修复方法是将底层容易受的 express 版本更新到 4.17.3 或更高版本。
- 使用新的包版本更新
package.json
文件。
… "dependencies": { "express": "4.17.3" … }
重建镜像,给它一个新的版本标签:
$ docker build -t ORG_NAME/scout-demo:v2 .
使用新的版本标签将镜像推送到 Docker Hub 上的同一仓库:
$ docker push ORG_NAME/scout-demo:v2
现在,在 Docker Desktop、Docker Scout 仪表板或 CLI 中查看镜像的最新标签时,你可以看到你已修复。
第 5 步:修复基础镜像中的
除了识别应用外,Docker Scout 还可以帮助你识别并修复你的镜像所使用的基础镜像中的问题。
- 在 Docker Scout 仪表板上,你可以通过在镜像层视图中选择推荐修复按钮来查看这些建议。
- 从按钮中选择基础镜像的建议选项。在出现的对话框中,选择你要使用的基础镜像的新版本,并将建议复制到你的
Dockerfile
中。 - 再次重建镜像,并带上一个新标签:
$ docker build -t ORG_NAME/scout-demo:v3 .
使用新版本标签将其推送到 Docker Hub:
$ docker push ORG_NAME/scout-demo:v3
在 Docker Desktop 或 Docker Scout 仪表板中选择新的镜像标签,你可以看到基础镜像已经更新,消除了许多。
你也可以使用 Docker CLI 命令查看:
$ docker scout cves ORG_NAME/scout-demo:v3
第 6 步:合作解决
你可以在 Docker Scout 仪表板上查看并分享有关镜像以及组织中其他镜像的同一信息。
所有组织成员都可以从集成的容器注册表中看到其所有镜像的概述,并随时获得修复建议。这有助于安全、合规和运营团队成员知道要关注哪些漏洞和问题。
- 在 Docker Scout 仪表板上选择 镜像 标签页。
- 选择 最新镜像 列下的任一标签,你可以看到与在 Docker Desktop 和 Docker CLI 中看到的相同的漏洞信息,并与组织中的其他人分享此链接。
提示
如果你是多个组织的成员,请确保从右上角的下拉菜单中选择正确的组织。
第 7 步:比较镜像
随着时间的推移,当你构建和推送新标签的镜像时,你可以使用 Docker Scout CLI 和仪表板来比较同一镜像不同标签的和包的变化。
在 Docker Scout 仪表板上,从 镜像 列表中选择要比较的仓库。在这个例子中是 scout-demo。
选择你在上一步推送的两个标签进行比较,例如 v1 和 v3,然后选择 比较镜像。
镜像比较 视图显示了这两个标签之间的差异。页面的顶部总结了两个标签,包括基础镜像标签之间的差异。
在页面的底部,你可以看到两个标签之间的包和变化。在 “express” 行中,你可以看到版本从 4.17.1 变更为 4.17.3。切换标签页,查看两个标签之间的变化。你可以看到 CVE-2022-24999 不再出现在 v3 标签下。
6.3 仪表板
Docker Scout 仪表板帮助你与团队共享组织中镜像的分析。开发者现在可以看到他们在 Docker Hub 和 Artifactory 的所有镜像的安全状态概览,并且可以轻松获得修复建议。它帮助安全、合规和运营等角色的团队成员知道需要关注哪些和问题。
概览
概览标签页提供了所选组织中仓库的摘要。
在此页面的顶部,你可以选择要查看的环境。默认情况下,显示最近推送的镜像。要了解更多关于环境的信息,请参见环境监控。
策略框显示了你当前对每项策略的合规评级,以及所选环境的趋势指示。趋势描述了与上一版本相比,最近镜像的策略变化。关于策略的更多信息,请参见策略评估。
图表显示了所选环境中镜像的总漏洞数随时间的变化。你可以使用下拉菜单配置图表的时间尺度。
使用网站顶部的头部菜单访问 Docker Scout 仪表板的不同主要部分:
镜像
镜像视图显示组织中的镜像列表。你可以使用搜索框搜索特定仓库。
列表中的每个条目显示以下详细信息:
- 镜像的仓库名称。选择仓库链接将打开该仓库的标签列表。
- 所选环境中镜像的最新标签。选择基础镜像的链接将打开镜像详细视图。
- 镜像的操作系统和架构。
- 镜像的最后推送日期。
- 最新镜像版本的。
- 策略状态,包括最新版本的变化,以及对不合规镜像的更多详细信息的链接。
仓库标签列表
此页面有两个标签页:
- 策略标签页显示了镜像的最新版本的策略差异。
- 标签标签页包含仓库标签列表,并显示了该仓库的所有标签。
在标签标签页中,你可以使用搜索框按环境或标签或摘要过滤列表。
列表
中的每个条目显示以下详细信息:
- 一个复选框,用于将标签标记为与另一个进行比较。
提示
通过选择列表顶部的比较镜像按钮,并选中两个镜像标签旁的复选框,比较两个镜像标签。
比较镜像
你可以比较列表中的两个或多个镜像。标记你要比较的镜像版本,然后选择比较镜像。
比较视图的顶部部分显示了两个选定镜像标签的概览。视图的标签部分显示以下内容:
- 选择包标签以查看每个镜像中添加、删除或更改的包。表格中的每个条目显示了两个镜像中版本和漏洞的差异。选择包旁边的披露三角形可查看变化的的更多详细信息。
- 选择标签以查看每个镜像中出现的变化。
镜像详细视图
选择镜像标签将进入镜像详细视图。此视图包含两个标签,让你深入了解镜像的组成和策略合规情况:策略状态和镜像层。
策略状态 镜像层
策略标签向你展示了镜像的策略评估结果。使用右侧的查看详情和查看修复链接查看完整的评估结果,并了解如何提高不合规镜像的合规评分。
有关策略的更多信息,请参见策略评估。
策略
策略视图显示所选组织和环境中所有镜像的策略合规情况的分解。你可以使用镜像下拉菜单查看特定环境的策略分解。
有关策略的更多信息,请参见策略评估。
基础镜像
基础镜像 视图显示组织中使用的所有基础镜像。
列表中的每个条目显示以下详细信息:
- 基础镜像名称。
- 组织中镜像使用的基础镜像的版本。
- 使用基础镜像的镜像数量。选择链接将打开使用该基础镜像的镜像列表视图。
- 基础镜像中的包数量。
使用基础镜像的镜像
镜像 标签页显示使用特定基础镜像的组织中的所有镜像。
列表中的每个条目显示以下详细信息:
- 仓库名称。选择链接将打开仓库标签列表视图。
- 镜像的最新标签及其漏洞。选择标签链接将打开该仓库的镜像层详细视图。
- 镜像的操作系统和架构。
- 仓库使用的基础镜像标签。选择链接将打开该版本的镜像层详细视图。
- 仓库当前使用的基础镜像摘要。
- 仓库最后推送的日期。
包
包 视图显示组织中跨仓库的所有包。
列表中的每个条目显示以下详细信息:
- 包名称。
- 包类型。
- 组织中镜像使用的包的版本。
- 使用该包的镜像数量。
视图显示组织中镜像的所有列表。你可以按严重性对列表进行排序和筛选,并使用搜索框搜索常见和暴露(CVE)ID。
列表中的每个条目显示以下详细信息:
- 严重性。
注意
Docker Scout 基于多种来源的数据计算此严重性等级。
- 严重性。
- CVE ID。选择 CVE ID 链接将打开详细信息页面。
- 受此 CVE 影响的包名称和版本。
- 公共评分系统(CVSS)分数。Docker Scout 显示多个来源中最高的 CVSS 分数。
- 组织中使用受此 CVE 影响的包的镜像数量。选择此链接将打开详细信息页面。
- Docker Scout 是否知道此的修复方案,如果有,则是修复方案的包版本。
详细信息页面
详细信息页面显示了特定 CVE 的详细信息。这个页面是公开的。你可以与你 Docker 组织外的其他人共享特定 CVE 描述的链接。
该页面显示以下信息:
- CVE ID 和严重性。
- 描述。
- 受影响的包数量。
- 发布日期。
以下是受影响的所有仓库列表,可通过镜像名称进行搜索。列表中的每个条目显示以下详细信息:
- 仓库名称。选择仓库名称链接将打开仓库标签列表视图。
- 镜像的当前标签版本。选择标签名称链接将打开仓库标签列表层视图。
- 镜像最后推送的日期。
- 存储镜像的注册表。
- 镜像中受影响的包名称和版本。
设置
网站头部下拉菜单中的设置菜单包含前往集成页面和仓库设置的链接。
集成
集成页面允许你创建和管理 Docker Scout 集成,如环境集成和注册表集成。有关如何开始使用集成的更多信息,请参见将 Docker Scout 与其他系统集成。
仓库设置
仓库设置是你启用和禁用组织中仓库的 Docker Scout 分析的地方。
要启用仓库,请选择要在其上启用 Docker Scout 分析的仓库的复选框,然后选择启用镜像分析。
当你为仓库启用镜像分析时,Docker Scout 将在你推送到该仓库的新标签时自动进行分析。
通过选择禁用镜像分析来禁用所选仓库的 Docker Scout 分析。
Docker技术概论(8):Docker Desktop原生图形化管理(二):https://developer.aliyun.com/article/1580895