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里,不用再愁环境问题,还是挺有成就感的。如果和我一样是新手,先从部署一个简单的服务开始,慢慢就懂了~

相关推荐
SPC的存折9 分钟前
2、Docker命令与镜像、容器管理
linux·运维·服务器·docker·容器·eureka
D4c-lovetrain13 分钟前
Linux个人心得26 (redis主从复制全流程,详细版)
linux·运维·服务器
Bert.Cai25 分钟前
Linux whoami命令详解
linux·运维
x***r15135 分钟前
驱动精灵离线版使用指南:免联网快速安装驱动(万能网卡版)
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志43 分钟前
Linux GPIO子系统与中断驱动开发:从入门到实战(完整版)
linux·运维·驱动开发
kyle~1 小时前
SPOOLing 技术(假脱机技术)独占设备 → 虚拟共享设备
运维·服务器·网络
卡比巴拉—林1 小时前
Linux SSH免密登录配置(双向免密)
linux·运维·ssh
NineData2 小时前
NineData 5.0 产品发布和生态伙伴大会,圆满举办!
运维·数据库·人工智能
薛定猫AI2 小时前
【技术干货】AI Agent 自动化业务流程实战:从零构建智能营销系统
运维·人工智能·自动化
香蕉鼠片2 小时前
Docker
运维·docker·容器