初识Docker:从基础概念到实战安装的完全指南
一、Docker核心概念解析
1.1 镜像(Image):容器的基石
Docker镜像本质上是分层存储的文件系统,采用UnionFS技术将多个只读层叠加形成完整文件系统。每个镜像包含:
- 基础系统(如Ubuntu、CentOS)
- 预装软件(如Nginx、MySQL)
- 配置文件与环境变量
镜像特点:
- 不可变性:创建后无法修改,只能通过新建版本迭代
- 版本控制:支持标签(tag)管理不同版本(如nginx:latest、nginx:1.25.3)
- 轻量化:通过共享基础层减少存储占用
典型镜像结构:
/var/lib/docker/overlay2/├── l/(链接目录)└── <ID>/(镜像层目录)├── diff/(实际文件)├── link/(元数据)└── layer.tar(压缩层)
1.2 容器(Container):镜像的运行实例
容器是镜像的可写运行时环境,通过添加可写层实现:
- 独立进程空间:每个容器拥有独立PID命名空间
- 资源隔离:通过cgroups限制CPU、内存使用
- 网络隔离:默认桥接网络,支持自定义网络
容器生命周期:
graph TDA[创建容器] --> B{运行状态}B -->|running| C[执行命令]B -->|paused| D[暂停状态]B -->|exited| E[停止状态]C --> F[退出]F --> B
1.3 仓库(Registry):镜像的存储中心
Docker仓库分为:
- 官方仓库:Docker Hub(默认),包含200,000+镜像
- 私有仓库:企业自建的Harbor、Nexus等
- 第三方仓库:阿里云、腾讯云等提供的镜像服务
仓库操作流程:
# 登录仓库docker login registry.example.com# 推送镜像docker tag myapp:v1 registry.example.com/user/myapp:v1docker push registry.example.com/user/myapp:v1# 拉取镜像docker pull registry.example.com/user/myapp:v1
二、Docker安装全攻略
2.1 Linux系统安装(Ubuntu 22.04示例)
步骤1:卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
步骤2:安装依赖
sudo apt-get updatesudo apt-get install -y \apt-transport-https \ca-certificates \curl \gnupg \lsb-release
步骤3:添加GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
步骤4:设置稳定版仓库
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
步骤5:安装Docker引擎
sudo apt-get updatesudo apt-get install -y docker-ce docker-ce-cli containerd.io
步骤6:验证安装
sudo docker run --rm hello-world
2.2 Windows系统安装(WSL2后端)
前提条件:
- Windows 10/11专业版/企业版
- 启用WSL2功能
- 开启虚拟化支持(BIOS设置)
安装步骤:
-
安装WSL2核心
wsl --install
-
更新WSL2内核
Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile wsl_update_x64.msi -UseBasicParsingStart-Process msiexec.exe -Wait -ArgumentList "/i wsl_update_x64.msi"
-
安装Docker Desktop
- 下载Docker Desktop for Windows
- 安装时选择Use WSL 2 instead of Hyper-V
- 配置WSL2集成
# 在PowerShell中设置默认WSL版本wsl --set-default-version 2
2.3 macOS系统安装(Homebrew方式)
安装步骤:
-
安装Homebrew(如未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
-
通过Homebrew安装Docker
brew install --cask docker
-
启动Docker Desktop
open /Applications/Docker.app
-
验证安装
docker --versiondocker run --rm hello-world
三、Docker基础操作实战
3.1 镜像管理命令
搜索镜像:
docker search nginx# 输出示例:# NAME DESCRIPTION STARS OFFICIAL AUTOMATED# nginx Official build 19283 [OK]
拉取镜像:
docker pull nginx:alpine # 轻量版docker pull mysql:8.0.33 # 指定版本
查看本地镜像:
docker images# 输出示例:# REPOSITORY TAG IMAGE ID CREATED SIZE# nginx latest 605c77e624dd 2 weeks ago 188MB
删除镜像:
docker rmi nginx:latest # 删除指定镜像docker rmi $(docker images -q) # 删除所有镜像(谨慎使用)
3.2 容器生命周期管理
创建并启动容器:
docker run -d --name mynginx \-p 8080:80 \-v /host/path:/usr/share/nginx/html \nginx:latest
参数说明:
-d:后台运行--name:指定容器名-p:端口映射(主机端口:容器端口)-v:卷挂载(主机目录:容器目录)
进入运行中容器:
docker exec -it mynginx /bin/bash# 在容器内执行命令后,退出使用exit
查看容器日志:
docker logs -f mynginx # 实时跟踪日志docker logs --tail=100 mynginx # 查看最后100行
停止/启动容器:
docker stop mynginx # 优雅停止docker kill mynginx # 强制终止docker start mynginx # 启动已停止容器docker restart mynginx # 重启容器
3.3 容器网络配置
查看网络列表:
docker network ls# 输出示例:# NETWORK ID NAME DRIVER SCOPE# a1b2c3d4e5f6 bridge bridge local
创建自定义网络:
docker network create --driver bridge mynet
连接容器到网络:
docker run -d --name web1 --network mynet nginxdocker run -d --name web2 --network mynet nginx
测试网络连通性:
# 在web1容器内ping web2docker exec -it web1 ping web2
四、Dockerfile实战:构建自定义镜像
4.1 基础Dockerfile示例
# 使用官方Python镜像作为基础FROM python:3.9-slim# 设置工作目录WORKDIR /app# 复制依赖文件并安装COPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码COPY . .# 暴露端口EXPOSE 8000# 定义启动命令CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
4.2 多阶段构建优化
# 构建阶段FROM golang:1.20 AS builderWORKDIR /appCOPY . .RUN go build -o myapp .# 运行阶段FROM alpine:latestWORKDIR /appCOPY --from=builder /app/myapp .CMD ["./myapp"]
4.3 最佳实践建议
-
镜像分层优化:
- 将不常变更的操作(如安装依赖)放在前面
- 使用
.dockerignore文件排除无关文件
-
安全加固:
- 避免使用
root用户运行应用 - 定期更新基础镜像
- 避免使用
-
缓存利用:
- 将
COPY requirements.txt .和RUN pip install分开 - 修改代码时不会重新安装依赖
- 将
五、Docker Compose入门
5.1 基础配置示例
version: '3.8'services:web:image: nginx:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmldb:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: exampleMYSQL_DATABASE: mydbvolumes:- db_data:/var/lib/mysqlvolumes:db_data:
5.2 常用命令
# 启动服务docker-compose up -d# 查看服务状态docker-compose ps# 停止服务docker-compose down# 重建服务docker-compose up --build
六、常见问题解决方案
6.1 端口冲突处理
问题现象:
Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
解决方案:
-
查找占用端口的进程
sudo lsof -i :80
-
终止冲突进程或修改容器端口映射
6.2 镜像拉取缓慢
优化方法:
-
配置国内镜像加速器(以阿里云为例)
// /etc/docker/daemon.json{"registry-mirrors": ["https://<your-id>.mirror.aliyuncs.com"]}
-
重启Docker服务
sudo systemctl restart docker
6.3 容器无法访问互联网
排查步骤:
-
检查容器网络模式
docker inspect <容器ID> | grep NetworkMode
-
测试DNS解析
docker exec -it <容器ID> cat /etc/resolv.confdocker exec -it <容器ID> ping google.com
-
解决方案:
- 使用
--dns参数指定DNS服务器 - 创建自定义网络并配置DNS
- 使用
七、进阶学习路径
- 容器编排:学习Kubernetes或Docker Swarm
- 安全实践:研究Docker安全基准(CIS Docker Benchmark)
- 性能优化:掌握cgroups资源限制和内核参数调优
- CI/CD集成:将Docker与Jenkins、GitLab CI等工具结合
通过本文的系统学习,您已掌握Docker从基础概念到实战操作的核心技能。建议从简单应用容器化开始,逐步实践多容器部署和网络配置,最终实现生产环境的容器化改造。