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
新手避坑小提醒
- 数据别丢了 :一定要在
docker-compose.yml里配volumes(数据卷),不然删容器的时候,MySQL里的博客数据也会没了; - 端口别冲突:比如服务器3306端口被占用,就把MySQL的映射端口改成4000(像我这样),改完重启Compose就行;
- 命令别搞混 :新版Compose是
docker compose(空格),不是老版docker-compose(连字符),输错了会提示"命令找不到"; - 依赖要写对 :比如后端依赖MySQL,要在
docker-compose.yml里加depends_on,确保先启动MySQL再启动后端。
最后总结
其实不用把Docker想得多复杂:
- 想跑单个服务(比如只装个MySQL),用Docker就行;
- 想跑多个服务(比如博客需要MySQL+Redis+前端+后端),一定要用Docker Compose,省时间、少出错;
- 对我们普通博主来说,不用深究底层原理,能把自己的博客稳定跑起来,能改配置、能看日志、能重启服务,就够了。
折腾技术的过程虽然累,但看着自己的博客稳稳跑在Docker里,不用再愁环境问题,还是挺有成就感的。如果和我一样是新手,先从部署一个简单的服务开始,慢慢就懂了~