一、背景:为什么需要 Docker?
在传统开发流程中,开发者常面临以下痛点:
- 环境不一致:开发环境能运行的代码,在测试或生产环境因依赖版本差异崩溃。
- 资源浪费:每个应用占用一个虚拟机,硬件资源利用率低。
- 部署复杂:手动配置环境耗时耗力,且易出错。
Docker 的解决方案:
- 容器化技术:将应用及其依赖(如库、配置文件)打包成独立的镜像,确保环境一致性。
- 轻量级虚拟化:共享主机内核,启动速度接近原生应用,资源占用更低。
- 快速部署:通过镜像仓库(如 Docker Hub)一键分发应用。
典型应用场景:
- 开发环境隔离(避免全局依赖冲突)。
- 持续集成/持续部署(CI/CD)流水线。
- 微服务架构下的服务拆分与部署。
二、安装部署:以 CentOS 7 为例
2.1. 准备工作
# 检查内核版本(如3.10.0-1160.el7.x86_64)
uname -r
# 停止防火墙服务(立即生效)
sudo systemctl stop firewalld
# 禁止防火墙开机自启动
sudo systemctl disable firewalld
注意:生产环境需配置防火墙规则,而非直接关闭。
2.2. 卸载旧版本(如有)
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.3. 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置 Docker 官方源(推荐阿里云镜像源)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
2.4. 启动 Docker 并设置开机自启
# 启动docker
systemctl start docker
# 配置docker开机自启动
systemctl enable docker
# 查询docker版本
docker version
# 查询docker镜像
docker images
2.5. 配置镜像加速(国内环境必做)
#配置Docker镜像源(2025.5.3确认有效)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
三、Docker 核心操作详解
3.1. 镜像管理
拉取镜像
# 拉取最新版 nginx镜像(也可以在:后面指定拉取版本)
docker pull nginx:latest
查看本地镜像
docker nginx # 输出示例:
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest 605c77e624dd 10 days ago 142MB
删除镜像
# 删除指定镜像
docker rmi nginx:latest
# 删除所有未被使用的镜像(谨慎操作)
docker image prune -a
3.2. 容器操作
启动容器
docker run -d \ # -d后台启动
--name my-nginx \ # 容器名称
-p 8080:80 \ # 将主机的 8080 端口映射到容器的 80 端口
nginx:latest # 启动镜像名称
查看运行中的容器
docker ps # 输出示例:
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# a1b2c3d4e5f6 nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp my-nginx
进入容器内部
# 进入容器的 Bash 环境
docker exec -it my-nginx /bin/bash
退出容器
exit # 或按 Ctrl+D
停止/启动/重启容器
docker stop my-nginx # 停止容器
docker start my-nginx # 启动容器
docker restart my-nginx # 重启容器
删除容器
docker rm my-nginx # 删除已停止的容器
docker rm -f my-nginx # 强制删除运行中的容器
3.3. 数据持久化
# 场景:容器重启后数据丢失(如数据库文件)。
# 解决方案:使用 -v 挂载主机目录到容器
docker run -d \
--name my-nginx \
-p 8080:80 \ # 将主机的 8080 端口映射到容器的 80 端口
-v /host/nginx/conf.d:/etc/nginx/conf.d \ # 挂载配置文件目录
-v /host/nginx/logs:/var/log/nginx \ # 挂载日志目录
-v /host/nginx/html:/usr/share/nginx/html \ # 挂载静态资源目录
nginx:latest
四、实战案例:部署 Nginx服务
4.1. 拉取 Nginx镜像
docker pull nginx # 拉取nginx最新的镜像
4.2. 创建Nginx数据持久化目录
sudo mkdir -p /host/nginx/{conf.d,logs,html}
sudo chmod -R 755 /host/nginx # 设置合理权限(生产环境避免 777)
4.3. 启动Nginx容器
docker run -d \
--name my-nginx \
-p 8080:80 \ # 将主机的 8080 端口映射到容器的 80 端口
-v /host/nginx/conf.d:/etc/nginx/conf.d \ # 挂载配置文件目录
-v /host/nginx/logs:/var/log/nginx \ # 挂载日志目录
-v /host/nginx/html:/usr/share/nginx/html \ # 挂载静态资源目录
nginx:latest
4.4. 验证Nginx服务
访问http://<服务器ip>:8080看到nginx默认页面即部署成功。
五、常见问题与避坑指南
5.1. 容器无法访问
- 原因:
- 端口未映射(未使用 -p 参数)。
- 防火墙拦截。
- 容器内服务未启动。
- 解决:
- 检查端口映射:docker ps
- 查看容器日志:docker logs nginx-server
- 进入容器检查服务状态:docker exec -it nginx-server ps 。
5.2. 数据丢失
- 原因:未使用 -v 挂载数据卷。
- 解决:重新启动容器时添加 -v 参数。
5.3. 镜像拉取缓慢
- 原因:默认使用 Docker Hub 官方源。
- 解决:配置国内镜像源(如阿里云、网易等等)。
如有其他问题报错或者需要进一步补充细节可以留言反馈。