一、环境准备与基础安装
在Ubuntu系统上部署Docker精简版需完成三步配置:首先通过apt更新系统包索引,确保获取最新版本依赖;其次安装Docker核心组件,推荐使用官方维护的docker.io包,该版本经过社区充分验证且兼容性良好;最后配置用户权限,将当前用户加入docker用户组以避免每次操作需sudo提权。
验证安装成功后,建议立即执行docker version检查客户端与服务端通信状态。对于开发环境,可进一步配置国内镜像加速源,在/etc/docker/daemon.json中添加:
{"registry-mirrors": ["https://<镜像加速器地址>"]}
重启服务后通过docker info查看镜像拉取速度是否提升。
二、核心概念与基础操作
容器化开发涉及三个关键概念:镜像作为应用模板,容器作为运行实例,仓库作为镜像存储中心。基础操作包含四步工作流:
- 镜像管理:使用
docker pull从公共仓库获取镜像,通过docker images查看本地镜像列表,docker rmi清理无用镜像 - 容器生命周期:
docker run创建并启动容器,docker stop/start控制运行状态,docker rm删除停止的容器 - 进程监控:
docker ps查看运行中容器,docker logs获取日志输出,docker exec进入容器交互界面 - 资源限制:通过
-m参数限制内存,--cpus控制CPU配额,防止单个容器占用过多系统资源
以Nginx服务为例,典型部署流程如下:
# 拉取官方镜像docker pull nginx:alpine# 启动容器并映射端口docker run -d -p 8080:80 --name webserver nginx:alpine# 验证服务curl http://localhost:8080
三、数据持久化方案
容器默认存储具有临时性,需通过两种机制实现数据持久化:
- 数据卷(Volumes):由Docker管理的专用存储空间,通过
docker volume create预先创建,在容器启动时通过-v参数挂载。具有三大优势:独立于容器生命周期、支持多容器共享、可跨主机迁移 - 主机目录挂载:直接将宿主机目录映射到容器内部,适用于开发环境代码热更新场景。需注意权限配置,建议使用
--mount type=bind,source=/host/path,target=/container/path语法
实战案例:MySQL数据库持久化配置
# docker-compose.yml示例version: '3'services:db:image: mysql:5.7volumes:- db_data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: examplevolumes:db_data:
四、网络配置进阶
容器网络包含四种模式:
- 桥接模式(bridge):默认模式,容器通过虚拟网桥通信
- 主机模式(host):共享宿主机网络命名空间,性能最佳但安全性较低
- 容器模式(container):与其他容器共享网络配置
- 无网络模式(none):禁用所有网络功能
端口映射通过-p参数实现,支持三种格式:
-p 8080:80:指定宿主机端口映射-p 8080:随机宿主机端口映射-P:随机映射所有暴露端口
自定义网络配置示例:
# 创建自定义网络docker network create app_network# 启动容器并加入网络docker run -d --network app_network --name api_service python:3.9-slimdocker run -d --network app_network --name db_service mysql:5.7# 容器间可直接通过服务名通信# api_service容器内可访问db_service:3306
五、编排工具实战
Docker Compose通过YAML文件定义多容器应用,核心组件包括:
- 服务定义:每个服务对应一个容器镜像,可配置构建参数、环境变量、依赖关系等
- 网络配置:定义内部网络拓扑,支持自定义网络驱动
- 卷管理:声明数据卷及其挂载点
- 扩展选项:支持容器副本数、重启策略、资源限制等高级配置
以Django应用为例的完整配置:
version: '3.8'services:web:build: .command: python manage.py runserver 0.0.0.0:8000volumes:- .:/codeports:- "8000:8000"depends_on:- dbdb:image: postgres:13environment:- POSTGRES_DB=mydatabase- POSTGRES_USER=myuser- POSTGRES_PASSWORD=mypasswordvolumes:- postgres_data:/var/lib/postgresql/datavolumes:postgres_data:
六、镜像构建最佳实践
编写高效Dockerfile需遵循六项原则:
- 基础镜像选择:优先使用Alpine等精简镜像,减少层级和体积
- 合并指令:将多个
RUN指令合并为单层,减少镜像层数 - 依赖管理:先复制依赖文件再执行安装,利用缓存机制加速构建
- 用户权限:非必要不使用root用户运行进程
- 多阶段构建:分离构建环境和运行环境,仅保留最终产物
- 标签管理:为镜像添加语义化版本标签,便于版本控制
优化后的Dockerfile示例:
# 构建阶段FROM python:3.9-slim as builderWORKDIR /appCOPY requirements.txt .RUN pip install --user -r requirements.txt# 运行阶段FROM python:3.9-slimWORKDIR /appCOPY --from=builder /root/.local /root/.localCOPY . .ENV PATH=/root/.local/bin:$PATHCMD ["python", "app.py"]
七、安全加固建议
容器安全需重点关注五个方面:
- 镜像来源:仅使用可信仓库的官方镜像,定期扫描漏洞
- 运行时隔离:启用Seccomp、AppArmor等安全配置文件
- 资源限制:防止容器资源耗尽攻击
- 网络隔离:使用自定义网络划分安全域
- 日志监控:集中收集容器日志,设置异常告警
安全扫描工具使用示例:
# 使用Trivy扫描镜像漏洞trivy image python:3.9-slim# 生成Seccomp配置文件docker run --security-opt seccomp=default.json nginx
通过系统掌握上述技术要点,开发者可在Ubuntu环境下快速构建高效、安全的容器化应用。建议从简单服务开始实践,逐步过渡到复杂分布式系统开发,最终形成完整的容器化开发运维体系。