{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-05-03 17:52:38","updateBy":"admin","updateTime":"2025-09-12 14:26:59","remark":null,"id":55,"articleTitle":"Docker（一）介绍","articleUrl":"docker_introduction","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/713782e83c4e4b9bbf2d588c2789e07d.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中，然后发布到任何流行的 Linux或Windows 机器上，也可以实现虚拟化。容器是完全使用沙箱机制，相互之间不会有任何接口。","articleContent":"## Docker介绍\n\n### Docker简介\n\nDocker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用，获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道，以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。\n\nDocker 属于 Linux 容器的一种封装，提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖，打包在一个文件里面。运行这个文件，就会生成一个虚拟容器。程序在这个虚拟容器里运行，就好像在真实的物理机上运行一样。有了 Docker，就不用担心环境问题。\n\n总体来说，Docker 的接口相当简单，用户可以方便地创建和使用容器，把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改，就像管理普通的代码一样。\n\nDocker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目，它是基于 dotCloud 公司多年云服务技术的一次革新，并于 2013 年 3 月以 Apache 2.0 授权协议开源，主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会，并成立推动 开放容器联盟（OCI）。\n\nDocker 自开源后受到广泛的关注和讨论，至今其 GitHub 项目已经超过 4 万 6 千个星标和一万多个 fork。甚至由于 Docker 项目的火爆，在 2013 年底，dotCloud 公司决定改名为 Docker。Docker 最初是在 Ubuntu 12.04 上开发实现的；Red Hat 则从 RHEL 6.5 开始对 Docker 进行支持；Google 也在其 PaaS 产品中广泛应用 Docker。\n\n### Docker的优势\n\n1. 更快速的交付和部署\n\n   对开发和运维（devop）人员来说，最希望的就是一次创建或配置，可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器，开发完成之后，运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器，快速迭代应用程序，并让整个过程全程可见，使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快！容器的启动时间是秒级的，大量地节约开发、测试、部署的时间。\n\n2. 更高效的虚拟化\n\n   Docker 容器的运行不需要额外的 hypervisor 支持，它是内核级的虚拟化，因此可以实现更高的性能和效率。\n\n3. 更轻松的迁移和扩展\n\n   Docker 容器几乎可以在任意的平台上运行，包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。\n\n4. 更简单的管理\n\n   使用 Docker，只需要小小的修改，就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新，从而实现自动化并且高效的管理。\n\n### Docker与传统VM对比\n\nVM是一个运行在宿主机之上的完整的操作系统，VM运行自身操作系统会占用较多的CPU、内存、硬盘资源。Docker不同于VM，只包含应用程序以及依赖库，基于libcontainer运行在宿主机上，并处于一个隔离的环境中，这使得Docker更加轻量高效，启动容器只需几秒钟之内完成。由于Docker轻量、资源占用少，使得Docker可以轻易的应用到构建标准化的应用中。但Docker目前还不够完善，比如隔离效果不如VM，共享宿主机操作系统的一些基础库等；网络配置功能相对简单，主要以桥接方式为主；查看日志也不够方便灵活。\n\n### Docker组成\n\n- Docker daemon: 运行在宿主机上，Docker守护进程，用户通过Docker client(Docker命令)与Docker daemon交互\n- Docker client: Docker 命令行工具，是用户使用Docker的主要方式，Docker client与Docker daemon通信并将结果返回给用户，Docker client也可以通过socket或者RESTful api访问远程的Docker daemon\n- Docker image：镜像是只读的，镜像中包含有需要运行的文件。镜像用来创建container，一个镜像可以运行多个container；镜像可以通过Dockerfile创建，也可以从Docker hub/registry上下载。\n- Docker container：容器是Docker的运行组件，启动一个镜像就是一个容器，容器是一个隔离环境，多个容器之间不会相互影响，保证容器中的程序运行在一个相对安全的环境中。\n- Docker hub/registry: 共享和管理Docker镜像，用户可以上传或者下载上面的镜像，官方地址为<https://registry.hub.docker.com/>，也可以搭建自己私有的Docker registry。\n\n## Docker三要素\n\n1. 镜像(Image)\n\n   镜像就是一个只读的模板。镜像可以创建Docker容器，一个镜像可以创建多个容器。相当于容器的”源代码“\n\n2. 容器(Container)\n\n   docker利用容器独立运行的一个或一组容器，应用程序或服务运行在容器里面，容器就类似于一个虚拟化的运行环境，容器是用镜像创建的运行实例。容器为镜像提供了一个标准的和隔离的运行环境，它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。\n\n3. 仓库(Repository)\n\n   是几种存放镜像文件的场所。分为公开仓库和私有仓库。\n\n## Docker运行基本流程\n\n1. 用户使用Docker Client与Docker Daemon建立通信。并发送请求给后者。\n2. Docker Daemon作为Docker架构中的主题部分，首先提供Docker Server的功能使其可以接受Docker Client 的请求。\n3. Docker Engine执行Docker内部的一系列工作，每一项工作都是以一个Job的形式的存在。\n4. Job的运行过程中，当需要容器镜像时，则从Docker Registry中下载镜像，并通过镜像管理驱动Graph Driver将下载的镜像以Graph形式存储。\n5. 当需要为Docker创建网络环境时，通过网络管理驱动Network driver创建并配置Docker容器网络环境。\n6. 当需要限制Docker容器运行资源或执行用户指令操作时，则通过Exec driver来完成。\n7. Libcontainer是一项独立的容器管理包，Network driver以及Exec driver都是通过Libcontainer来实现具体对容器的操作。\n\n## Docker安装\n\n### Docker安装\n\n1. 下载阿里云镜像源\n\n   ```bash\n   wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo\n   ```\n\n2. yum安装docker-ce\n\n   ```bash\n    yum list docker-ce --showduplicates | sort -r可以查看docker版本。\n    \n    这里我选择安装18.06.3版本\n    yum install docker-ce-18.06.3.ce-3.el7 -y\n   ```\n\n3. 启动docker\n\n   ```bash\n    systemctl start docker\n    systemctl enable docker # 开机自启\n    \n    docker info # 查看docker概要信息\n    \n    docker version # 查看docker信息\n    \n    Client:\n     Version:           18.06.3-ce\n     API version:       1.38\n     Go version:        go1.10.3\n     Git commit:        d7080c1\n     Built:             Wed Feb 20 02:26:51 2019\n     OS/Arch:           linux/amd64\n     Experimental:      false\n    \n    Server:\n     Engine:\n      Version:          18.06.3-ce\n      API version:      1.38 (minimum version 1.12)\n      Go version:       go1.10.3\n      Git commit:       d7080c1\n      Built:            Wed Feb 20 02:28:17 2019\n      OS/Arch:          linux/amd64\n      Experimental:     false\n    表示server与client都安装成功了\n   ```\n\n   ## Docker自身管理常用命令\n\n   ### Docker 系统信息与状态管理\n\n   这类命令用于查看 Docker 系统的整体状态、资源使用情况和版本信息。\n\n   | 命令                                                         | 说明                                                         | 示例                                   |\n   | :----------------------------------------------------------- | :----------------------------------------------------------- | :------------------------------------- |\n   | `docker info`                                                | **显示整个 Docker 系统的详细信息**，包括容器/镜像数量、存储驱动、网络类型、硬件资源等。这是首要的排查诊断命令。 | `docker info`                          |\n   | `docker version`                                             | 显示 Docker **客户端和服务器端（引擎）的版本信息**。         | `docker version`                       |\n   | `docker system df`                                           | **查看 Docker 的磁盘使用情况**，清晰展示镜像、容器、数据卷和缓存占用的空间。 | `docker system df`                     |\n   | `docker system df -v`                                        | **详细显示**每项资源（如每个镜像、每个容器）的磁盘空间占用细节。 | `docker system df -v`                  |\n   | `docker stats`                                               | **实时动态显示**所有运行中容器的**资源占用**（CPU、内存、网络IO、磁盘IO、进程数）。 | `docker stats`                         |\n   | `docker stats [容器名]`                                      | 实时显示**指定容器**的资源占用。                             | `docker stats my-container`            |\n   | `docker events`                                              | **实时获取** Docker 守护进程的**事件流**（如容器创建、启动、停止、销毁等）。 | `docker events`                        |\n   | `docker events --filter 'type=container' --filter 'event=die'` | 使用过滤器监听特定事件，例如只查看容器停止的事件。           | `docker events --filter 'event=start'` |\n\n   ### Docker 资源清理与修剪\n\n   Docker 运行久了会产生很多无用资源（停止的容器、悬空镜像、未使用的网络和数据卷），这些命令用于安全地清理它们。\n\n   | 命令                      | 说明                                                         | 示例                      |\n   | :------------------------ | :----------------------------------------------------------- | :------------------------ |\n   | `docker system prune`     | **清理所有未使用的资源**，包括停止的容器、所有未被容器使用的网络、悬空的镜像（`<none>`标签的镜像）、构建缓存。**默认会交互式确认**。 | `docker system prune`     |\n   | `docker system prune -a`  | **更彻底的清理**，额外增加“清除所有未被容器使用的镜像”，而不仅仅是悬空镜像。**慎用**，可能会删掉基础镜像。 | `docker system prune -a`  |\n   | `docker system prune -af` | **强制清理，无需确认**。常用于自动化脚本。                   | `docker system prune -af` |\n   | `docker container prune`  | **仅删除所有停止的容器**。                                   | `docker container prune`  |\n   | `docker image prune`      | **仅删除所有悬空的镜像** (`<none>:<none>`)。                 | `docker image prune`      |\n   | `docker image prune -a`   | **删除所有未被任何容器使用的镜像**。                         | `docker image prune -a`   |\n   | `docker network prune`    | **删除所有未被容器使用的自定义网络**（默认的 `bridge`, `host`, `none` 网络不会被删除）。 | `docker network prune`    |\n   | `docker volume prune`     | **删除所有未被容器使用的数据卷**。**特别注意**：确保无用卷已备份，此操作会删除数据。 | `docker volume prune`     |\n\n   \n\n   ## Docker容器管理常用命令\n\n   ### 1.run命令启动容器\n\n   `docker run [OPTIONS] IMAGE [COMMAND] [ARG...]` 是 Docker 中最核心的命令，用于从镜像创建并启动容器。这个命令实际上封装了 `docker create`（基于镜像创建容器）和 `docker start`（启动已创建的容器）两个操作。\n\n   | 选项                  | 说明                                                         | 示例                                                         |\n   | :-------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- |\n   | `-d`, `--detach`      | 在后台运行容器（守护进程模式）                               | `docker run -d nginx`                                        |\n   | `-i`, `--interactive` | 保持标准输入打开，通常与 `-t` 一起使用                       | `docker run -it ubuntu bash`                                 |\n   | `-t`, `--tty`         | 为容器分配一个伪终端，通常与 `-i` 一起使用                   | `docker run -it ubuntu bash`                                 |\n   | `--rm`                | 容器退出时自动删除容器及其匿名卷                             | `docker run --rm alpine echo \"Hello World\"`                  |\n   | `--name`              | 为容器指定一个名称                                           | `docker run --name my-nginx nginx`                           |\n   | `--restart`           | 容器退出时的重启策略（`no, on-failure, always, unless-stopped`） | `docker run --restart always redis`                          |\n   | `-m`, `--memory`      | 限制容器使用的内存大小                                       | `docker run -m 512m redis`                                   |\n   | `--cpus`              | 限制容器使用的 CPU 核心数                                    | `docker run --cpus=1.5 my-app`                               |\n   | `--cpuset-cpus`       | 绑定容器到指定的 CPU 核心                                    | `docker run --cpuset-cpus=\"0,1\" nginx`                       |\n   | `--memory-swap`       | 内存和交换分区的总大小限制                                   | `docker run -m 512m --memory-swap=1g my-app`                 |\n   | `--ulimit`            | 设置容器的 ulimit 参数                                       | `docker run --ulimit nofile=1024:1024 nginx`                 |\n   | `-w`, `--workdir`     | 指定容器内的工作目录                                         | `docker run -w /app/nodejs node:alpine pwd`                  |\n   | `-h`, `--hostname`    | 指定容器的主机名                                             | `docker run -h my-container-host alpine cat /etc/hostname`   |\n   | `--user`, `-u`        | 指定容器内进程运行的用户（UID 或用户名）                     | `docker run -u 1000 alpine id`                               |\n   | `--read-only`         | 将容器的根文件系统挂载为只读                                 | `docker run --read-only alpine touch /tmp/file`              |\n   | `-l`, `--label`       | 为容器添加元数据标签                                         | `docker run -l environment=production nginx`                 |\n   | `--log-driver`        | 指定容器的日志驱动（如 json-file, syslog, journald）         | `docker run --log-driver=syslog nginx`                       |\n   | `--device`            | 将主机设备映射到容器内                                       | `docker run --device=/dev/ttyUSB0 ubuntu ls -l /dev/ttyUSB0` |\n\n   **注意及说明：**\n\n   - 许多选项需要组合使用才能达到最佳效果，例如最经典的 `-it` 组合用于进入交互式 Shell。\n\n   - 示例中的镜像名称（如 `nginx`, `ubuntu`, `alpine`, `redis`）和命令（如 `bash`, `echo`）均为常用示例，您需要根据自己实际的镜像和需求进行替换。\n\n   - 资源限制选项（如 `-m`, `--cpus`）通常用于生产环境以保障宿主机的稳定。\n\n   - `--rm` 选项非常适合运行一次性任务或测试，避免留下大量停止的容器。\n\n   - `--read-only` 选项增强了安全性，但通常需要与 `--tmpfs` 选项配合，为需要写入的目录（如 `/tmp`, `/run`）挂载临时文件系统。示例中的 `touch` 命令在纯 `--read-only` 模式下会执行失败。\n\n   \n\n   ### 2.exec执行命令\n\n   `docker exec [OPTIONS] CONTAINER COMMAND [ARG...]` 是 Docker 中一个用于在**正在运行的容器内部执行命令**的实用工具。这对于调试、管理和与容器交互非常有帮助。\n\n   | 选项                | 说明                                                         | 示例                                                   |\n   | :------------------ | :----------------------------------------------------------- | :----------------------------------------------------- |\n   | `-i, --interactive` | 保持标准输入 (`STDIN`) 打开，允许与命令交互。通常与 `-t` 一起使用。 | `docker exec -i my_container bash`                     |\n   | `-t, --tty`         | 分配一个伪终端（pseudo-TTY），提供类似本地终端的体验。通常与 `-i` 组合 (`-it`)。 | `docker exec -it my_container bash`                    |\n   | `-d, --detach`      | 在后台模式（ detached mode ）下运行命令，不阻塞当前 shell。  | `docker exec -d my_container tail -f /var/log/app.log` |\n   | `-u, --user`        | 指定执行命令的用户名或 UID。                                 | `docker exec -u root my_container whoami`              |\n   | `-w, --workdir`     | 指定命令在容器内执行的工作目录。                             | `docker exec -w /app my_container pwd`                 |\n   | `-e, --env`         | 设置环境变量。可以多次使用该选项设置多个变量。               | `docker exec -e VAR=value my_container env`            |\n   | `--env-file`        | 从文件读取环境变量。                                         | `--env-file`                                           |\n   | `--privileged`      | 为执行的命令赋予扩展权限（谨慎使用）。                       | `--privileged`                                         |\n\n   \n\n   ### 3.logs查看日志\n\n   | 选项                 | 说明                                                       | 示例                                                         |\n   | :------------------- | :--------------------------------------------------------- | :----------------------------------------------------------- |\n   | `--details`          | 显示日志的额外详细信息                                     | `docker logs --details my_container`                         |\n   | `-f`, `--follow`     | 实时跟踪日志输出（类似 `tail -f`）                         | `docker logs -f my_container`                                |\n   | `--since`            | 显示指定时间之后的日志（可以是时间戳或相对时间如 10m, 1h） | `docker logs --since 2023-01-01T00:00:00 my_container` `docker logs --since 1h my_container` |\n   | `--until`            | 显示指定时间之前的日志                                     | `docker logs --until 2023-01-01T12:00:00 my_container`       |\n   | `-n`, `--tail`       | 仅显示最后指定数量的日志行（默认为全部）                   | `docker logs --tail 100 my_container` `docker logs -n 50 my_container` |\n   | `-t`, `--timestamps` | 显示每条日志的时间戳                                       | `docker logs -t my_container`                                |\n   | `--timestamps`       | 显示每条日志的时间戳（与 `-t` 相同）                       | `docker logs --timestamps my_container`                      |\n   | 无选项               | 显示容器的所有日志                                         | `docker logs my_container`                                   |\n\n   \n\n   ### 4.ps查看容器\n\n   | 选项             | 说明                                                       | 示例                                                         |\n   | :--------------- | :--------------------------------------------------------- | :----------------------------------------------------------- |\n   | **无选项**       | 默认列出**正在运行**的容器。                               | `docker ps`                                                  |\n   | `-a`, `--all`    | 显示**所有容器**，包括已停止的容器。                       | `docker ps -a`                                               |\n   | `-q`, `--quiet`  | **静默模式**，仅显示容器的数字ID。                         | `docker ps -q`                                               |\n   | `-f`, `--filter` | 根据条件**过滤**显示的内容，支持多种过滤器。               | `docker ps -f \"name=redis\"` `docker ps -f \"status=exited\"`   |\n   | `--format`       | 使用 **Go 模板**自定义输出格式和内容。                     | `docker ps --format \"table {{.ID}}\\t{{.Names}}\\t{{.Status}}\"` |\n   | `-l`, `--latest` | 显示**最近创建**的一个容器（所有状态）。                   | `docker ps -l`                                               |\n   | `-n`             | 列出最近创建的 `n` 个容器（所有状态），默认为 -1（全部）。 | `docker ps -n 3`                                             |\n   | `--no-trunc`     | **不截断**输出，显示完整的镜像ID等信息。                   | `docker ps --no-trunc`                                       |\n   | `-s`, `--size`   | 显示容器的**总文件大小**。                                 | `docker ps -s`                                               |\n\n   **常用过滤器（用于 `-f` 选项）**\n   `-f` 或 `--filter` 选项非常强大，你可以使用多个过滤器（多次使用 `-f` 参数）来缩小结果范围。常见的过滤器包括：\n\n   - `name=<容器名称>`: 按容器名称过滤，支持通配符。\n   - `status=<状态>`: 按状态过滤，状态可以是 `running`, `paused`, `exited`, `created`, `restarting` 等。\n   - `id=<容器ID>`: 按容器全ID或前缀ID过滤。\n   - `label=<键>` 或 `label=<键>=<值>`: 按标签（Label）过滤。\n   - `ancestor=<镜像名>`: 过滤基于某个镜像创建的容器。\n\n   \n\n   ### 5.其他常用命令\n\n   ```bash\n   inspect                 查看容器的详细信息，也可以查看镜像的信息\n   kill                    强制杀掉容器\n   ps                      查看当前运行的容器\n   pause                   暂停容器\n   unpause                 开启容器\n   rename                  对容器改名\n   restart                 重启容器\n   start                   启动容器\n   stop                    停掉容器\n   rm                      删除容器，默认删除不了正在运行的容器，-f\n   stats                   查看容器的运行状态\n   top                     查看容器的系统内存，磁盘使用信息\n   \n   docker rm $(docker ps -q)   # 批量删除容器，删除正在运行的容器可以加-f选项执行\n   ```\n\n   kill命令与stop命令区别\n\n   ```shell\n   docker stop，支持“优雅退出”。先发送SIGTERM信号，在一段时间之后（10s）再发送SIGKILL信号。Docker内部的应用程序可以接收SIGTERM信号，然后做一些“退出前工作”，比如保存状态、处理当前请求等。\n   docker kill，发送SIGKILL信号，应用程序直接退出。\n   ```\n\n","categoryId":9,"viewCount":1099,"categoryName":"Docker","author":"球接子","authorAvatar":null,"tagIds":[9],"tagNames":["Docker"]}}