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

Docker 越用越香:从环境搭建到一键部署的完整命令指南

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

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. 部署更简单

传统部署方式中,应用上线通常需要以下步骤:

  1. 登录服务器;
  2. 安装运行环境;
  3. 安装依赖;
  4. 上传代码或构建产物;
  5. 修改配置;
  6. 启动服务;
  7. 检查端口、日志和进程。

如果项目复杂,还要配置数据库、缓存、消息队列、反向代理等组件。每次迁移服务器或扩容时,都可能重复劳动。

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 不只是运维工具,它也能显著提高开发效率。

例如,新人加入项目时,传统流程可能是:

  1. 安装 JDK;
  2. 安装 Maven;
  3. 安装 MySQL;
  4. 安装 Redis;
  5. 导入数据库;
  6. 修改配置文件;
  7. 启动后端;
  8. 启动前端;
  9. 解决各种环境报错。

整个过程可能耗费半天甚至一天。

如果项目提供了 docker-compose.yml,新人可能只需要执行:

docker compose up -d

几分钟后就能拥有完整开发环境。

这对团队协作非常重要。尤其是多人协作、外包交付、开源项目、测试环境搭建等场景,Docker 可以大幅减少沟通成本和环境问题。


6. 便于持续集成和持续部署

在 CI/CD 流程中,Docker 也非常常见。

典型流程如下:

  1. 提交代码到 Git 仓库;
  2. CI 平台拉取代码;
  3. 执行测试;
  4. 构建 Docker 镜像;
  5. 推送到镜像仓库;
  6. 服务器拉取镜像;
  7. 启动或更新容器。

这样可以保证每次发布的产物都是标准化镜像,而不是零散文件。无论部署到测试环境、预发布环境还是生产环境,都可以使用同一个镜像版本。

常见镜像版本格式:

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 不只是一个工具,而是一种更高效的软件交付方式。

目录结构
全文