1. Docker容器化技术概述
容器化技术正在彻底改变现代应用的部署方式。作为一名长期从事系统运维的工程师,我见证了从传统虚拟机到容器技术的演进过程。Docker作为当前最流行的容器引擎,其核心价值在于提供轻量级、标准化的应用打包与运行环境。
与虚拟机相比,Docker容器直接共享主机操作系统内核,不需要为每个应用单独模拟完整的操作系统。这意味着:
- 启动时间从分钟级缩短到秒级
- 资源占用减少50%以上
- 同一物理机可运行的应用实例数量成倍增加
在实际生产环境中,我们使用Docker主要解决以下痛点:
- 环境不一致问题:开发、测试、生产环境难以保持完全一致
- 依赖冲突:不同应用对系统库版本要求不同
- 资源隔离:避免应用间相互影响
- 快速部署:秒级启动和停止应用
2. 环境准备与系统配置
2.1 硬件与系统选择建议
对于学习和小型项目,推荐以下两种方案:
方案一:云服务器(ECS)
- 配置:1核CPU/2GB内存/1M带宽
- 优势:即开即用,网络环境稳定
- 推荐厂商:阿里云、腾讯云的学生机
方案二:本地虚拟机
- 软件:VMware Workstation或VirtualBox
- 配置:至少分配1核/2GB内存/20GB存储
- 优势:完全控制,适合实验性操作
提示:无论选择哪种方案,建议系统选择CentOS 7.x版本,因其对Docker的兼容性最好且长期支持。
2.2 系统内核检查与网络配置
安装前必须确认系统内核版本:
uname -r输出应为3.10或更高版本,如3.10.0-1160.el7.x86_64
网络配置是后续安装的关键,常见问题多出在此环节:
- 查看网络接口名称
ip addr通常会显示ens33或eth0等接口名
- 编辑网络配置文件
vi /etc/sysconfig/network-scripts/ifcfg-ens33关键参数配置:
BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.100 # 根据实际网络设置 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8- 应用网络配置
systemctl restart network ping www.baidu.com # 测试网络连通性3. Docker安装与配置详解
3.1 彻底卸载旧版本
如果系统存在旧版Docker,必须完全卸载以避免冲突:
# 移除Docker引擎及相关组件 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 清理残留文件和目录 rm -rf /var/lib/docker rm -rf /var/lib/containerd3.2 安装最新版Docker引擎
- 安装必要工具包
yum install -y yum-utils device-mapper-persistent-data lvm2- 配置国内镜像源(解决下载慢问题)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo- 更新缓存并安装
yum makecache fast yum install -y docker-ce docker-ce-cli containerd.io- 启动并设置开机自启
systemctl start docker systemctl enable docker- 验证安装
docker --version docker run hello-world3.3 配置优化建议
- 修改Docker数据存储目录(默认/var/lib/docker)
mkdir -p /data/docker vi /etc/docker/daemon.json添加内容:
{ "data-root": "/data/docker", "registry-mirrors": ["https://registry.docker-cn.com"] }- 限制日志大小(防止日志爆盘)
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }- 应用配置并重启
systemctl daemon-reload systemctl restart docker4. Docker核心操作实战
4.1 镜像管理技巧
- 搜索和下载镜像
docker search nginx # 搜索官方镜像 docker pull nginx:1.21 # 下载指定版本- 查看和管理本地镜像
docker images # 列出所有镜像 docker rmi <image_id> # 删除指定镜像 docker image prune # 清理悬空镜像- 镜像导入导出(适用于内网环境)
docker save -o nginx.tar nginx:latest # 导出 docker load -i nginx.tar # 导入4.2 容器生命周期管理
- 启动容器常用参数解析
docker run -d --name my_nginx \ -p 8080:80 \ -v /host/path:/container/path \ -e ENV_VAR=value \ nginx:latest参数说明:
-d:后台运行--name:指定容器名称-p:端口映射(主机端口:容器端口)-v:数据卷挂载-e:设置环境变量
- 容器状态监控
docker ps -a # 查看所有容器 docker stats # 实时资源监控 docker logs -f my_nginx # 查看实时日志- 进入容器调试
docker exec -it my_nginx /bin/bash注意:生产环境应避免直接进入容器操作,建议通过日志和监控排查问题
4.3 网络与存储配置
- 创建自定义网络
docker network create my_network docker run --network=my_network --name app1 my_app- 数据卷管理
docker volume create my_volume docker run -v my_volume:/data my_app- 容器间通信
# 通过容器名直接通信(需在同一网络) docker exec app1 ping app25. 防火墙与端口管理
5.1 防火墙基本操作
- 检查防火墙状态
systemctl status firewalld- 常用防火墙命令
systemctl start firewalld # 启动 systemctl stop firewalld # 停止 systemctl enable firewalld # 开机自启5.2 端口放行规则配置
- 永久放行单个端口
firewall-cmd --zone=public --add-port=80/tcp --permanent- 放行端口范围
firewall-cmd --zone=public --add-port=8000-9000/tcp --permanent- 查看已放行端口
firewall-cmd --list-ports- 重新加载配置
firewall-cmd --reload5.3 生产环境安全建议
- 最小化开放端口原则
- 为Docker容器使用独立zone
firewall-cmd --new-zone=docker --permanent firewall-cmd --reload- 结合SELinux增强安全
setenforce 1 # 启用SELinux强制模式6. 常见问题与解决方案
6.1 安装阶段问题
问题1:yum安装速度慢
- 解决方案:更换国内yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum clean all yum makecache问题2:docker启动失败
- 排查步骤:
journalctl -xe # 查看系统日志 docker info # 检查Docker状态6.2 运行时问题
问题1:端口冲突
- 解决方案:
netstat -tunlp | grep 80 # 查找占用端口的进程 docker run -p 8080:80 ... # 改用其他主机端口问题2:存储空间不足
- 清理策略:
docker system prune # 清理无用对象 docker volume prune # 清理无用数据卷6.3 性能优化技巧
- 限制容器资源
docker run -it --cpus="1.5" --memory="512m" my_app- 使用.dockerignore文件
# 示例内容 .git node_modules *.log- 多阶段构建优化镜像体积
# 构建阶段 FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 最终阶段 FROM alpine:latest COPY --from=builder /app/myapp . CMD ["./myapp"]在实际生产环境中部署Docker时,建议结合CI/CD流水线实现自动化构建和部署。我们团队使用GitLab Runner配合Docker实现了开发到生产的全流程自动化,部署效率提升了70%以上。对于有状态服务,要特别注意数据持久化方案的选择,分布式存储如Ceph是较好的选择。