Docker 入门实战教程:从零开始掌握容器化技术

Docker 入门实战教程:从零开始掌握容器化技术

引言:为什么需要 Docker?

在软件开发的世界里,我们经常遇到这样的困扰:"在我的电脑上明明可以运行,为什么到服务器上就报错了?"这个问题一直困扰着无数开发者。不同的操作系统、不同的依赖库版本、不同的环境配置......这些差异导致了开发和部署环境的不一致。

而 Docker 的出现,彻底改变了这一局面。它让应用程序及其依赖环境打包成一个轻量级的"容器",在任何支持 Docker 的平台上都能以相同的方式运行。这就是著名的"一次构建,到处运行"(Build Once, Run Anywhere)。

一、Docker 是什么?

1.1 容器技术的革命

Docker 是一个开源的容器化平台,它可以将应用程序及其依赖环境打包成一个独立的容器。与传统虚拟机相比,Docker 容器更加轻量、快速、高效。

传统虚拟机 vs Docker 容器:

特性 虚拟机 Docker 容器
启动速度 分钟级 秒级
磁盘占用 GB 级别 MB 级别
性能 接近原生 接近原生
隔离性 完全隔离 进程级隔离
可移植性 较差 优秀

1.2 Docker 的核心优势

  • 快速部署:容器启动只需几秒钟
  • 环境一致性:开发、测试、生产环境完全一致
  • 资源高效:相比虚拟机节省大量系统资源
  • 微服务架构:完美支持微服务部署
  • 持续集成/部署:简化 CI/CD 流程

二、Docker 核心概念详解

2.1 镜像(Image)

镜像就像是应用程序的"模板"或"蓝图"。它是一个只读的文件包,包含了运行应用程序所需的所有内容:代码、运行时、系统工具、系统库和设置。

镜像的特点:

  • 分层存储:每一层都是只读的
  • 可复用:多个容器可以共享同一个镜像
  • 版本管理:通过标签(tag)管理不同版本

常见镜像示例:

bash 复制代码
nginx:latest          # 最新版本的 Nginx
python:3.9-slim      # Python 3.9 精简版
mysql:8.0            # MySQL 8.0
ubuntu:20.04         # Ubuntu 20.04

2.2 容器(Container)

容器是镜像的运行实例。如果说镜像是"类",那么容器就是"对象"。你可以从一个镜像启动多个容器,每个容器都是相互隔离的。

容器的生命周期:

  1. Created:容器已创建但未启动
  2. Running:容器正在运行
  3. Paused:容器已暂停
  4. Stopped:容器已停止
  5. Deleted:容器已删除

2.3 仓库(Registry)

仓库是存放镜像的地方,就像代码仓库存放代码一样。

常见的 Docker 镜像仓库:

  • Docker Hub:官方公共仓库(hub.docker.com
  • 阿里云镜像仓库:国内访问速度快
  • 私有仓库:企业内部自建

Docker 核心组件架构总览:

三、Docker 安装指南

3.1 Windows 安装

系统要求:

  • Windows 10/11 专业版或企业版
  • 启用 Hyper-V 和 WSL 2

安装步骤:

  1. 访问 Docker 官网下载 Docker Desktop for Windows
  2. 双击安装程序,按照提示完成安装
  3. 重启计算机
  4. 启动 Docker Desktop
  5. 验证安装:
bash 复制代码
docker --version
docker run hello-world

3.2 Linux 安装(以 Ubuntu 为例)

bash 复制代码
# 1. 更新包索引
sudo apt-get update

# 2. 安装依赖包
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. 设置仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 6. 验证安装
sudo docker run hello-world

配置用户组(免 sudo):

bash 复制代码
sudo usermod -aG docker $USER
newgrp docker

四、Docker 实战演练

4.1 第一个 Docker 容器

让我们从最简单的例子开始,运行一个 Nginx Web 服务器:

bash 复制代码
# 拉取 Nginx 镜像
docker pull nginx:latest

# 运行 Nginx 容器
docker run -d -p 8080:80 --name my-nginx nginx:latest

# 查看运行状态
docker ps

# 访问测试
# 打开浏览器访问 http://localhost:8080

参数说明:

  • -d:后台运行
  • -p 8080:80:端口映射,宿主机8080端口映射到容器80端口
  • --name my-nginx:指定容器名称

4.2 部署 MySQL 数据库

bash 复制代码
# 运行 MySQL 容器
docker run -d \
  --name mysql-server \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -e MYSQL_DATABASE=mydb \
  -p 3306:3306 \
  -v mysql-data:/var/lib/mysql \
  mysql:8.0

# 进入 MySQL 容器
docker exec -it mysql-server mysql -uroot -p

# 查看 MySQL 日志
docker logs mysql-server

参数说明:

  • -e:设置环境变量
  • -v mysql-data:/var/lib/mysql:数据持久化,数据存储在命名卷中

4.4 Docker Compose 多容器应用

docker-compose.yml 示例:

yaml 复制代码
version: '3.8'

services:
  # Web 应用
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=mysql://root:my-secret-pw@db:3306/mydb
    networks:
      - app-network

  # 数据库
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: my-secret-pw
      MYSQL_DATABASE: mydb
    volumes:
      - mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - app-network

  # Nginx 反向代理
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web
    networks:
      - app-network

volumes:
  mysql-data:

networks:
  app-network:
    driver: bridge

启动服务:

bash 复制代码
# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

五、Docker 常用命令大全

5.1 镜像管理命令

bash 复制代码
# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 构建镜像
docker build -t myapp:1.0 .

# 导出镜像
docker save -o myapp.tar myapp:1.0

# 导入镜像
docker load -i myapp.tar

# 标记镜像
docker tag myapp:1.0 myapp:latest

5.2 容器管理命令

bash 复制代码
# 运行容器
docker run [OPTIONS] IMAGE [COMMAND]
docker run -d -p 80:80 --name web nginx

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止)
docker ps -a

# 停止容器
docker stop web

# 启动已停止的容器
docker start web

# 重启容器
docker restart web

# 删除容器
docker rm web

# 强制删除运行中的容器
docker rm -f web

# 查看容器详细信息
docker inspect web

# 查看容器日志
docker logs web
docker logs -f web  # 实时查看

# 进入容器
docker exec -it web /bin/bash

5.3 数据管理命令

bash 复制代码
# 创建数据卷
docker volume create my-volume

# 查看数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect my-volume

# 删除数据卷
docker volume rm my-volume

# 创建备份
docker run --rm --volumes-from db-container -v $(pwd):/backup \
  ubuntu tar cvf /backup/backup.tar /var/lib/mysql

5.4 网络管理命令

bash 复制代码
# 创建网络
docker network create my-network

# 查看网络
docker network ls

# 连接容器到网络
docker network connect my-network my-container

# 断开网络连接
docker network disconnect my-network my-container

# 删除网络
docker network rm my-network

六、Docker 数据持久化

6.1 数据卷(Volume)

特点:

  • 由 Docker 管理
  • 存储在 Docker 特定目录
  • 跨平台兼容性好
  • 适合生产环境
bash 复制代码
# 创建命名卷
docker volume create my-data

# 使用卷
docker run -d -v my-data:/data nginx

# 查看卷信息
docker volume inspect my-data

# 清理未使用的卷
docker volume prune

6.2 挂载目录(Bind Mount)

特点:

  • 直接映射宿主机目录
  • 适合开发环境
  • 可以直接访问文件
bash 复制代码
# 挂载当前目录
docker run -d -v $(pwd)/html:/usr/share/nginx/html nginx

# 只读挂载
docker run -d -v $(pwd)/html:/usr/share/nginx/html:ro nginx

七、Docker 网络模式

7.1 网络模式类型

模式 说明 使用场景
bridge 默认模式,容器通过虚拟网桥通信 单机多容器通信
host 共享宿主机网络 高性能需求
none 无网络配置 离线处理任务
container 共享其他容器网络 容器间协作

7.2 网络配置示例

bash 复制代码
# 创建自定义网络
docker network create --driver bridge my-network

# 运行容器并连接到网络
docker run -d --name web1 --network my-network nginx
docker run -d --name web2 --network my-network nginx

# 容器可以通过容器名互相访问
docker exec web1 ping web2

八、Docker 安全最佳实践

8.1 镜像安全

dockerfile 复制代码
# 使用特定版本标签,不使用 latest
FROM python:3.9-slim

# 使用非 root 用户
RUN useradd -m myuser
USER myuser

# 最小化安装
RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 扫描镜像漏洞
# docker scan myapp:1.0

8.2 运行时安全

bash 复制代码
# 限制容器资源
docker run -d \
  --memory="512m" \
  --cpus="1.0" \
  --read-only \
  --security-opt=no-new-privileges \
  nginx

# 使用 rootless 模式
# 避免 root 用户运行容器

九、实战项目:个人博客系统

9.1 项目架构

我们将部署一个完整的博客系统,包含:

  • WordPress(前端)
  • MySQL(数据库)
  • Nginx(反向代理)

9.2 docker-compose.yml 配置

yaml 复制代码
version: '3.8'

services:
  # 数据库服务
  database:
    image: mysql:8.0
    container_name: blog-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wpuser
      MYSQL_PASSWORD: wppassword
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - blog-network

  # WordPress 服务
  wordpress:
    image: wordpress:latest
    container_name: blog-wordpress
    restart: always
    depends_on:
      - database
    environment:
      WORDPRESS_DB_HOST: database:3306
      WORDPRESS_DB_USER: wpuser
      WORDPRESS_DB_PASSWORD: wppassword
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp-data:/var/www/html
    ports:
      - "8080:80"
    networks:
      - blog-network

  # phpMyAdmin(可选)
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: blog-phpmyadmin
    restart: always
    depends_on:
      - database
    environment:
      PMA_HOST: database
      PMA_PORT: 3306
    ports:
      - "8081:80"
    networks:
      - blog-network

volumes:
  db-data:
  wp-data:

networks:
  blog-network:
    driver: bridge

9.3 部署步骤

bash 复制代码
# 1. 克隆配置文件
mkdir blog && cd blog

# 2. 创建 docker-compose.yml
# (将上面的配置保存为 docker-compose.yml)

# 3. 启动服务
docker-compose up -d

# 4. 查看服务状态
docker-compose ps

# 5. 访问博客
# 打开浏览器访问 http://localhost:8080
# 首次访问会进入 WordPress 安装向导

# 6. 访问 phpMyAdmin
# http://localhost:8081
# 用户名:root
# 密码:rootpassword

十、Docker 故障排查

10.1 常见问题及解决方案

问题 1:容器无法启动

bash 复制代码
# 查看容器日志
docker logs <container-id>

# 查看容器详情
docker inspect <container-id>

# 尝试交互式运行
docker run -it <image> /bin/bash

问题 2:端口冲突

bash 复制代码
# 查看端口占用
netstat -tunlp | grep <port>

# 更改端口映射
docker run -p 8081:80 nginx  # 使用其他端口

问题 3:磁盘空间不足

bash 复制代码
# 清理未使用的镜像
docker image prune -a

# 清理未使用的容器
docker container prune

# 清理未使用的卷
docker volume prune

# 一键清理
docker system prune -a --volumes

问题 4:网络连接问题

bash 复制代码
# 检查网络配置
docker network inspect <network-name>

# 重建网络
docker network rm <network-name>
docker network create <network-name>

10.2 调试技巧

bash 复制代码
# 查看容器资源使用情况
docker stats

# 查看容器进程
docker top <container-id>

# 实时查看日志
docker logs -f --tail 100 <container-id>

# 导出容器文件系统
docker export <container-id> > container.tar

十一、总结

Docker 作为容器化技术的代表,已经彻底改变了软件开发和部署的方式。通过本文的学习,你已经掌握了:

✅ Docker 的核心概念(镜像、容器、仓库) ✅ Docker 的安装方法 ✅ 常用命令的使用 ✅ Dockerfile 的编写技巧 ✅ 数据持久化和网络配置 ✅ 实战项目部署经验

记住:Docker 的学习曲线不算陡峭,关键在于多动手实践。每一个命令、每一个配置,都需要在实战中才能真正理解和掌握。


相关推荐
回忆是昨天里的海3 小时前
docker网络-自定义网络
运维·docker·容器
飞Link4 小时前
【开发工具】Docker常用操作
运维·docker·容器
摇滚侠4 小时前
VMvare 虚拟机 centOS 7 安装 Docker,Docker 安装 Kong Konga
docker·centos·kong
hanyi_qwe4 小时前
Docker 容器操作 【docker (二)】
docker·容器·eureka
懒人村杂货铺4 小时前
前端步入全栈第一步
前端·docker·fastapi
小白电脑技术5 小时前
简单点!异地访问Docker的方式简单点!
docker·容器·电脑
Zhen (Evan) Wang5 小时前
Docker 完整安装 Redis
redis·docker·容器
小趴菜不能喝5 小时前
Docker Swarm
运维·docker·容器
FOREVER-Q5 小时前
《Docker Compose 部署前后端分离项目实战:Nginx + Spring Boot(含完整踩坑记录)》
运维·docker·容器