初识Docker:基本概念及安装使用(巨详细版)
一、为什么需要Docker?
在传统开发环境中,应用部署常面临”环境差异”问题:开发环境能运行,测试环境却报错;本地依赖已安装,服务器却缺失关键组件。这种”在我机器上能运行”的困境,本质是环境隔离与标准化难题。
Docker通过容器化技术解决了这个问题。它将应用及其依赖打包成独立运行的单元(容器),确保在任何环境中行为一致。相比虚拟机,Docker容器具有轻量级(共享主机内核)、秒级启动、资源占用低等优势,成为现代微服务架构的标配工具。
典型应用场景包括:
- 持续集成/持续部署:快速构建、测试、部署流水线
- 微服务架构:每个服务独立容器化,解耦依赖
- 多环境一致性:开发、测试、生产环境完全一致
- 资源隔离:避免应用间冲突,提高安全性
二、Docker核心概念解析
1. 镜像(Image)
镜像是容器的静态模板,包含应用代码、运行时环境、系统工具等完整文件系统。类似类定义,镜像本身不可运行,但可通过docker run实例化为容器。
关键特性:
- 分层存储:每个操作(如安装软件)生成新层,共享基础层
- 不可变性:镜像创建后内容固定,修改需生成新镜像
- 标签管理:通过
<仓库名>:<标签>(如nginx:latest)区分版本
常用命令:
# 拉取镜像docker pull ubuntu:20.04# 列出本地镜像docker images# 删除镜像docker rmi nginx:latest
2. 容器(Container)
容器是镜像的运行时实例,通过Docker引擎创建和管理。每个容器拥有独立进程空间、网络栈和文件系统,但共享主机内核。
生命周期管理:
# 创建并启动容器docker run -d --name my_nginx nginx:latest# 进入运行中容器docker exec -it my_nginx bash# 停止容器docker stop my_nginx# 删除容器docker rm my_nginx
3. 仓库(Registry)
仓库是镜像的存储中心,分为公有(如Docker Hub)和私有(如Harbor)。通过docker push/pull与仓库交互。
私有仓库搭建:
# 运行官方registry容器docker run -d -p 5000:5000 --name registry registry:2# 标记镜像并推送docker tag my_image localhost:5000/my_imagedocker push localhost:5000/my_image
4. Dockerfile
Dockerfile是镜像构建脚本,通过一系列指令定义镜像构建流程。每个指令生成一个镜像层。
示例Dockerfile:
# 使用官方Python基础镜像FROM python:3.9-slim# 设置工作目录WORKDIR /app# 复制依赖文件并安装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码COPY . .# 暴露端口并指定启动命令EXPOSE 8000CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
构建镜像:
docker build -t my_app:v1 .
三、Docker安装全流程
1. 系统要求
- Linux:内核3.10+(推荐Ubuntu 20.04/CentOS 7+)
- Windows:Pro/Enterprise版(需Hyper-V支持)
- macOS:10.15+(基于HyperKit虚拟化)
2. Linux安装(Ubuntu示例)
# 卸载旧版本(如有)sudo apt-get remove docker docker-engine docker.io containerd runc# 安装依赖sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release# 添加Docker官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# 添加稳定版仓库echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null# 安装Docker引擎sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装sudo docker run hello-world
3. Windows/macOS安装
- 下载Docker Desktop
- 双击安装包,按向导完成安装
- 启动Docker Desktop,等待初始化完成
- 验证:打开终端执行
docker version
4. 配置镜像加速(国内用户)
编辑/etc/docker/daemon.json(Linux)或Docker Desktop设置(Windows/macOS):
{"registry-mirrors": ["https://registry.docker-cn.com","https://mirror.baidubce.com"]}
重启Docker服务生效。
四、Docker基础操作实战
1. 运行第一个容器
# 启动交互式Ubuntu容器docker run -it --rm ubuntu bash# 在容器内执行命令(退出后自动删除)apt update && apt install -y curlcurl example.com
2. 端口映射与数据卷
# 运行Nginx并映射端口docker run -d -p 8080:80 --name web nginx# 访问http://localhost:8080# 使用数据卷持久化数据docker run -d -p 3306:3306 \-v mysql_data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=123456 \mysql:5.7
3. 网络配置
# 创建自定义网络docker network create my_net# 运行容器并加入网络docker run -d --name db --network my_net mysql:5.7docker run -d --name app --network my_net \-e DB_HOST=db \my_app:v1
4. 资源限制
# 限制内存和CPUdocker run -d --name resource_test \--memory="512m" \--cpus="1.5" \nginx:latest
五、最佳实践与常见问题
1. 镜像构建优化
- 多阶段构建:减少最终镜像大小
```dockerfile
构建阶段
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
运行阶段
FROM alpine:latest
COPY —from=builder /app/myapp /usr/local/bin/
CMD [“myapp”]
- **合理使用.dockerignore**:排除不必要的文件
.git
node_modules
*.log
```
2. 安全建议
- 避免以root用户运行容器
- 定期更新基础镜像
- 使用非特权端口(>1024)
- 限制容器资源
3. 常见问题排查
- 容器启动失败:使用
docker logs <容器名>查看日志 - 端口冲突:检查
docker ps和主机端口占用 - 镜像拉取慢:配置镜像加速器
- 权限问题:将用户加入docker组(
sudo usermod -aG docker $USER)
六、进阶学习路径
- 编排工具:学习Docker Compose(多容器管理)和Kubernetes(集群编排)
- 安全实践:研究Docker Security Benchmark和镜像扫描工具(如Trivy)
- 性能优化:深入cgroups和namespace原理
- 开发工作流:集成Docker到CI/CD流水线(如Jenkins+Docker)
通过系统学习这些内容,开发者可以快速掌握Docker核心技术,为构建现代化云原生应用打下坚实基础。建议从实际项目出发,边实践边深化理解,逐步掌握容器化开发的完整流程。