答案
Docker 是一个开源的容器化平台,它可以将应用程序及其依赖项打包到一个轻量级、可移植的容器中,从而实现应用程序在任何环境中的快速部署和运行。
Docker 的核心概念
1. 镜像(Image)
Docker 镜像是一个只读的模板,包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。镜像是分层构建的,每一层都是只读的。
特点:
- 只读模板
- 分层结构
- 可复用和共享
- 通过 Dockerfile 定义
2. 容器(Container)
容器是镜像的运行实例。它是一个轻量级、独立的可执行软件包,包含了运行应用程序所需的一切。容器共享宿主机的操作系统内核,但彼此隔离。
特点:
- 轻量级(相比虚拟机)
- 快速启动(秒级)
- 资源隔离
- 可移植性强
3. 仓库(Registry)
Docker 仓库用于存储和分发 Docker 镜像。最常用的是 Docker Hub,也可以搭建私有仓库。
常用仓库:
- Docker Hub(官方公共仓库)
- Docker Registry(私有仓库)
- Harbor(企业级私有仓库)
- AWS ECR、Google GCR(云厂商仓库)
Docker 与虚拟机的区别
| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB 级 | GB 级 |
| 性能 | 接近原生 | 有一定损耗 |
| 隔离性 | 进程级隔离 | 硬件级隔离 |
| 可移植性 | 高 | 中等 |
| 管理复杂度 | 低 | 高 |
Dockerfile 常用指令
dockerfile# 基础镜像 FROM ubuntu:20.04 # 维护者信息 MAINTAINER yourname@example.com # 设置工作目录 WORKDIR /app # 复制文件 COPY . /app # 安装依赖 RUN apt-get update && apt-get install -y python3 # 设置环境变量 ENV PYTHONUNBUFFERED=1 # 暴露端口 EXPOSE 8080 # 运行命令 CMD ["python3", "app.py"]
常用指令说明:
FROM:指定基础镜像RUN:执行命令COPY/ADD:复制文件到镜像CMD/ENTRYPOINT:容器启动时执行的命令ENV:设置环境变量EXPOSE:声明容器监听的端口VOLUME:创建挂载点WORKDIR:设置工作目录
Docker 常用命令
镜像操作
bash# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:latest # 查看本地镜像 docker images # 删除镜像 docker rmi nginx:latest # 构建镜像 docker build -t myapp:v1 .
容器操作
bash# 运行容器 docker run -d -p 80:80 --name mynginx nginx # 查看运行中的容器 docker ps # 查看所有容器 docker ps -a # 停止容器 docker stop mynginx # 启动容器 docker start mynginx # 删除容器 docker rm mynginx # 查看容器日志 docker logs mynginx # 进入容器 docker exec -it mynginx /bin/bash
Docker 的优势
- 一致性:开发、测试、生产环境完全一致
- 可移植性:一次构建,到处运行
- 快速部署:秒级启动,快速扩展
- 资源效率:相比虚拟机占用更少资源
- 微服务架构:天然支持微服务部署
- 版本控制:镜像可以版本化管理
- 持续集成:易于集成到 CI/CD 流程
Docker 最佳实践
- 使用官方基础镜像:优先使用官方镜像,确保安全性
- 最小化镜像大小:使用 alpine 等轻量级基础镜像
- 多阶段构建:减少最终镜像大小
- 不要在容器中存储数据:使用 Volume 持久化数据
- 使用 .dockerignore:排除不必要的文件
- 一个容器一个进程:遵循单一职责原则
- 安全扫描:定期扫描镜像漏洞
- 标签管理:使用语义化版本标签
Docker 网络模式
- bridge:默认模式,容器通过 Docker 网桥通信
- host:容器使用宿主机网络栈
- none:容器没有网络接口
- container:容器共享另一个容器的网络栈
- 自定义网络:创建用户定义的网络
Docker 数据持久化
bash# 创建数据卷 docker volume create mydata # 挂载数据卷 docker run -v mydata:/data nginx # 挂载主机目录 docker run -v /host/path:/container/path nginx
Docker 是现代云原生应用的基础设施,它通过容器化技术极大地简化了应用程序的部署和管理,是 DevOps 工具链中不可或缺的重要组成部分。