# Docker **Repository Path**: guibinbin/docker ## Basic Information - **Project Name**: Docker - **Description**: docker 学习笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-08-02 - **Last Updated**: 2023-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Docker ## 基本概念 - 镜像 (Image) - 容器 (Container) - 仓库 (Repository) ### Docker 镜像 > 操作系统分为 内核 和 用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。 > Docker 镜像相当于一个 root 文件系统。 > Docker 镜像,一个特殊的文件系统 #### 分层存储 Union FS (联合安装): 是一种将多个目录组合成一个看起来包含其组合内容的目录的方法 ### Docker 容器 > 镜像(Image) 和 容器(Container) 的关系, 镜像是静态的定义,容器时镜像运行的实体 #### 实质 > 容器的实质是 进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立命名空间。因此容器可以拥有自己的 root 文件系统,自己的网络配置,自己的进程空间,以及自己的用户 ID 空间。 ```bash # 容器内的进程是运行在一个隔离的环境里 # 容器 存储层的生命周期 和 容器一样,容器消亡时,容器存储层也随之消失。 # 按照 Docker 最佳实践的要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。所有文件写入操作,都应该使用 数据卷(Volume) 或者 绑定宿主目录,在这些位置的读写会跳过容器的存储层,直接对宿主(或网络存储)发生读写,其性能 和 稳定性更高 # 数据卷的生命周期独立于容器,容器消亡,数据卷不会消失。 ``` ### Docker Registry > 镜像构建完后,可以很容易的在当前宿主机上运行,但是如果需要在其他服务器上使用这个镜像,我么就需要 一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务 > 一个 Docker Registry 中可以包含多个 仓库(Registory); > 每一个仓库可以包含多个标签(flag); > 每个标签对应一个 镜像 #### Docker Registry 公开服务 > Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。 一般这类服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像 ##### 加速器 由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为 加速器。 常见的有 阿里云加速器 (opens new window)、DaoCloud 加速器 (opens new window)等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。 #### Docker Registry 私有服务 ## 使用镜像 ### 获取 Docker 镜像 - 从 Docker 镜像仓库获取镜像的命令是 ``Docker pull`` - 命令格式 ```bash docker pull [选项] [Docker Registry 地址[:端口号/]仓库名[:标签]] ``` - 具体选项可以通过 ``docker pull --help`` 查看 1. Docker 镜像仓库地址: 1. 格式: <域名/IP>[:端口号]。 默认地址是 Docker Hub (docker.io) 2. 仓库名: 格式 <用户名>/<软件名> 如果不写用户名,默认是libary (官方镜像) #### 实例 没有写用户名默认是 libary ![1690860109839](image/README/1690860109839.png) - 最后一行写的 docker.io/libary/ubuntu:18.04 - 是镜像的完整名称 #### 运行镜像 启动ubuntu:18.04 并使用该镜像的 bash ```bash docker run -it --rm ubuntu:18.04 bash ``` ![1690860405731](image/README/1690860405731.png) ![1690860430800](image/README/1690860430800.png) 使用的参数 - -it: 这是两个参数 - -i: 交互式操作 - -t: 终端 - --rm: 这个参数是说容器退出后随之将其删除。 - 默认情况,为了排除障碍需求,退出容器不会立即删除,除非手动 ``docker rm``。 - 这里使用是因为 我们只是用于测试,不用排除障碍,可以避免浪费空间 - ubuntu:18.04: - 指的是 ubuntu18.04 镜像为基础来启动镜像 - bash: - exit: 退出交互界面 ### 列出镜像 ```bash # 使用 docker image ls ``` ![1690870441669](image/README/1690870441669.png) - 镜像ID 是 镜像的唯一ID #### 镜像体积 1. 在 Docker 中查看到的镜像体积是经过压缩的体积 2. 在 镜像 下载 和 上传过程中镜像是保持着压缩的状态 注意 docker image ls 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。 可以通过 ``docker system df``来查看镜像、容器、数据卷所占用的空间 ![1690870831368](image/README/1690870831368.png) #### 虚悬镜像 ![1690870920282](image/README/1690870920282.png) ![1690870929093](image/README/1690870929093.png) 这个镜像原本有镜像名 和 标签,随着官方镜像更新后重新 docker pull mongo:3.2 这时候 mongo:3.2 这个镜像被转移到了新的镜像下。 而旧的镜像上的这个名称则被取消,从而变成了 。 除了 docker pull 会导致, docker build 也同样会导致这个问题 这一类无标签镜像也叫作 虚悬镜像(dangling image) ```bash # 查看 虚悬镜像 docker image ls -f dangling=true # 因为虚悬镜像已经失去了价值,所以可以删除 docker image prune ``` #### 中间层镜像 为了加速镜像构建,重复利用资源,Docker 会利用 ``中间层镜像`` ```bash # 查看包括中间层镜像在内的所有镜像 docker image ls -a ``` #### 查看部分镜像 ```bash docker image ls <仓库名> docker image ls <仓库名>:<标签名> # 使用过滤器 docker image ls -f since=ubuntu:18.04 ``` #### ###