上一篇 下一篇 分享链接 返回 返回顶部

2026 从零上手 Docker:镜像、容器、Compose 一篇讲透

发布人:慈云数据-客服中心 发布时间:19小时前 阅读量:2

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

基本步骤:

  1. 确认系统支持 WSL2;
  2. 安装 Docker Desktop;
  3. 启动 Docker Desktop;
  4. 在命令行中输入以下命令验证:
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 新手,建议按照以下顺序学习:

  1. 理解镜像、容器、仓库三个核心概念;
  2. 掌握 docker rundocker psdocker logsdocker exec 等常用命令;
  3. 学会端口映射和数据卷;
  4. 学会编写简单 Dockerfile;
  5. 学会使用 Docker Compose;
  6. 熟悉镜像构建、推送和拉取流程;
  7. 了解 Docker 网络和多容器通信;
  8. 学习镜像优化和安全实践;
  9. 结合 CI/CD 自动构建镜像;
  10. 进一步学习 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 仍然是一项非常值得投入时间学习的核心技能。

目录结构
全文