Docker 越用越香:从环境搭建到一键部署的完整命令指南
Docker 为什么越来越多人使用|附完整命令
在过去几年里,Docker 已经从“新兴技术”逐渐变成了开发、测试、运维、部署中的基础工具。无论是后端开发、前端工程、测试人员,还是 DevOps 工程师、云原生架构师,都或多或少会接触 Docker。很多团队在招聘时,也会把“熟悉 Docker”作为重要加分项,甚至是必备能力。
那么,Docker 到底解决了什么问题?为什么越来越多人使用 Docker?它适合哪些场景?常用命令又有哪些?本文将从实际开发和部署角度出发,系统介绍 Docker 的价值,并附上常用完整命令,帮助你快速入门和查漏补缺。
一、Docker 是什么?
Docker 是一种容器化技术,它可以把应用程序以及运行应用所需要的依赖、配置、运行环境等打包到一个“容器”中。这个容器可以在不同机器、不同系统环境中以几乎一致的方式运行。
简单来说,Docker 解决的是:
“在我电脑上能运行,为什么到你电脑上就不行?”
“测试环境没问题,为什么上线就报错?”
“安装环境太麻烦,能不能一键启动?”
Docker 的核心思想是:一次构建,到处运行。
传统部署方式通常需要在服务器上手动安装各种依赖,例如 JDK、Node.js、MySQL、Nginx、Python 环境等。不同服务器之间的软件版本、系统配置、依赖库可能存在差异,因此经常出现环境不一致的问题。
而 Docker 可以通过镜像把应用和依赖一起打包,运行时启动容器即可,大大降低了环境配置成本。
二、为什么越来越多人使用 Docker?
1. 环境一致性更强
在没有 Docker 之前,开发环境、测试环境、生产环境往往是分开维护的。开发人员本地可能使用的是 Java 17,测试环境可能是 Java 11,生产环境又可能是 Java 8;开发机器上 MySQL 是 8.0,服务器上却是 5.7。
这些差异会导致大量隐性问题,例如:
- 本地运行正常,测试环境报错;
- 测试环境正常,生产环境异常;
- 依赖版本不一致导致兼容性问题;
- 新人入职搭环境耗费大量时间;
- 项目迁移服务器时重复踩坑。
使用 Docker 后,可以通过 Dockerfile 明确指定运行环境,例如基础镜像、依赖安装步骤、启动命令等。只要镜像一致,不同环境运行结果就会更加稳定。
例如,一个 Node.js 项目可以固定使用:
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "run", "start"]
这样团队成员不需要在本地反复安装 Node.js,也不用担心版本不一致,只需要安装 Docker,就可以运行项目。
2. 部署更简单
传统部署方式中,应用上线通常需要以下步骤:
- 登录服务器;
- 安装运行环境;
- 安装依赖;
- 上传代码或构建产物;
- 修改配置;
- 启动服务;
- 检查端口、日志和进程。
如果项目复杂,还要配置数据库、缓存、消息队列、反向代理等组件。每次迁移服务器或扩容时,都可能重复劳动。
Docker 的方式则简单很多:
docker pull your-image:latest
docker run -d -p 8080:8080 --name your-app your-image:latest
如果使用 docker compose,多个服务可以通过一个配置文件统一管理:
docker compose up -d
这意味着应用、数据库、缓存、消息队列、Nginx 等都可以一键启动,部署复杂度大大降低。
3. 隔离性好,减少系统污染
开发过程中,我们经常需要安装各种软件,例如 MySQL、Redis、MongoDB、Elasticsearch、RabbitMQ 等。传统方式直接安装在本机,容易导致系统越来越乱:
- 软件版本冲突;
- 端口冲突;
- 配置文件混乱;
- 卸载不干净;
- 后台服务占用资源。
Docker 容器提供了进程级隔离。你可以把 MySQL 运行在容器中,把 Redis 运行在另一个容器中,项目结束后直接删除容器即可,不会污染宿主机环境。
例如启动一个 Redis:
docker run -d --name redis -p 6379:6379 redis:latest
不用再手动安装 Redis,也不用担心卸载残留。
4. 更适合微服务架构
在微服务架构中,一个系统通常由多个服务组成,例如:
- 用户服务;
- 订单服务;
- 支付服务;
- 商品服务;
- 网关服务;
- 配置中心;
- 注册中心;
- 数据库;
- 缓存;
- 消息队列。
如果每个服务都用传统方式部署,维护成本会很高。Docker 可以把每个服务打包成独立镜像,每个服务运行在独立容器中,互不干扰。
例如:
docker run -d --name user-service user-service:1.0
docker run -d --name order-service order-service:1.0
docker run -d --name payment-service payment-service:1.0
进一步配合 Kubernetes,还可以实现自动扩缩容、滚动更新、服务发现、负载均衡、故障恢复等云原生能力。
可以说,Docker 是微服务和云原生体系中的重要基础。
5. 提高开发效率
Docker 不只是运维工具,它也能显著提高开发效率。
例如,新人加入项目时,传统流程可能是:
- 安装 JDK;
- 安装 Maven;
- 安装 MySQL;
- 安装 Redis;
- 导入数据库;
- 修改配置文件;
- 启动后端;
- 启动前端;
- 解决各种环境报错。
整个过程可能耗费半天甚至一天。
如果项目提供了 docker-compose.yml,新人可能只需要执行:
docker compose up -d
几分钟后就能拥有完整开发环境。
这对团队协作非常重要。尤其是多人协作、外包交付、开源项目、测试环境搭建等场景,Docker 可以大幅减少沟通成本和环境问题。
6. 便于持续集成和持续部署
在 CI/CD 流程中,Docker 也非常常见。
典型流程如下:
- 提交代码到 Git 仓库;
- CI 平台拉取代码;
- 执行测试;
- 构建 Docker 镜像;
- 推送到镜像仓库;
- 服务器拉取镜像;
- 启动或更新容器。
这样可以保证每次发布的产物都是标准化镜像,而不是零散文件。无论部署到测试环境、预发布环境还是生产环境,都可以使用同一个镜像版本。
常见镜像版本格式:
your-app:1.0.0
your-app:2024-01-01
your-app:commit-id
your-app:latest
通过镜像版本管理,也更容易回滚。例如当前版本有问题,可以快速切换到旧版本:
docker stop your-app
docker rm your-app
docker run -d --name your-app -p 8080:8080 your-app:1.0.0
7. 资源占用比虚拟机更轻
很多人会把 Docker 和虚拟机进行比较。虚拟机需要运行完整操作系统,每个虚拟机都有自己的内核、系统服务和资源开销。Docker 容器则共享宿主机内核,只隔离应用运行环境,因此启动速度更快、资源占用更低。
大致对比:
| 对比项 | 虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 通常几十秒到几分钟 | 通常几秒甚至更快 |
| 资源占用 | 较高 | 较低 |
| 隔离级别 | 操作系统级 | 进程级 |
| 部署方式 | 安装系统和软件 | 拉取镜像运行容器 |
| 适用场景 | 强隔离、多系统 | 应用部署、微服务、开发环境 |
当然,Docker 并不是虚拟机的完全替代品。虚拟机隔离性更强,而 Docker 更轻量、更适合应用级交付。
三、Docker 的核心概念
1. 镜像 Image
镜像可以理解为应用运行环境的模板。它包含了应用代码、依赖库、环境变量、启动命令等内容。
例如:
nginx:latest
mysql:8.0
redis:7
node:20
openjdk:17
镜像本身是只读的,不能直接运行。我们通常通过镜像创建容器。
2. 容器 Container
容器是镜像运行后的实例。一个镜像可以创建多个容器。
例如,用 nginx 镜像启动一个容器:
docker run -d --name my-nginx -p 80:80 nginx:latest
这里的 my-nginx 就是容器。
3. 仓库 Registry
镜像仓库用于存储和分发镜像。常见的公共仓库是 Docker Hub,也可以搭建私有仓库。
常见操作:
docker pull nginx
docker push username/image-name:tag
4. Dockerfile
Dockerfile 是构建镜像的描述文件,里面写明如何构建应用镜像。
示例:
FROM openjdk:17
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建镜像:
docker build -t my-java-app:1.0 .
5. Docker Compose
Docker Compose 用于定义和运行多个容器。它通过 docker-compose.yml 文件描述服务、端口、环境变量、数据卷、网络等配置。
适合本地开发环境、多服务项目、测试环境快速搭建。
四、Docker 安装命令
以下命令以 Ubuntu 系统为例。
1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
2. 更新软件包
sudo apt-get update
3. 安装依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release
4. 添加 Docker 官方 GPG Key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
5. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
6. 安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 查看 Docker 版本
docker --version
docker compose version
8. 启动 Docker
sudo systemctl start docker
9. 设置开机自启
sudo systemctl enable docker
10. 验证安装
sudo docker run hello-world
五、Docker 常用完整命令
1. 镜像相关命令
查看本地镜像
docker images
或:
docker image ls
搜索镜像
docker search nginx
拉取镜像
docker pull nginx:latest
docker pull mysql:8.0
docker pull redis:7
删除镜像
docker rmi nginx:latest
如果镜像被容器占用,需要先删除容器,或者强制删除:
docker rmi -f nginx:latest
查看镜像详情
docker inspect nginx:latest
构建镜像
docker build -t my-app:1.0 .
给镜像打标签
docker tag my-app:1.0 username/my-app:1.0
推送镜像
docker login
docker push username/my-app:1.0
2. 容器相关命令
创建并启动容器
docker run -d --name my-nginx -p 8080:80 nginx:latest
参数说明:
-d:后台运行;--name:指定容器名称;-p 8080:80:宿主机 8080 端口映射到容器 80 端口;nginx:latest:使用的镜像。
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
停止容器
docker stop my-nginx
启动已停止容器
docker start my-nginx
重启容器
docker restart my-nginx
删除容器
docker rm my-nginx
强制删除运行中的容器
docker rm -f my-nginx
查看容器日志
docker logs my-nginx
持续查看日志:
docker logs -f my-nginx
查看最近 100 行日志:
docker logs --tail=100 my-nginx
进入容器
docker exec -it my-nginx /bin/bash
如果容器没有 bash,可以使用 sh:
docker exec -it my-nginx /bin/sh
查看容器详情
docker inspect my-nginx
查看容器资源占用
docker stats
查看容器内部进程
docker top my-nginx
3. 数据卷相关命令
数据卷用于持久化数据。容器删除后,如果数据存储在容器内部,数据可能会丢失。使用数据卷可以把数据保存到宿主机或 Docker 管理的数据卷中。
创建数据卷
docker volume create my-volume
查看数据卷
docker volume ls
查看数据卷详情
docker volume inspect my-volume
删除数据卷
docker volume rm my-volume
使用数据卷启动 MySQL
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
4. 网络相关命令
Docker 网络用于容器之间通信。
查看网络
docker network ls
创建网络
docker network create my-network
查看网络详情
docker network inspect my-network
删除网络
docker network rm my-network
指定网络启动容器
docker run -d \
--name redis \
--network my-network \
redis:7
docker run -d \
--name app \
--network my-network \
-p 8080:8080 \
my-app:1.0
在同一个 Docker 网络中,容器之间可以通过容器名访问。例如应用容器可以访问:
redis:6379
六、常见服务 Docker 启动命令
1. 启动 Nginx
docker run -d \
--name nginx \
-p 80:80 \
nginx:latest
挂载配置和静态目录:
docker run -d \
--name nginx \
-p 80:80 \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /opt/nginx/logs:/var/log/nginx \
nginx:latest
2. 启动 MySQL
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0
指定字符集:
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v mysql-data:/var/lib/mysql \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
进入 MySQL 容器:
docker exec -it mysql8 mysql -uroot -p
3. 启动 Redis
docker run -d \
--name redis \
-p 6379:6379 \
redis:7
带密码启动:
docker run -d \
--name redis \
-p 6379:6379 \
redis:7 \
redis-server --requirepass 123456
进入 Redis:
docker exec -it redis redis-cli
带密码连接:
docker exec -it redis redis-cli -a 123456
4. 启动 MongoDB
docker run -d \
--name mongo \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=root \
-e MONGO_INITDB_ROOT_PASSWORD=123456 \
-v mongo-data:/data/db \
mongo:latest
进入 MongoDB:
docker exec -it mongo mongosh -u root -p 123456
5. 启动 RabbitMQ
docker run -d \
--name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=123456 \
rabbitmq:3-management
管理后台访问:
http://服务器IP:15672
6. 启动 Elasticsearch
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e discovery.type=single-node \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch:8.12.0
如果只是本地测试,也可以关闭安全认证:
docker run -d \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e discovery.type=single-node \
-e xpack.security.enabled=false \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
elasticsearch:8.12.0
七、Docker Compose 示例
如果一个项目需要同时启动 MySQL、Redis 和应用服务,可以使用 docker-compose.yml。
services:
mysql:
image: mysql:8.0
container_name: mysql8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: app_db
volumes:
- mysql-data:/var/lib/mysql
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
redis:
image: redis:7
container_name: redis
ports:
- "6379:6379"
app:
image: my-app:1.0
container_name: my-app
ports:
- "8080:8080"
depends_on:
- mysql
- redis
volumes:
mysql-data:
启动:
docker compose up -d
查看服务:
docker compose ps
查看日志:
docker compose logs -f
停止服务:
docker compose down
停止并删除数据卷:
docker compose down -v
重新构建并启动:
docker compose up -d --build
八、Dockerfile 常用示例
1. Java Spring Boot 项目
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/app.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
构建:
docker build -t springboot-app:1.0 .
运行:
docker run -d \
--name springboot-app \
-p 8080:8080 \
springboot-app:1.0
2. Node.js 项目
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start"]
构建:
docker build -t node-app:1.0 .
运行:
docker run -d \
--name node-app \
-p 3000:3000 \
node-app:1.0
3. Python 项目
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
构建:
docker build -t python-app:1.0 .
运行:
docker run -d \
--name python-app \
-p 5000:5000 \
python-app:1.0
九、Docker 清理命令
使用 Docker 时间久了,本地可能会积累很多不用的镜像、容器、数据卷和构建缓存,占用大量磁盘空间。
删除停止的容器
docker container prune
删除未使用镜像
docker image prune
删除所有未使用镜像
docker image prune -a
删除未使用数据卷
docker volume prune
删除未使用网络
docker network prune
一键清理未使用资源
docker system prune
清理所有未使用资源,包括镜像和数据卷
docker system prune -a --volumes
注意:清理命令可能删除重要数据,尤其是数据卷,执行前一定要确认。
十、使用 Docker 的注意事项
1. 不要把重要数据只放在容器内部
容器可以删除、重建、替换。如果数据库数据只存储在容器内部,一旦容器被删除,数据就可能丢失。生产环境一定要使用数据卷或宿主机目录挂载。
2. 镜像版本不要总是使用 latest
latest 虽然方便,但不利于版本管理。生产环境建议使用明确版本号,例如:
mysql:8.0
redis:7.2
nginx:1.25
这样可以避免镜像自动变化带来的不可控问题。
3. 注意端口冲突
如果宿主机端口已被占用,容器启动会失败。例如:
docker run -d -p 8080:80 nginx
如果宿主机 8080 已被占用,就需要换一个端口:
docker run -d -p 8081:80 nginx
4. 生产环境要关注安全
生产环境使用 Docker 时,需要注意:
- 不要把敏感密码写死在镜像中;
- 不要使用来源不明的镜像;
- 定期更新基础镜像;
- 限制容器权限;
- 不要随意使用
--privileged; - 对外暴露端口要经过安全评估;
- 镜像仓库要做好权限控制。
5. 日志和监控不能忽略
容器运行不代表系统稳定。生产环境还需要配合日志采集、监控告警、健康检查等机制。例如:
docker logs -f container-name
也可以配合 Prometheus、Grafana、ELK、Loki 等工具构建完整监控体系。
十一、Docker 适合哪些人学习?
Docker 适合以下人群:
- 后端开发人员:用于本地环境、接口服务部署;
- 前端开发人员:用于打包部署前端项目、运行 Nginx;
- 测试人员:快速搭建测试环境;
- 运维人员:标准化部署和环境管理;
- DevOps 工程师:构建 CI/CD 流程;
- 架构师:设计微服务和云原生架构;
- 学生和自学者:快速搭建各种实验环境。
如果你经常需要安装数据库、中间件、开发环境,Docker 会让你的工作轻松很多。
十二、总结
Docker 之所以越来越多人使用,并不是因为它“看起来高级”,而是因为它确实解决了软件开发和部署中的许多实际问题。
它的核心价值可以概括为:
- 环境一致:减少“我这里能跑,你那里不能跑”的问题;
- 部署简单:镜像化交付,容器化运行;
- 启动快速:比虚拟机更轻量;
- 隔离性好:减少宿主机环境污染;
- 易于扩展:适合微服务和云原生架构;
- 便于自动化:天然适合 CI/CD 流程;
- 学习成本可控:掌握常用命令后即可快速使用。
对于个人开发者来说,Docker 可以让你快速搭建各种开发环境;对于团队来说,Docker 可以提高协作效率和交付稳定性;对于企业来说,Docker 是迈向 DevOps、微服务和云原生的重要基础。
如果你还没有系统学习 Docker,可以从最常用的三个命令开始:
docker pull 镜像名
docker run 镜像名
docker ps
然后逐步掌握镜像、容器、数据卷、网络、Dockerfile 和 Docker Compose。只要真正用起来,你会发现 Docker 不只是一个工具,而是一种更高效的软件交付方式。