Docker 备忘单:终极指南 (2024版)

作为一名开发者,我们深知在现代软件开发流程中,环境一致性往往是最棘手的问题之一。你是否也曾遇到过这种情况:代码在本地运行完美,但一旦部署到测试或生产环境就报错?这就是我们通常所说的“在我机器上能跑”的问题。

为了解决这个问题,我们将深入探讨 Docker —— 一个彻底改变了我们构建、交付和运行应用程序方式的强大工具。在这篇文章中,我们将为你提供一份详尽的 Docker 备忘单(Docker Cheat Sheet),不仅涵盖基础命令,还将深入探讨实际应用场景、最佳实践以及那些让我们的工作流更加顺畅的高级技巧。

为什么我们需要 Docker?

在深入命令之前,让我们先达成一个共识:容器化技术不仅仅是运维的专利,更是开发者的福音。

Docker 允许我们将应用程序及其依赖项(如代码、运行时、系统工具、系统库和设置)打包到一个轻量级、可移植的容器中。这与虚拟机(VM)不同,容器不需要运行完整的操作系统内核,它们直接共享主机的内核。这意味着容器启动速度极快(通常是秒级),且占用的资源非常少。

这种松散隔离的环境带来了巨大的好处:

  • 一致性:无论是开发环境还是生产环境,应用运行表现完全一致。
  • 可移植性:“一次构建,到处运行”。你可以在笔记本电脑上构建容器,然后无缝将其部署到云服务器或任何支持 Docker 的机器上。
  • 资源效率:由于容器共享内核,我们可以在同一台主机上运行比虚拟机多得多的服务实例。

前置知识:快速导航

为了最大化这份备忘单的效用,建议你具备以下基本概念。如果你对某些术语感到陌生,不妨先花点时间了解一下,这将帮助我们后续的学习更加顺畅:

  • Docker: 核心容器平台。
  • Docker Hub: Docker 的官方镜像仓库,类似于代码界的 GitHub,我们可以在这里找到数百万现成的镜像。

本指南将涵盖以下核心领域:

  • 安装与环境配置:从零开始。
  • 镜像管理:构建、拉取与推送。
  • 容器生命周期:运行、停止、删除与调试。
  • 存储与网络:数据持久化与容器间通信。
  • 编排工具:Docker Compose 与 Swarm 基础。

1. 安装与环境配置

一切始于安装。虽然我们可以通过包管理器(如 INLINECODE8cbdee32 或 INLINECODE0b89ccc4)安装,但使用 Docker 官方提供的便捷脚本是快速上手的最简单方法。

安装命令

操作名称

命令

说明 —

Linux 快速安装

curl -fsSL https://get.docker.com/ -o get-docker.sh \&\& sudo sh get-docker.sh

此脚本会自动检测你的 Linux 发行版并安装最新版的 Docker 引擎。适合快速测试或开发环境。

> 注意:在生产环境中,我们建议遵循官方文档的步骤,添加 Docker 官方的 GPG 密钥和源,以便更好地管理版本更新和安全性。

认证与登录

在我们要拉取私有镜像或推送自己的镜像到 Docker Hub 之前,需要先进行身份验证。

操作名称

命令

登录到 Registry

INLINECODEfd9aa61c

登出

INLINECODEb06c0e60实战场景

# 输入命令后,系统会提示你输入用户名和密码
# 登录成功后,你的凭据会被保存在 ~/.docker/config.json 文件中
docker login

2. 镜像管理:核心概念深入

Docker 镜像是只读的模板。我们可以把它想象成应用程序的“源代码”或者“快照”。当我们运行一个容器时,实际上是在镜像的基础上添加了一层可写的“容器层”。

基础镜像命令

操作名称

命令

备注 —

构建镜像

INLINECODE9efd6ab0

INLINECODEff8275b2 用于给镜像打标签,. 表示使用当前目录的 Dockerfile 拉取镜像

docker pull :

如果不指定标签,默认为 latest 列出本地镜像

INLINECODEa97d7070 或 INLINECODEeb1008ba

查看本机已存储的镜像 删除镜像

docker rmi

注意:必须在没有容器使用该镜像的情况下才能删除

实战案例:构建一个定制化的 Nginx 镜像

让我们来做一个实际的练习。假设我们想要修改 Nginx 的默认首页,并将其打包成自己的镜像。

第一步:创建一个目录并编写 index.html

Hello, Docker World!

第二步:在同一目录下创建 Dockerfile

# 使用官方 Nginx 镜像作为基础
FROM nginx:alpine
# 将我们的自定义页面复制到 Nginx 的默认 html 目录
COPY index.html /usr/share/nginx/html/index.html

第三步:构建镜像。

# 这里的 -t 给我们的镜像起名为 my-nginx,版本号为 v1
docker build -t my-nginx:v1 .

工作原理

Docker 引擎读取 INLINECODEc7a6b0dc 中的指令。INLINECODEa20d42f9 告诉它起点是哪个镜像,COPY 指令将本地文件系统中的文件注入到镜像的文件系统中。构建完成后,我们就拥有了一个包含自定义内容的新镜像。

镜像传输:发布你的作品

操作名称

命令

推送镜像

INLINECODEf9041d68

推送示例

INLINECODE5f6a91b0常见错误与解决

  • denied: requested access to the resource is denied

* 原因:你没有登录,或者你的镜像命名不符合 Hub 的要求。Docker Hub 要求推送的镜像名必须以你的 Docker Hub 用户名作为前缀(例如 username/my-nginx:v1)。

* 解决:使用 INLINECODEa1f6970c 命令给镜像重新打标,例如 INLINECODEe2a7654d,然后再推送。

3. 容器管理:掌控运行时

镜像是静态的,容器是动态的运行实例。这是我们日常工作中交互最频繁的部分。

常用运行命令

操作名称

命令

实用见解 —

运行容器

docker run [OPTIONS]

最核心的命令,后面会详解 后台运行

INLINECODE7d2fd33d

INLINECODEe05e17b1 代表 detached(分离模式),让容器在后台运行 交互式运行

INLINECODE0b7907cf

INLINECODE825fc4f7 保持 STDIN 打开,-t 分配一个伪终端。非常适合调试 端口映射

docker run -p 8080:80 nginx

将主机的 8080 端口映射到容器的 80 端口 挂载卷

docker run -v /host/path:/container/path nginx

实现数据持久化,修改容器内的文件不会丢失 命名容器

docker run --name my-web-server nginx

给容器起个有意义的名字,方便后续管理

深入理解:docker run 的魔法

让我们看一个更复杂的例子,这通常是我们启动生产级 Web 服务的标准方式:

docker run -d \
  --name my-website \
  -p 80:80 \
  -v /my/html/files:/usr/share/nginx/html:ro \
  --restart always \
  nginx:alpine

代码解析

  • -d:我们在后台启动它,终端不会被占用。
  • --restart always:这是一个生产环境必备参数。它告诉 Docker,如果容器崩溃了(或者 Docker 守护进程重启了),请自动重启这个容器。这大大提高了服务的可用性。
  • INLINECODE32fe825f:我们将主机的 INLINECODEe12f2f05 目录挂载到容器内。注意 :ro (Read Only) 参数,这是一个安全最佳实践。我们只需要容器读取文件提供 Web 服务,不需要它修改这些文件。

容器生命周期管理

操作名称

命令

列出运行中容器

INLINECODEf3c75b75

列出所有容器

INLINECODE16547542

包含已停止的容器 停止容器

docker stop

发送 SIGTERM 信号,优雅关闭 强制停止

docker kill

发送 SIGKILL 信号,立即终止 删除容器

INLINECODE2950f724

只能删除已停止的容器。若要删除运行中的,加 INLINECODE5a308bb5 强制标志

4. 系统运维与清理

随着我们不断测试和部署,本地会积累大量悬空镜像和停止的容器,占用宝贵的磁盘空间。

清理命令

操作名称

命令

警告 —

清理停止的容器

docker container prune

安全,只清理已停止的 清理未使用的镜像

INLINECODEea27e948

使用 INLINECODEc249372a 会删除所有未被任何容器使用的镜像,不仅仅是悬空的 终极清理

docker system prune -a --volumes

非常危险!它会删除所有停止的容器、所有未使用的网络、所有悬空镜像以及所有未使用的卷。在执行前请务必确认!

5. 网络与存储:进阶必备

默认情况下,容器是隔离的。为了让它们相互通信或者持久化数据,我们需要掌握网络和卷。

Docker 网络

操作名称

命令

列出网络

INLINECODE7bdc201e

创建网络

INLINECODEb4b7b6bc

连接容器到网络

docker network connect 实战见解

默认情况下,Docker 创建三个网络:INLINECODE5f78ecaa, INLINECODE51cfb680, INLINECODEeb508126。当我们运行 INLINECODE5a8d342a 时,默认连接到 bridge 网络。但是,在生产环境中,我们强烈建议创建自定义网络

在自定义网络中,容器可以通过容器名作为 DNS 进行解析。例如,如果你有一个数据库容器名为 INLINECODE7bf8bd3e,你的 Web 应用容器可以直接通过 INLINECODEc7514b47 找到它,而无需知道它的 IP 地址(因为容器重启后 IP 可能会变)。

Docker 卷

操作名称

命令

创建卷

INLINECODE67fe9e02

列出卷

INLINECODEd9e73ec1

删除未使用的卷

docker volume prune### 文件复制

有时候我们需要在本地和容器之间快速传输文件,而不需要挂载卷。

操作名称

命令

从容器复制到主机

INLINECODE18838481

从主机复制到容器

INLINECODE580c662c—

6. 多容器编排:Docker Compose 入门

当我们需要同时运行 Web 服务器、数据库和缓存时,手动一个个 docker run 会变得非常繁琐且难以管理。这时我们需要 Docker Compose

docker-compose 命令是 Docker 引擎之外的二进制文件,通常需要单独安装。它通过一个 YAML 文件来定义多容器应用。

操作名称

命令

启动服务

docker-compose up -d

根据 docker-compose.yml 启动所有服务 停止服务

docker-compose down

停止并删除容器、网络 查看日志

docker-compose logs -f

同时查看所有服务的日志流 执行命令

docker-compose exec web bash

进入指定服务的容器内部

总结与下一步

在这份 Docker 备忘单中,我们不仅涵盖了从安装、构建、运行到清理的基础命令,还深入探讨了端口映射、卷挂载、自定义网络以及清理策略等关键细节。掌握这些命令,你将能够应对绝大多数日常开发和运维场景。

关键要点回顾:

  • 镜像 vs 容器:镜像是蓝图,容器是实例。
  • 安全性:生产环境中尽量使用 INLINECODE1adca26d,对挂载目录使用 INLINECODE9a611605 (只读) 权限。
  • 清理:养成定期执行 docker system prune 的习惯,保持环境整洁。
  • 网络:使用自定义网络实现容器间的 DNS 解析,避免硬编码 IP。

下一步建议:

  • 深入 Dockerfile:学习多阶段构建 来减小最终镜像的体积,这对生产部署至关重要。
  • 探索 Docker Hub:去看看其他优秀项目的 Dockerfile 是怎么写的。
  • 容器安全:了解如何扫描镜像漏洞(Docker Scout)。

Docker 的学习曲线虽然略有起伏,但一旦你习惯了“以容器为中心”的思维模式,你的开发效率将迎来质的飞跃。希望这份指南能成为你桌面上最常翻阅的参考工具。如果你在实战中遇到任何问题,不妨回头看看这些基础命令,通常答案就隐藏在细节之中。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/43944.html
点赞
0.00 平均评分 (0% 分数) - 0