Docker作为现代应用开发和部署的革命性技术,已经成为开发者和运维人员的必备技能。本文从零开始系统讲解Docker的核心概念、安装配置、基本操作、镜像制作和实战部署,帮助初学者快速掌握容器化技术。
![图片[1]-Docker零基础入门教程:从安装到部署完整指南](https://blogimg.vcvcc.cc/2025/11/20251113124608879-1024x768.png?imageView2/0/format/webp/q/75)
一、Docker核心概念解析
1. 什么是Docker?
Docker是一个开源的容器化平台,允许开发者将应用及其依赖打包到标准化的单元中,实现快速、一致的部署。
(1) 传统部署 vs Docker部署
传统部署问题:
- 环境不一致:开发、测试、生产环境差异
- 依赖冲突:不同应用依赖不同版本库
- 部署复杂:安装配置步骤繁琐
- 资源浪费:每个应用需要完整操作系统
Docker优势:
- 环境一致性:保证应用在任何环境运行一致
- 隔离性:每个容器独立运行,互不干扰
- 快速部署:秒级启动和停止
- 资源高效:共享主机内核,资源占用小
(2) Docker架构组成
Docker架构:
┌─────────────────────────────────────────┐
│ Docker Client │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Docker Daemon │
│ ┌─────────────┬─────────────────────┐ │
│ │ Images │ Containers │ │
│ │ (镜像) │ (容器) │ │
│ └─────────────┴─────────────────────┘ │
└─────────────────┬───────────────────────┘
│
┌─────────────────▼───────────────────────┐
│ Registry │
│ (镜像仓库) │
└─────────────────────────────────────────┘
2. 核心概念详解
(1) 镜像(Image)
- 只读模板,包含运行应用所需的所有内容
- 分层存储,提高复用性
- 通过Dockerfile构建
(2) 容器(Container)
- 镜像的运行实例
- 包含运行中的应用程序
- 可写层在只读镜像之上
(3) 仓库(Registry)
- 存储和分发镜像的地方
- 公共仓库:Docker Hub
- 私有仓库:企业内部使用
二、Docker安装与配置
1. Ubuntu系统安装
<strong>#!/bin/bash</strong>
# Ubuntu Docker安装脚本
# 1. 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 2. 更新包索引并安装依赖
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 3. 添加Docker官方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=amd64 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 update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 6. 启动Docker并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 7. 验证安装
sudo docker version
# 8. 测试运行
sudo docker run hello-world
# 9. 将当前用户添加到docker组(避免每次使用sudo)
sudo usermod -aG docker $USER
# 提示:需要重新登录或执行 newgrp docker 使配置生效
echo "请重新登录或执行: newgrp docker"
2. CentOS系统安装
<strong>#!/bin/bash</strong>
# CentOS Docker安装脚本
# 1. 卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2. 安装yum工具包
sudo yum install -y yum-utils
# 3. 设置稳定的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 4. 安装Docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
# 5. 启动Docker并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 6. 验证安装
sudo docker version
3. Windows系统安装
# 适用于Windows 10/11专业版、企业版、教育版
# 1. 启用Hyper-V
# 以管理员身份运行PowerShell,执行:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
# 2. 下载Docker Desktop
# 访问: https://www.docker.com/products/docker-desktop
# 下载并安装Docker Desktop
# 3. 安装后重启系统
# 4. 启动Docker Desktop,等待服务启动
# 5. 验证安装
docker version
4. 配置国内镜像加速器
# 创建Docker配置目录
sudo mkdir -p /etc/docker
# 配置镜像加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重启Docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证配置
docker info
三、Docker基础命令实战
1. 镜像管理命令
<strong>#!/bin/bash</strong>
# Docker镜像管理实战
# 1. 搜索镜像
echo "搜索Ubuntu镜像:"
docker search ubuntu
# 2. 拉取镜像
echo "拉取Ubuntu 20.04镜像:"
docker pull ubuntu:20.04
# 3. 查看本地镜像
echo "查看本地镜像列表:"
docker images
# 4. 查看镜像详细信息
echo "查看镜像详细信息:"
docker image inspect ubuntu:20.04
# 5. 给镜像打标签
echo "给镜像打标签:"
docker tag ubuntu:20.04 my-ubuntu:latest
# 6. 删除镜像
echo "删除镜像:"
# docker rmi my-ubuntu:latest
# 7. 导出镜像
echo "导出镜像到文件:"
docker save -o ubuntu20.tar ubuntu:20.04
# 8. 导入镜像
echo "从文件导入镜像:"
# docker load -i ubuntu20.tar
# 9. 查看镜像历史
echo "查看镜像构建历史:"
docker history ubuntu:20.04
2. 容器生命周期管理
<strong>#!/bin/bash</strong>
# Docker容器生命周期管理
# 1. 运行容器(前台交互模式)
echo "运行交互式容器:"
docker run -it --name my-ubuntu ubuntu:20.04 /bin/bash
# 在容器内执行命令后使用 exit 退出
# 2. 运行容器(后台模式)
echo "运行后台容器:"
docker run -d --name web-server -p 8080:80 nginx:latest
# 3. 查看运行中的容器
echo "查看运行中的容器:"
docker ps
# 4. 查看所有容器(包括停止的)
echo "查看所有容器:"
docker ps -a
# 5. 停止容器
echo "停止容器:"
docker stop web-server
# 6. 启动已停止的容器
echo "启动容器:"
docker start web-server
# 7. 重启容器
echo "重启容器:"
docker restart web-server
# 8. 进入运行中的容器
echo "进入容器执行命令:"
docker exec -it web-server /bin/bash
# 9. 查看容器日志
echo "查看容器日志:"
docker logs web-server
# 10. 查看容器资源使用情况
echo "查看容器资源使用:"
docker stats web-server
# 11. 查看容器详细信息
echo "查看容器详细信息:"
docker inspect web-server
# 12. 删除容器
echo "删除容器:"
# docker rm web-server
# 13. 强制删除运行中的容器
echo "强制删除容器:"
# docker rm -f web-server
# 14. 清理所有停止的容器
echo "清理停止的容器:"
docker container prune
3. 容器网络与数据管理
<strong>#!/bin/bash</strong>
# Docker网络与数据管理
# 1. 端口映射
echo "运行容器并映射端口:"
docker run -d --name nginx-app -p 8080:80 -p 8443:443 nginx:latest
# 2. 查看端口映射
echo "查看端口映射:"
docker port nginx-app
# 3. 查看网络
echo "查看Docker网络:"
docker network ls
# 4. 创建自定义网络
echo "创建自定义网络:"
docker network create my-network
# 5. 在自定义网络中运行容器
echo "在自定义网络中运行容器:"
docker run -d --name app1 --network my-network nginx:latest
docker run -d --name app2 --network my-network nginx:latest
# 6. 容器间通信测试
echo "测试容器间通信:"
docker exec app1 ping app2
# 7. 数据卷管理
echo "创建数据卷:"
docker volume create my-data
# 8. 使用数据卷
echo "使用数据卷运行容器:"
docker run -d --name db --mount source=my-data,target=/var/lib/mysql mysql:8.0
# 9. 查看数据卷
echo "查看数据卷:"
docker volume ls
# 10. 查看数据卷详细信息
echo "查看数据卷详细信息:"
docker volume inspect my-data
# 11. 绑定挂载(主机目录)
echo "使用绑定挂载:"
mkdir -p /home/$USER/web-data
docker run -d --name web-app -v /home/$USER/web-data:/usr/share/nginx/html nginx:latest
# 12. 查看挂载信息
echo "查看容器挂载信息:"
docker inspect web-app | grep -A 10 Mounts
四、Dockerfile实战:构建自定义镜像
1. 基础Dockerfile示例
# 使用官方Python运行时作为基础镜像
FROM python:3.9-slim
# 设置维护者信息
LABEL maintainer="developer@company.com"
LABEL version="1.0"
LABEL description="Python Flask Web Application"
# 设置工作目录
WORKDIR /app
# 复制当前目录内容到容器中的/app目录
COPY . /app
# 安装依赖包
RUN pip install --no-cache-dir -r requirements.txt
# 创建非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
RUN chown -R appuser:appuser /app
USER appuser
# 暴露端口
EXPOSE 5000
# 定义环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
# 容器启动时运行的命令
CMD ["flask", "run", "--host=0.0.0.0"]
2. 多阶段构建示例
# 多阶段构建:构建阶段
FROM node:16 as builder
WORKDIR /app
# 复制package文件
COPY package*.json ./
RUN npm ci --only=production
# 复制源代码并构建
COPY . .
RUN npm run build
# 多阶段构建:运行阶段
FROM nginx:alpine
# 复制构建结果到nginx目录
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
# 暴露端口
EXPOSE 80
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
3. 构建和运行自定义镜像
<strong>#!/bin/bash</strong>
# Docker镜像构建和运行实战
# 项目结构准备
mkdir my-python-app && cd my-python-app
# 创建应用文件
cat > app.py << 'EOF'
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>Hello, Docker!</h1><p>This is a Python Flask app running in Docker.</p>'
@app.route('/health')
def health():
return {'status': 'healthy'}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
# 创建requirements.txt
cat > requirements.txt << 'EOF'
Flask==2.3.3
EOF
# 创建Dockerfile(使用上面的示例)
# 构建镜像
echo "构建Docker镜像:"
docker build -t my-python-app:1.0 .
# 查看构建的镜像
echo "查看本地镜像:"
docker images | grep my-python-app
# 运行容器
echo "运行自定义镜像:"
docker run -d --name my-app -p 5000:5000 my-python-app:1.0
# 测试应用
echo "测试应用:"
curl http://localhost:5000
# 查看容器日志
echo "查看容器日志:"
docker logs my-app
五、Docker Compose多容器编排
1. docker-compose安装
<strong>#!/bin/bash</strong>
# Docker Compose安装
# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 创建符号链接(可选)
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 验证安装
docker-compose --version
2. 完整的Web应用编排示例
# docker-compose.yml
version: '3.8'
services:
# Web应用服务
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "5000:5000"
environment:
- DATABASE_URL=postgresql://user:password@db:5432/mydb
- REDIS_URL=redis://redis:6379
depends_on:
- db
- redis
volumes:
- ./app:/app
- log-volume:/app/logs
networks:
- app-network
restart: unless-stopped
# 数据库服务
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- app-network
ports:
- "5432:5432"
restart: unless-stopped
# Redis缓存服务
redis:
image: redis:6-alpine
command: redis-server --appendonly yes
volumes:
- redis-data:/data
networks:
- app-network
restart: unless-stopped
# Nginx反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
networks:
- app-network
restart: unless-stopped
# 监控服务(可选)
monitor:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
networks:
- app-network
restart: unless-stopped
volumes:
db-data:
redis-data:
log-volume:
grafana-data:
networks:
app-network:
driver: bridge
3. Compose命令实战
<strong>#!/bin/bash</strong>
# Docker Compose实战操作
# 1. 启动所有服务
echo "启动所有服务:"
docker-compose up -d
# 2. 查看服务状态
echo "查看服务状态:"
docker-compose ps
# 3. 查看服务日志
echo "查看所有服务日志:"
docker-compose logs
# 4. 查看特定服务日志
echo "查看web服务日志:"
docker-compose logs web
# 5. 实时查看日志
echo "实时查看日志:"
docker-compose logs -f web
# 6. 在服务中执行命令
echo "在web服务中执行命令:"
docker-compose exec web bash
# 7. 扩展服务实例
echo "扩展web服务实例:"
docker-compose up -d --scale web=3
# 8. 停止服务
echo "停止服务:"
docker-compose stop
# 9. 启动已停止的服务
echo "启动服务:"
docker-compose start
# 10. 重启服务
echo "重启服务:"
docker-compose restart
# 11. 停止并删除所有资源
echo "停止并删除所有资源:"
docker-compose down
# 12. 停止并删除所有资源(包括数据卷)
echo "停止并删除所有资源(包括数据卷):"
docker-compose down -v
# 13. 构建服务镜像
echo "重新构建镜像:"
docker-compose build
# 14. 拉取服务镜像
echo "拉取服务镜像:"
docker-compose pull
六、实战项目:部署WordPress博客
1. WordPress单机部署
# wordpress-docker-compose.yml
version: '3.8'
services:
# 数据库服务
db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
volumes:
- db_data:/var/lib/mysql
networks:
- wordpress-network
# WordPress服务
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- wordpress-network
volumes:
db_data:
wp_data:
networks:
wordpress-network:
driver: bridge
2. 部署和执行
<strong>#!/bin/bash</strong>
# WordPress部署脚本
# 创建项目目录
mkdir wordpress-docker && cd wordpress-docker
# 创建docker-compose.yml文件(使用上面的内容)
# 创建PHP配置(可选)
cat > uploads.ini << 'EOF'
file_uploads = On
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
EOF
# 启动服务
echo "启动WordPress服务:"
docker-compose -f wordpress-docker-compose.yml up -d
# 等待服务启动
echo "等待服务启动..."
sleep 30
# 检查服务状态
echo "检查服务状态:"
docker-compose -f wordpress-docker-compose.yml ps
# 查看日志
echo "查看WordPress日志:"
docker-compose -f wordpress-docker-compose.yml logs wordpress
# 访问WordPress
echo "WordPress已启动,访问: http://localhost:8080"
echo "数据库信息:"
echo "主机: db"
echo "数据库: wordpress"
echo "用户名: wordpress"
echo "密码: wordpress"
# 备份数据库
echo "备份数据库:"
docker-compose -f wordpress-docker-compose.yml exec db mysqldump -u root -prootpassword wordpress > backup.sql
# 停止服务
echo "停止服务:"
# docker-compose -f wordpress-docker-compose.yml down
# 停止服务并保留数据
echo "停止服务但保留数据:"
# docker-compose -f wordpress-docker-compose.yml stop
七、Docker最佳实践
1. 安全最佳实践
# 安全加固的Dockerfile示例
FROM python:3.9-slim
# 1. 使用特定版本标签,避免latest
FROM python:3.9-slim@sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113...
# 2. 使用非root用户
RUN groupadd -r appuser && useradd -r -g appuser appuser
# 3. 最小化安装,删除不必要的包
RUN apt-get update && apt-get install -y --no-install-recommends \
necessary-package \
&& rm -rf /var/lib/apt/lists/*
# 4. 设置工作目录并修改权限
WORKDIR /app
RUN chown -R appuser:appuser /app
USER appuser
# 5. 复制文件并设置正确的权限
COPY --chown=appuser:appuser . .
# 6. 使用明确的端口
EXPOSE 8080
# 7. 使用健康检查
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# 8. 使用exec格式的CMD
CMD ["python", "app.py"]
2. 性能优化实践
# 优化性能的Dockerfile
FROM node:16-alpine as builder
# 1. 使用Alpine基础镜像减小大小
FROM node:16-alpine
# 2. 设置工作目录
WORKDIR /app
# 3. 分别复制package文件和应用文件,利用Docker缓存
COPY package*.json ./
RUN npm ci --only=production && npm cache clean --force
# 4. 复制应用代码
COPY . .
# 5. 多阶段构建减小最终镜像大小
FROM node:16-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
USER nextjs
EXPOSE 3000
CMD ["npm", "start"]
3. 日常维护命令
<strong>#!/bin/bash</strong>
# Docker日常维护命令
# 1. 查看Docker磁盘使用情况
echo "Docker磁盘使用:"
docker system df
# 2. 查看详细磁盘使用
echo "详细磁盘使用:"
docker system df -v
# 3. 清理无用资源
echo "清理无用资源:"
docker system prune
# 4. 强制清理所有无用资源
echo "强制清理所有无用资源:"
docker system prune -a -f
# 5. 清理所有停止的容器
echo "清理停止的容器:"
docker container prune -f
# 6. 清理所有未使用的镜像
echo "清理未使用的镜像:"
docker image prune -a -f
# 7. 清理所有未使用的数据卷
echo "清理未使用的数据卷:"
docker volume prune -f
# 8. 清理所有未使用的网络
echo "清理未使用的网络:"
docker network prune -f
# 9. 查看Docker事件
echo "查看Docker事件:"
docker system events
# 10. 检查Docker守护进程状态
echo "检查Docker状态:"
sudo systemctl status docker
# 11. 查看Docker信息
echo "查看Docker系统信息:"
docker info
八、常见问题与解决方案
1. 安装问题排查
<strong>#!/bin/bash</strong>
# Docker安装问题排查
# 1. 检查Docker服务状态
sudo systemctl status docker
# 2. 检查Docker版本
docker --version
# 3. 检查用户组
groups $USER
# 4. 检查Docker守护进程日志
sudo journalctl -u docker.service
# 5. 测试Docker运行
docker run --rm hello-world
# 6. 检查存储驱动
docker info | grep Storage
# 7. 检查网络配置
docker network ls
# 8. 检查防火墙设置
sudo ufw status
# 常见问题解决:
# 问题1: Permission denied
# 解决: sudo usermod -aG docker $USER && newgrp docker
# 问题2: Cannot connect to Docker daemon
# 解决: sudo systemctl start docker
# 问题3: Port already in use
# 解决: 更改端口映射或停止占用端口的进程
# 问题4: No space left on device
# 解决: docker system prune -a -f
2. 容器网络问题
<strong>#!/bin/bash</strong>
# 容器网络问题排查
# 1. 检查容器网络配置
docker inspect <container> | grep -A 20 NetworkSettings
# 2. 测试容器网络连接
docker exec <container> ping google.com
# 3. 检查容器DNS配置
docker exec <container> cat /etc/resolv.conf
# 4. 查看容器端口映射
docker port <container>
# 5. 检查主机网络配置
netstat -tulpn | grep :80
# 6. 测试端口连通性
telnet localhost 8080
# 7. 查看Docker网络详情
docker network inspect <network>
# 8. 重启Docker网络
sudo systemctl restart docker
九、学习路径和进阶方向
1. 学习路径建议
初级阶段(1-2周):
- 掌握Docker基本概念和架构
- 熟悉镜像和容器管理命令
- 学会编写简单的Dockerfile
中级阶段(2-4周):
- 掌握Docker Compose多服务编排
- 理解Docker网络和数据管理
- 学会Docker安全最佳实践
高级阶段(1-2月):
- 掌握Docker Swarm或Kubernetes
- 理解CI/CD中的Docker应用
- 学会Docker生产环境部署
2. 进阶技术栈
# 容器编排进阶
- Docker Swarm
- Kubernetes (K8s)
- Amazon ECS / Google GKE
# 监控和日志
- Prometheus + Grafana
- ELK Stack (Elasticsearch, Logstash, Kibana)
- Jaeger (分布式追踪)
# 安全工具
- Trivy (镜像漏洞扫描)
- Clair (静态分析)
- Falco (运行时安全)
# CI/CD集成
- Jenkins + Docker
- GitLab CI/CD
- GitHub Actions
十、总结
通过本文的系统学习,您已经掌握了Docker的核心概念、基本操作和实战部署技能。Docker作为现代应用开发和部署的基础设施,掌握它将为您的技术生涯带来巨大优势。
关键要点回顾:
- 核心概念:理解镜像、容器、仓库的关系
- 基本操作:熟练掌握镜像管理和容器生命周期命令
- 镜像构建:学会编写高效的Dockerfile
- 多容器编排:掌握Docker Compose的使用
- 最佳实践:遵循安全和性能优化原则
下一步建议:
- 实践项目:尝试容器化自己的应用
- 学习编排:深入掌握Kubernetes
- 了解生态:学习相关的监控、日志工具
- 参与社区:关注Docker官方博客和社区
继续在实践中深化理解,Docker将成为您开发部署的得力工具!
© 版权声明
THE END













暂无评论内容