Docker和Docker Compose到底咋用?

Docker入门:Docker和Docker Compose到底咋用?

作为一个折腾过自己博客部署的博主,我踩过不少服务器和容器的坑。之前总听人说Docker、Docker Compose,一开始完全分不清,以为是一个东西,直到自己动手部署博客(MySQL+Redis+后端+前端),才真正搞明白它们的区别和用法。今天就用大白话聊聊,不用专业术语,纯新手视角。

先说说我为啥用Docker?

一开始搭博客,直接在服务器装MySQL、Java、Nginx,光是配环境就耗了两天:MySQL版本不对、Java环境变量配错、Nginx端口冲突... 折腾到最后,服务器环境乱得一塌糊涂,想重装都怕删错东西。

后来用了Docker,才发现真香:每个服务(比如MySQL)都装在独立的"容器"里,和服务器系统隔离开,不用怕版本冲突;想删就删,想重装就重装,服务器始终干干净净。这也是我后面会一直聊的------Docker解决的是"单个服务怎么装、怎么跑"的问题。

Docker和Docker Compose的核心区别

先给结论:Docker是"单兵",负责跑单个容器;Docker Compose是"指挥官",负责统筹多个容器协同工作

1. Docker:搞定单个服务的"打工人"

Docker的核心作用就一个:把单个应用(比如MySQL、Redis)打包成"镜像",再基于镜像启动"容器"------镜像就是应用的"安装包",容器就是应用的"运行实例"。

比如我想跑一个MySQL,用Docker的话,核心命令就几个:

bash 复制代码
# 拉取MySQL镜像(相当于下载安装包)
docker pull mysql:8.0

# 启动MySQL容器(相当于安装并运行)
docker run -d --name my-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0

但问题来了:我的博客不止需要MySQL,还需要Redis、后端、前端,要是一个个用docker run启动,得写一堆命令,还要手动配网络、端口、依赖(比如先启动MySQL再启动后端),稍不注意就出错------这就是Docker的短板:只能管单个容器,多容器协作完全靠手动。

2. Docker Compose:多容器的"总指挥"

Docker Compose是Docker官方出的工具,专门解决"多容器协作"的问题。它把所有服务的配置(端口、密码、依赖、数据卷)都写在一个docker-compose.yml文件里,一条命令就能启动/停止所有服务,不用挨个操作。

还是以我的博客为例,docker-compose.yml里会写清楚:要跑MySQL、Redis、后端、Nginx四个服务,每个服务用什么镜像、映射什么端口、依赖哪个服务、数据存在哪。启动的时候只需要:

bash 复制代码
# 一键启动所有服务(后台运行)
docker compose up -d

# 一键停止所有服务
docker compose down

对比一下就知道差别:

  • 用Docker:启动4个服务要写4段docker run命令,还要记清顺序和参数;
  • 用Docker Compose:只需要维护一个docker-compose.yml,一条命令搞定所有。

新手怎么用?(纯实操,不绕弯)

第一步:先装Docker

不管用不用Compose,先装Docker(以我用的OpenCloudOS为例):

bash 复制代码
# 安装Docker核心组件
dnf install -y docker-ce docker-ce-cli containerd.io
# 启动Docker并设置开机自启
systemctl start docker
systemctl enable docker
# 验证是否装成功
docker --version

第二步:装Docker Compose

现在新版Docker都推荐装"插件版"(命令是docker compose,不是老版的docker-compose):

bash 复制代码
# 安装Compose插件
dnf install -y docker-compose-plugin
# 验证
docker compose version

第三步:写个简单的Compose配置文件

以我的博客为例,核心的docker-compose.yml长这样(简化版):

yaml 复制代码
version: "3.8"
services:
  # MySQL服务
  mysql:
    image: mysql:8.0
    container_name: blog-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 我的密码
    ports:
      - "4000:3306"  # 服务器4000端口映射容器3306
    volumes:
      - mysql-data:/var/lib/mysql  # 数据持久化,删容器不丢数据

  # Redis服务
  redis:
    image: redis:7-alpine
    container_name: blog-redis
    ports:
      - "5000:6379"
    volumes:
      - redis-data:/data

# 数据卷:专门存数据,不会随容器删除而丢失
volumes:
  mysql-data:
  redis-data:

第四步:常用命令(记这几个就够了)

作为博主,日常用的命令就这几个,不用记太多:

bash 复制代码
# 启动所有服务(后台运行)
docker compose up -d

# 改了配置/代码,重启并重新构建(比如改了MySQL端口)
docker compose up -d --build

# 查看所有服务状态
docker compose ps

# 查看某个服务的日志(比如后端报错了)
docker compose logs -f blog-server

# 停止所有服务(不删数据)
docker compose down

# 重启某个服务(比如只重启后端)
docker compose restart blog-server

新手避坑小提醒

  1. 数据别丢了 :一定要在docker-compose.yml里配volumes(数据卷),不然删容器的时候,MySQL里的博客数据也会没了;
  2. 端口别冲突:比如服务器3306端口被占用,就把MySQL的映射端口改成4000(像我这样),改完重启Compose就行;
  3. 命令别搞混 :新版Compose是docker compose(空格),不是老版docker-compose(连字符),输错了会提示"命令找不到";
  4. 依赖要写对 :比如后端依赖MySQL,要在docker-compose.yml里加depends_on,确保先启动MySQL再启动后端。

最后总结

其实不用把Docker想得多复杂:

  • 想跑单个服务(比如只装个MySQL),用Docker就行;
  • 想跑多个服务(比如博客需要MySQL+Redis+前端+后端),一定要用Docker Compose,省时间、少出错;
  • 对我们普通博主来说,不用深究底层原理,能把自己的博客稳定跑起来,能改配置、能看日志、能重启服务,就够了。

折腾技术的过程虽然累,但看着自己的博客稳稳跑在Docker里,不用再愁环境问题,还是挺有成就感的。如果和我一样是新手,先从部署一个简单的服务开始,慢慢就懂了~

相关推荐
2601_949146539 小时前
Shell语音通知接口使用指南:运维自动化中的语音告警集成方案
运维·自动化
儒雅的晴天9 小时前
大模型幻觉问题
运维·服务器
Gofarlic_OMS10 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
通信大师10 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
dixiuapp10 小时前
智能工单系统如何选,实现自动化与预测性维护
运维·自动化
Elastic 中国社区官方博客10 小时前
如何防御你的 RAG 系统免受上下文投毒攻击
大数据·运维·人工智能·elasticsearch·搜索引擎·ai·全文检索
小锋学长生活大爆炸10 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔10 小时前
常用 Docker 命令备份
运维·docker·容器
NotStrandedYet11 小时前
《国产系统运维笔记》第8期:挑战国产化流媒体部署——银河麒麟+龙芯架构编译SRS实战全记录
运维·kylin·国产化·银河麒麟·龙芯·信创运维·srs编译安装
默|笙12 小时前
【Linux】fd_重定向本质
linux·运维·服务器