本篇目标
一、为什么会出现 Docker?
在 Docker 出现之前,部署一个服务通常是这样的:
购买服务器 → 安装系统 → 安装运行环境 → 安装依赖 → 部署程序 → 修改配置 → 启动服务
看起来没什么问题。
但实际工作中经常遇到:
开发电脑运行正常 → 测试环境运行正常 → 生产环境启动失败
开发说:
我电脑上明明能跑。
运维说:
服务器上就是不行。
最终发现:
于是 Docker 出现了。
Docker 的核心思想其实很简单:
把程序和运行环境一起打包。
这样无论部署到哪里:
开发环境 → 测试环境 → 生产环境
运行结果都尽量保持一致。
二、什么是镜像?什么是容器?
很多新手最容易混淆这两个概念。
可以简单理解:
镜像(Image) → 启动运行 → 容器(Container)
举个例子:
Windows安装包 → 安装运行 → 软件程序
对应 Docker:
Docker镜像 → docker run → Docker容器
因此:
记住一句话:
镜像是静态的,容器是运行中的。
三、安装 Docker
Ubuntu:
# 更新软件源
apt update
# 安装 Docker
apt install docker.io -y
# 设置开机启动
systemctl enable docker
# 启动服务
systemctl start docker
# 查看状态
systemctl status docker
验证安装:
# 查看版本
docker version
# 查看运行信息
docker info
# 运行测试容器
docker run hello-world
如果出现:
Hello from Docker!
说明安装成功。
四、Docker 最常用的命令
刚开始学习 Docker,不需要背全部命令。
先掌握下面这些:
# 查看镜像
docker images
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 查看容器日志
docker logs 容器名
# 停止容器
docker stop 容器名
# 启动容器
docker start 容器名
# 删除容器
docker rm 容器名
# 删除镜像
docker rmi 镜像名
# 进入容器
docker exec -it 容器名 bash
其中使用频率最高的是:
docker ps → 查看运行状态
docker logs → 查看错误日志
docker exec → 进入容器排查问题
五、部署第一个容器
以 Nginx 为例。
先拉取镜像:
docker pull nginx
查看镜像:
docker images
启动容器:
docker run -d \
--name nginx \
-p 80:80 \
nginx
# -d 后台运行
# --name 指定容器名称
# -p 端口映射
查看容器:
docker ps
浏览器访问服务器 IP:
http://服务器IP
如果出现 Nginx 欢迎页面,说明容器启动成功。
六、什么是端口映射?
很多新人第一次接触 Docker 时都会疑惑:
容器明明启动了,为什么访问不到?
原因通常是:
容器内部端口没有映射到宿主机
例如:
docker run -d \
--name nginx \
-p 80:80 \
nginx
端口对应关系:
如果改成:
docker run -d \
--name nginx \
-p 8080:80 \
nginx
则变成:
此时访问地址应该是:
http://服务器IP:8080
七、容器删除后为什么数据会丢失?
很多新手都会踩这个坑。
例如启动一个 MySQL:
docker run -d mysql
运行几个月后。
误删容器:
docker rm -f mysql
结果发现:
数据库数据全部消失
原因是:
数据默认保存在容器内部。
而容器本身是临时资源。
删除容器时:
容器内的数据也会一起删除
八、数据卷(Volume)
解决方案就是:
把数据保存到宿主机。
启动一个带数据卷的 Nginx:
docker run -d \
--name nginx \
-p 80:80 \
-v /data/nginx/html:/usr/share/nginx/html \
nginx
目录映射关系:
| |
|---|
/data/nginx/html | /usr/share/nginx/html |
这样网站文件实际保存在宿主机。
即使执行:
docker rm -f nginx
重新创建容器后:
数据依然存在
生产环境部署:
都必须使用数据卷。
九、进入容器
有时候需要进入容器查看文件。
例如:
docker exec -it nginx bash
进入后:
pwd
ls
cat
ps
这些命令都可以正常使用。
退出:
exit
不过生产环境更推荐:
修改宿主机配置 → 重新创建容器
而不是直接修改容器内部文件。
十、查看日志与排错
运维排错第一原则:
先看日志。
Docker 提供了非常方便的日志功能:
# 查看全部日志
docker logs nginx
# 实时查看日志
docker logs -f nginx
# 查看最近100行
docker logs --tail 100 nginx
排错流程建议:
docker ps -a → 查看容器状态
↓
docker logs → 查看错误日志
↓
docker exec → 进入容器排查
很多问题:
日志里都会直接给出线索。
十一、真实案例:容器启动失败
某次部署 Nginx。
执行:
docker run -d \
--name nginx \
-p 80:80 \
nginx
报错:
port is already allocated
查看端口占用:
ss -lntp
发现:
系统已经运行了一个 Nginx
占用了 80 端口。
解决方案:
方案一:
停止原有服务
方案二:
docker run -d \
--name nginx \
-p 8080:80 \
nginx
修改端口映射。
这个案例说明:
很多 Docker 问题,本质上还是 Linux 系统问题。
十二、Docker 与虚拟机有什么区别?
很多人会把 Docker 和虚拟机混为一谈。
实际上区别很大。
简单理解:
虚拟机 = 模拟完整电脑
Docker = 运行独立应用
因此现在越来越多企业选择:
Docker → Kubernetes → 云原生
作为基础架构。
十三、实战:部署一个静态网站
创建网站目录:
mkdir -p /data/nginx/html
创建首页:
echo "Hello Docker" > /data/nginx/html/index.html
启动容器:
docker run -d \
--name myweb \
-p 80:80 \
-v /data/nginx/html:/usr/share/nginx/html \
nginx
访问:
http://服务器IP
如果看到:
Hello Docker
说明:
网站部署成功
数据保存在宿主机
容器可随时重建
这就是 Docker 最基础、最常见的使用方式。
十四、本篇总结
Docker 的核心价值不是替代虚拟机,而是让应用部署变得标准化、可复制、可迁移。