2026 从零上手 Docker:镜像、容器、Compose 一篇讲透
Docker 新手入门指南|2026最新版
在云原生、微服务、DevOps 持续普及的今天,Docker 依然是开发者必须掌握的基础工具之一。无论你是后端开发、前端开发、测试工程师、运维工程师,还是正在学习 Linux、Kubernetes、CI/CD,Docker 都能显著提升你的开发、部署和协作效率。
很多新手第一次接触 Docker 时,会被“镜像、容器、仓库、Dockerfile、数据卷、网络”等概念绕晕。其实 Docker 的核心思想并不复杂:把应用程序和它运行所需的环境一起打包,然后在任何支持 Docker 的机器上稳定运行。
本文将从零开始,系统介绍 Docker 的基本概念、安装方式、常用命令、镜像构建、容器运行、数据持久化、网络配置以及实际开发中的最佳实践,帮助你快速建立完整的 Docker 知识体系。
一、Docker 是什么?
Docker 是一种容器化技术平台,它允许开发者将应用程序及其依赖环境打包成一个标准化单元,这个单元被称为 镜像。通过镜像可以启动一个或多个 容器,容器之间相互隔离,但又可以共享宿主机的操作系统内核。
简单来说:
Docker 让应用可以“带着环境一起运行”。
在没有 Docker 的时代,经常会出现这样的问题:
- 开发环境可以运行,测试环境运行失败;
- 本地 Java 版本是 17,服务器是 11,导致兼容问题;
- 新同事配置开发环境需要一天甚至几天;
- 部署服务需要手动安装各种依赖,容易出错;
- 多个项目依赖不同版本的 MySQL、Redis、Node.js,环境冲突严重。
Docker 的出现很好地解决了这些问题。只要把应用和依赖写进镜像,无论是在本地电脑、测试服务器,还是云服务器上运行,环境都可以保持一致。
二、Docker 的核心优势
1. 环境一致性
Docker 最大的价值之一就是解决“环境不一致”的问题。开发人员可以在本地使用和生产环境几乎一致的容器环境,减少“我这里能跑,你那里不能跑”的情况。
2. 快速部署
传统部署可能需要手动安装 JDK、Nginx、MySQL、Redis 等组件,而 Docker 只需要拉取镜像并启动容器即可。
例如启动一个 Nginx:
docker run -d -p 80:80 nginx
几秒钟内,一个可用的 Web 服务就启动了。
3. 资源占用较低
Docker 容器不像传统虚拟机那样需要完整的操作系统。容器共享宿主机内核,因此启动更快、占用资源更少。
4. 易于扩展和迁移
Docker 镜像可以上传到镜像仓库,也可以在不同服务器之间迁移。无论你是在本地、云服务器还是 Kubernetes 集群中运行,都可以基于同一个镜像进行部署。
5. 适合微服务架构
在微服务架构中,一个系统通常由多个服务组成,例如用户服务、订单服务、支付服务、网关服务等。Docker 可以为每个服务提供独立运行环境,使服务之间相互隔离,更容易管理和扩展。
三、Docker 的核心概念
学习 Docker,首先要理解几个核心概念。
1. 镜像 Image
镜像是一个只读模板,包含应用程序运行所需的文件、依赖、配置和启动命令。
你可以把镜像理解成“应用安装包”。例如:
nginx镜像包含 Nginx 服务;mysql镜像包含 MySQL 数据库;redis镜像包含 Redis 服务;node镜像包含 Node.js 运行环境;openjdk镜像包含 Java 运行环境。
查看本地镜像:
docker images
拉取镜像:
docker pull nginx
删除镜像:
docker rmi nginx
2. 容器 Container
容器是镜像运行后的实例。一个镜像可以启动多个容器,每个容器相互独立。
可以这样理解:
镜像是类,容器是对象;镜像是安装包,容器是运行中的程序。
启动容器:
docker run nginx
后台运行容器:
docker run -d nginx
查看正在运行的容器:
docker ps
查看所有容器,包括已停止的:
docker ps -a
停止容器:
docker stop 容器ID或容器名
删除容器:
docker rm 容器ID或容器名
3. 仓库 Repository
Docker 镜像可以存放在镜像仓库中。常见的公共仓库有:
- Docker Hub;
- GitHub Container Registry;
- 阿里云容器镜像服务;
- 腾讯云容器镜像服务;
- 华为云镜像仓库。
拉取官方 Nginx 镜像:
docker pull nginx:latest
这里的 latest 是镜像标签,表示默认最新版本。但在生产环境中,不建议直接使用 latest,而应该指定明确版本,例如:
docker pull nginx:1.27
这样可以避免镜像版本变化导致部署结果不可控。
四、Docker 的安装方式
1. Windows 安装 Docker
Windows 用户通常安装 Docker Desktop。
基本步骤:
- 确认系统支持 WSL2;
- 安装 Docker Desktop;
- 启动 Docker Desktop;
- 在命令行中输入以下命令验证:
docker version
如果能看到 Docker Client 和 Docker Server 信息,说明安装成功。
2. macOS 安装 Docker
macOS 用户同样推荐使用 Docker Desktop。需要注意区分芯片架构:
- Apple Silicon 芯片:M1、M2、M3、M4;
- Intel 芯片。
安装完成后,同样执行:
docker info
如果能正常输出信息,说明 Docker 服务已经启动。
3. Linux 安装 Docker
以 Ubuntu 为例,可以使用官方安装脚本:
curl -fsSL https://get.docker.com | bash
安装完成后启动 Docker:
sudo systemctl start docker
sudo systemctl enable docker
验证安装:
docker version
如果不想每次都输入 sudo,可以将当前用户加入 docker 组:
sudo usermod -aG docker $USER
然后重新登录系统。
五、Docker 常用命令
Docker 命令很多,但新手只需要先掌握高频命令即可。
1. 镜像相关命令
# 查看本地镜像
docker images
# 拉取镜像
docker pull nginx
# 删除镜像
docker rmi nginx
# 查看镜像详细信息
docker inspect nginx
# 搜索镜像
docker search mysql
2. 容器相关命令
# 创建并启动容器
docker run nginx
# 后台启动容器
docker run -d nginx
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止容器
docker stop 容器ID
# 启动已停止容器
docker start 容器ID
# 重启容器
docker restart 容器ID
# 删除容器
docker rm 容器ID
# 强制删除运行中的容器
docker rm -f 容器ID
3. 日志和进入容器
# 查看容器日志
docker logs 容器ID
# 持续查看日志
docker logs -f 容器ID
# 进入正在运行的容器
docker exec -it 容器ID bash
# 如果容器没有 bash,可以使用 sh
docker exec -it 容器ID sh
4. 清理命令
长期使用 Docker 后,本地会积累很多无用镜像、停止的容器和缓存。
# 删除所有停止的容器
docker container prune
# 删除无用镜像
docker image prune
# 删除无用网络
docker network prune
# 删除无用数据卷
docker volume prune
# 一次性清理无用资源
docker system prune
如果想更彻底清理:
docker system prune -a
注意:该命令会删除未使用的镜像,使用前要确认不会误删重要资源。
六、运行第一个 Docker 容器
我们以 Nginx 为例,运行一个 Web 服务。
docker run -d --name my-nginx -p 8080:80 nginx
参数说明:
docker run:创建并启动容器;-d:后台运行;--name my-nginx:给容器命名;-p 8080:80:将宿主机 8080 端口映射到容器 80 端口;nginx:使用的镜像名称。
启动成功后,在浏览器访问:
http://localhost:8080
如果看到 Nginx 欢迎页面,说明容器运行成功。
停止容器:
docker stop my-nginx
删除容器:
docker rm my-nginx
七、端口映射是什么?
容器内部有自己的网络环境。比如 Nginx 在容器内部监听的是 80 端口,但外部电脑不能直接访问容器内部端口。此时就需要端口映射。
例如:
-p 8080:80
含义是:
宿主机端口:容器端口
也就是说,访问宿主机的 8080 端口,会被转发到容器的 80 端口。
常见示例:
# MySQL
docker run -d -p 3306:3306 mysql
# Redis
docker run -d -p 6379:6379 redis
# Nginx
docker run -d -p 8080:80 nginx
在一台机器上,宿主机端口不能重复占用。如果 8080 已经被其他程序使用,就需要换成 8081、9090 等端口。
八、数据卷 Volume:让数据持久化
默认情况下,容器删除后,容器内部的数据也会被删除。对于数据库这类服务,这是不可接受的。因此 Docker 提供了数据卷机制,用于持久化数据。
1. 使用数据卷运行 MySQL
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
参数说明:
-e MYSQL_ROOT_PASSWORD=123456:设置 MySQL root 密码;-v mysql-data:/var/lib/mysql:将 Docker 数据卷挂载到容器的 MySQL 数据目录;mysql:8.0:使用 MySQL 8.0 镜像。
查看数据卷:
docker volume ls
查看数据卷详情:
docker volume inspect mysql-data
即使删除 MySQL 容器,只要数据卷还在,数据库数据就不会丢失。
2. 挂载宿主机目录
除了使用 Docker 管理的数据卷,也可以挂载宿主机目录:
docker run -d \
--name my-nginx \
-p 8080:80 \
-v /Users/demo/html:/usr/share/nginx/html \
nginx
这样宿主机 /Users/demo/html 目录中的文件,会映射到容器内 Nginx 的网站根目录。
开发环境中,挂载目录非常常见。例如前端项目可以把本地代码挂载进 Node 容器,实现实时开发。
九、Docker 网络基础
Docker 默认提供多种网络模式,最常见的是 bridge 网络。
查看 Docker 网络:
docker network ls
创建自定义网络:
docker network create my-net
使用自定义网络启动容器:
docker run -d --name redis --network my-net redis
docker run -d --name app --network my-net my-app
在同一个自定义网络中,容器可以通过容器名称相互访问。例如应用容器可以使用 redis:6379 连接 Redis,而不需要知道 Redis 容器的 IP 地址。
这在多容器项目中非常重要。例如一个后端服务需要连接 MySQL 和 Redis,就可以把它们放到同一个 Docker 网络中。
十、Dockerfile:构建自己的镜像
实际开发中,我们通常不会只运行官方镜像,而是要把自己的应用打包成镜像。这时就需要 Dockerfile。
Dockerfile 是一个文本文件,用来描述镜像的构建步骤。
下面以一个简单 Node.js 项目为例。
1. 项目结构
my-node-app
├── Dockerfile
├── package.json
└── server.js
2. 示例 server.js
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello Docker 2026!');
});
server.listen(3000, () => {
console.log('Server running at http://0.0.0.0:3000');
});
3. Dockerfile 示例
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --omit=dev
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
说明:
FROM:指定基础镜像;WORKDIR:设置工作目录;COPY:复制文件到镜像中;RUN:构建镜像时执行命令;EXPOSE:声明容器监听端口;CMD:容器启动时执行命令。
4. 构建镜像
在项目目录执行:
docker build -t my-node-app:1.0 .
参数说明:
-t:指定镜像名称和标签;.:表示 Dockerfile 所在的构建上下文目录。
5. 运行镜像
docker run -d --name node-app -p 3000:3000 my-node-app:1.0
浏览器访问:
http://localhost:3000
如果看到 Hello Docker 2026!,说明你的自定义镜像已经成功运行。
十一、.dockerignore 的作用
构建镜像时,Docker 会把构建上下文发送给 Docker 引擎。如果项目目录中包含大量无用文件,会导致构建速度变慢、镜像缓存失效,甚至泄露敏感信息。
因此建议创建 .dockerignore 文件。
Node.js 项目示例:
node_modules
npm-debug.log
.git
.env
dist
coverage
Java 项目示例:
target
.git
.idea
*.iml
.env
logs
.dockerignore 的作用类似 .gitignore,用于排除不需要参与镜像构建的文件。
十二、Docker Compose:管理多个容器
单个容器可以用 docker run 启动,但如果项目包含多个服务,例如后端、MySQL、Redis、Nginx,每次手动输入命令会很麻烦。Docker Compose 可以通过一个 YAML 文件定义多个服务,一键启动或停止。
1. docker-compose.yml 示例
services:
mysql:
image: mysql:8.0
container_name: demo-mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- demo-net
redis:
image: redis:7
container_name: demo-redis
ports:
- "6379:6379"
networks:
- demo-net
nginx:
image: nginx:1.27
container_name: demo-nginx
ports:
- "8080:80"
networks:
- demo-net
volumes:
mysql-data:
networks:
demo-net:
2. 启动服务
docker compose up -d
3. 查看服务
docker compose ps
4. 停止服务
docker compose down
如果需要同时删除数据卷:
docker compose down -v
Docker Compose 是本地开发环境中非常实用的工具。很多团队会把数据库、缓存、消息队列都写进 Compose 文件,新人只需要执行一条命令就可以启动完整开发环境。
十三、Docker 与虚拟机的区别
很多新手会问:Docker 和虚拟机有什么区别?
1. 虚拟机
虚拟机通过虚拟化技术模拟完整硬件环境,每个虚拟机都需要安装完整操作系统。因此虚拟机隔离性强,但启动慢、资源占用高。
2. Docker 容器
Docker 容器共享宿主机操作系统内核,不需要完整操作系统,因此启动快、体积小、资源利用率高。
简单对比:
| 对比项 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 较低 | 较高 |
| 镜像体积 | 通常较小 | 通常较大 |
| 隔离级别 | 进程级隔离 | 系统级隔离 |
| 适用场景 | 应用部署、微服务、开发环境 | 强隔离、多系统模拟 |
需要注意的是,Docker 并不是虚拟机的完全替代品。它们适用于不同场景。在应用交付、持续集成、微服务部署方面,Docker 更加轻量和高效。
十四、Docker 常见使用场景
1. 快速搭建开发环境
例如你需要 MySQL、Redis、RabbitMQ,只需要几条命令即可启动:
docker run -d --name redis -p 6379:6379 redis:7
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
不需要在本机安装复杂依赖,也不会污染系统环境。
2. 打包后端应用
Java、Go、Node.js、Python 应用都可以通过 Dockerfile 打包成镜像,然后部署到服务器。
3. 自动化测试
测试环境可以通过 Docker 快速创建和销毁,保证每次测试都在干净环境中执行。
4. CI/CD 流水线
在 GitHub Actions、GitLab CI、Jenkins 等流水线中,Docker 常用于构建镜像、运行测试、推送镜像和部署应用。
5. 本地模拟生产环境
通过 Docker Compose,可以在本地启动多个服务,模拟真实生产环境,减少部署后的问题。
十五、Docker 新手常见问题
1. 为什么容器启动后马上退出?
通常是因为容器中的主进程结束了。Docker 容器依赖前台进程运行,如果主进程退出,容器也会停止。
可以查看日志:
docker logs 容器ID
如果是命令写错、配置错误或依赖缺失,日志中通常会有提示。
2. 为什么访问不了容器服务?
常见原因包括:
- 没有使用
-p映射端口; - 程序只监听了
127.0.0.1,而不是0.0.0.0; - 宿主机防火墙限制;
- 容器内部服务未启动;
- 端口被其他程序占用。
对于 Web 服务,建议监听:
0.0.0.0
而不是:
localhost
3. 镜像太大怎么办?
可以考虑:
- 使用更小的基础镜像,例如
alpine; - 使用多阶段构建;
- 删除构建缓存和无用依赖;
- 合理编写
.dockerignore; - 避免把日志、临时文件、源码仓库历史复制进镜像。
4. Docker 容器里的数据会不会丢?
如果数据只保存在容器内部,删除容器后数据会丢失。对于数据库、上传文件、持久化配置,应使用数据卷或挂载宿主机目录。
5. 生产环境能不能用 Docker Compose?
Docker Compose 更适合单机开发、测试或小规模部署。生产环境如果需要高可用、自动扩缩容、滚动更新和服务治理,通常会使用 Kubernetes、Docker Swarm 或云厂商容器服务。
十六、Dockerfile 编写最佳实践
1. 使用明确版本的基础镜像
不建议:
FROM node:latest
建议:
FROM node:22-alpine
明确版本可以保证构建结果稳定。
2. 利用缓存机制
把依赖文件先复制进去,再安装依赖:
COPY package*.json ./
RUN npm install
COPY . .
这样当业务代码变化但依赖没有变化时,Docker 可以复用依赖安装层的缓存,加快构建速度。
3. 减少镜像层和无用文件
每个 RUN 指令都会产生镜像层。合理合并命令可以减少镜像体积。
4. 不要把敏感信息写进镜像
不要在 Dockerfile 中写入:
- 数据库密码;
- API Token;
- 私钥;
- 云服务访问密钥。
敏感信息应该通过环境变量、密钥管理服务或运行时配置注入。
5. 使用非 root 用户运行应用
在生产环境中,尽量避免容器内应用以 root 用户运行,以降低安全风险。
示例:
RUN addgroup -S app && adduser -S app -G app
USER app
十七、Docker 安全建议
Docker 虽然方便,但也不能忽视安全问题。
1. 只使用可信镜像
优先使用官方镜像或可信组织维护的镜像,不要随意运行来源不明的镜像。
2. 定期更新镜像
基础镜像可能存在漏洞,需要定期更新并重新构建应用镜像。
3. 控制容器权限
避免随意使用:
--privileged
该参数会赋予容器很高权限,除非明确需要,否则不要使用。
4. 限制资源
可以为容器限制 CPU 和内存,避免单个容器占满宿主机资源。
docker run -d --memory=512m --cpus=1 nginx
5. 扫描镜像漏洞
可以使用 Docker Scout、Trivy、Grype 等工具扫描镜像漏洞,及时修复高危问题。
十八、推荐学习路线
对于 Docker 新手,建议按照以下顺序学习:
- 理解镜像、容器、仓库三个核心概念;
- 掌握
docker run、docker ps、docker logs、docker exec等常用命令; - 学会端口映射和数据卷;
- 学会编写简单 Dockerfile;
- 学会使用 Docker Compose;
- 熟悉镜像构建、推送和拉取流程;
- 了解 Docker 网络和多容器通信;
- 学习镜像优化和安全实践;
- 结合 CI/CD 自动构建镜像;
- 进一步学习 Kubernetes。
不要一开始就追求掌握所有底层原理。对于新手来说,先能用 Docker 解决实际问题,再逐步深入原理,是更高效的学习方式。
十九、实战练习建议
如果你刚开始学习 Docker,可以尝试完成以下练习:
练习一:运行 Nginx
目标:启动一个 Nginx 容器,并通过浏览器访问。
docker run -d --name web -p 8080:80 nginx
练习二:运行 MySQL 并持久化数据
目标:使用数据卷保存数据库数据。
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
练习三:构建自己的应用镜像
目标:为一个 Node.js、Java、Go 或 Python 项目编写 Dockerfile,并成功运行。
练习四:使用 Docker Compose 启动多服务
目标:用一个 docker-compose.yml 同时启动应用、MySQL 和 Redis。
练习五:推送镜像到仓库
目标:将本地镜像推送到 Docker Hub 或云厂商镜像仓库。
docker tag my-app:1.0 用户名/my-app:1.0
docker push 用户名/my-app:1.0
二十、总结
Docker 是现代软件开发和部署中非常重要的基础工具。它通过容器化技术解决了环境一致性、快速部署、依赖隔离和应用迁移等问题。对于新手而言,学习 Docker 不需要一开始就深入内核、命名空间、控制组等底层机制,而应先掌握实际使用中最常见的概念和命令。
你需要重点理解:
- 镜像 是应用和环境的打包模板;
- 容器 是镜像运行后的实例;
- 仓库 用于存储和分发镜像;
- 端口映射 让外部可以访问容器服务;
- 数据卷 用于保存重要数据;
- Dockerfile 用于构建自定义镜像;
- Docker Compose 用于管理多容器应用。
当你能够熟练使用 Docker 启动服务、构建镜像、挂载数据卷、编写 Compose 文件后,就已经具备了日常开发和部署所需的大部分能力。接下来,可以继续学习 CI/CD、镜像安全、容器编排以及 Kubernetes,为进入更完整的云原生技术体系打下基础。
Docker 并不是一个只属于运维的工具,它已经成为开发者日常工作流的一部分。掌握 Docker,意味着你可以更高效地搭建环境、更稳定地交付应用,也能更自然地理解现代云原生架构。对于 2026 年的开发者来说,Docker 仍然是一项非常值得投入时间学习的核心技能。