你有没有过这种经历:把项目拉到服务器上,装依赖装了俩小时还报错"环境不匹配";或者开发环境好好的,测试环境就跑不起来,部署全靠手动;或者一个服务要开好几个版本占着机器?
Docker就是来解决这些问题的——把应用和它依赖的所有东西打包成一个"容器",在任何机器上都能一模一样地跑。部署一个服务从俩小时变俩分钟。
一、Docker到底是什么?
一句话:Docker是容器化平台,把应用+依赖+配置打包成可移植的容器,在任何机器上一致运行。
和虚拟机的区别:虚拟机模拟整个操作系统(重),Docker只隔离进程(轻)。一个机器上能跑几十个Docker容器,但跑虚拟机跑几个就满了。
三大核心概念:镜像(Image)是容器的模板(类似class),容器(Container)是镜像运行的实例(类似object),仓库(Registry)是存镜像的地方(Docker Hub是官方仓库)。
二、安装
Windows/Mac:下载Docker Desktop(docker.com/products/docker-desktop),安装后重启电脑(需要开启WSL2)。右下角鲸鱼图标表示运行正常。
Linux:curl -fsSL get.docker.com | sh,然后systemctl enable --now docker开机自启。
验证安装:docker version能输出版本号就OK。docker run hello-world跑第一个容器。
三、常用命令速查
镜像操作:
docker pull nginx → 从仓库拉取镜像
docker images → 查看本地镜像
docker rmi 镜像ID → 删除镜像
docker build -t 名字:标签 . → 从Dockerfile构建镜像
容器操作:
docker run -d -p 80:80 nginx → 后台运行Nginx,映射80端口
docker ps → 查看运行中容器
docker ps -a → 查看所有容器(含停止的)
docker stop 容器ID → 停止容器
docker rm 容器ID → 删除容器
docker logs -f 容器ID → 实时看容器日志
docker exec -it 容器ID /bin/bash → 进入容器内部
docker restart 容器ID → 重启容器
数据卷:解决容器删除后数据丢失的问题。-v 主机路径:容器内路径 挂载目录。
四、实战:跑起第一个Nginx
步骤1:docker pull nginx(拉取最新Nginx镜像)
步骤2:docker run -d --name mynginx -p 8080:80 nginx(后台运行,命名mynginx,主机8080映射容器80)
步骤3:浏览器打开localhost:8080,看到Welcome to nginx页面——你的第一个Docker容器跑起来了!
步骤4:docker exec -it mynginx /bin/bash(进入容器,ls /usr/share/nginx/html看Nginx根目录)
步骤5:把自己的网页放进容器:docker cp index.html mynginx:/usr/share/nginx/html/(从宿主机复制文件到容器)
步骤6:刷新浏览器,看到自己的网页了!
五、Dockerfile:构建自己的镜像
Dockerfile是构建镜像的脚本文件。每行一个指令:
FROM php:8.2-apache → 基于官方PHP+Apache镜像
WORKDIR /var/www/html → 设置工作目录
COPY src/ . → 把本地src目录复制到工作目录
RUN composer install → 运行composer安装依赖
EXPOSE 80 → 声明80端口
CMD ["apache2-foreground"] → 容器启动时执行的命令
构建:docker build -t myapp:1.0 .
运行:docker run -d -p 8080:80 -v /host/data:/var/www/html myapp:1.0
六、docker-compose:多容器编排
一个项目要跑好几个容器(Web+数据库+缓存),手动一个个run很麻烦。docker-compose用YAML文件一次启动所有服务:
services:
web: image: nginx; ports: ["8080:80"]; volumes: ["./html:/usr/share/nginx/html"]
mysql: image: mysql:5.7; environment: {MYSQL_ROOT_PASSWORD: "123456"}; volumes: ["dbdata:/var/lib/mysql"]
redis: image: redis:7-alpine
然后docker-compose up -d 一条命令启动Web+MySQL+Redis三个容器,自动创建网络让它们互相连通。docker-compose down 一条命令全部停掉。
七、避坑清单
❌ 不要用latest标签→用具体版本号,latest可能每次拉到不同版本
❌ 容器里不要存数据→用数据卷挂载,容器删了数据不丢
❌ 不要在容器里手动改配置→改Dockerfile重建镜像
❌ 基础镜像选alpine版本→比full版小很多
❌ 不要用root用户跑容器→用非root用户,安全
Docker入门就这些核心。学会了基本命令,跑镜像写Dockerfile用compose编排,30分钟就能上手。2026年部署一个服务,不会Docker就像不会用鼠标一样。晚安,打工人。
