作为一名开发者,我们深知在现代软件开发流程中,环境一致性往往是最棘手的问题之一。你是否也曾遇到过这种情况:代码在本地运行完美,但一旦部署到测试或生产环境就报错?这就是我们通常所说的“在我机器上能跑”的问题。
为了解决这个问题,我们将深入探讨 Docker —— 一个彻底改变了我们构建、交付和运行应用程序方式的强大工具。在这篇文章中,我们将为你提供一份详尽的 Docker 备忘单(Docker Cheat Sheet),不仅涵盖基础命令,还将深入探讨实际应用场景、最佳实践以及那些让我们的工作流更加顺畅的高级技巧。
目录
为什么我们需要 Docker?
在深入命令之前,让我们先达成一个共识:容器化技术不仅仅是运维的专利,更是开发者的福音。
Docker 允许我们将应用程序及其依赖项(如代码、运行时、系统工具、系统库和设置)打包到一个轻量级、可移植的容器中。这与虚拟机(VM)不同,容器不需要运行完整的操作系统内核,它们直接共享主机的内核。这意味着容器启动速度极快(通常是秒级),且占用的资源非常少。
这种松散隔离的环境带来了巨大的好处:
- 一致性:无论是开发环境还是生产环境,应用运行表现完全一致。
- 可移植性:“一次构建,到处运行”。你可以在笔记本电脑上构建容器,然后无缝将其部署到云服务器或任何支持 Docker 的机器上。
- 资源效率:由于容器共享内核,我们可以在同一台主机上运行比虚拟机多得多的服务实例。
前置知识:快速导航
为了最大化这份备忘单的效用,建议你具备以下基本概念。如果你对某些术语感到陌生,不妨先花点时间了解一下,这将帮助我们后续的学习更加顺畅:
- Docker: 核心容器平台。
- Docker Hub: Docker 的官方镜像仓库,类似于代码界的 GitHub,我们可以在这里找到数百万现成的镜像。
本指南将涵盖以下核心领域:
- 安装与环境配置:从零开始。
- 镜像管理:构建、拉取与推送。
- 容器生命周期:运行、停止、删除与调试。
- 存储与网络:数据持久化与容器间通信。
- 编排工具:Docker Compose 与 Swarm 基础。
—
1. 安装与环境配置
一切始于安装。虽然我们可以通过包管理器(如 INLINECODE8cbdee32 或 INLINECODE0b89ccc4)安装,但使用 Docker 官方提供的便捷脚本是快速上手的最简单方法。
安装命令
命令
—
curl -fsSL https://get.docker.com/ -o get-docker.sh \&\& sudo sh get-docker.sh
> 注意:在生产环境中,我们建议遵循官方文档的步骤,添加 Docker 官方的 GPG 密钥和源,以便更好地管理版本更新和安全性。
认证与登录
在我们要拉取私有镜像或推送自己的镜像到 Docker Hub 之前,需要先进行身份验证。
命令
—
INLINECODEfd9aa61c
INLINECODEb06c0e60实战场景:
# 输入命令后,系统会提示你输入用户名和密码
# 登录成功后,你的凭据会被保存在 ~/.docker/config.json 文件中
docker login
—
2. 镜像管理:核心概念深入
Docker 镜像是只读的模板。我们可以把它想象成应用程序的“源代码”或者“快照”。当我们运行一个容器时,实际上是在镜像的基础上添加了一层可写的“容器层”。
基础镜像命令
命令
—
INLINECODE9efd6ab0
. 表示使用当前目录的 Dockerfile docker pull :
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
INLINECODE0b7907cf
-t 分配一个伪终端。非常适合调试 docker run -p 8080:80 nginx
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
docker kill
INLINECODE2950f724
—
4. 系统运维与清理
随着我们不断测试和部署,本地会积累大量悬空镜像和停止的容器,占用宝贵的磁盘空间。
清理命令
命令
—
docker container prune
INLINECODEea27e948
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 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 的学习曲线虽然略有起伏,但一旦你习惯了“以容器为中心”的思维模式,你的开发效率将迎来质的飞跃。希望这份指南能成为你桌面上最常翻阅的参考工具。如果你在实战中遇到任何问题,不妨回头看看这些基础命令,通常答案就隐藏在细节之中。