Docker容器化技术入门与实战指南
1. Docker 快速入门实操指南Docker 作为当前最流行的容器化技术已经成为开发者和运维人员的必备技能。我第一次接触 Docker 是在2015年当时为了解决在我的机器上能运行这个经典问题。现在回想起来Docker 确实彻底改变了应用部署的方式。本文将带你从零开始快速掌握 Docker 的核心概念和实操技巧。无论你是开发者想简化本地开发环境还是运维人员需要部署服务Docker 都能大幅提升效率。我们将从最基础的安装开始逐步深入到镜像构建、容器管理等实用技能。学完本教程你将能够独立完成 Docker 的日常使用并理解其背后的工作原理。提示本教程基于 Docker 最新稳定版本24.0.x所有命令和示例都经过实际验证。建议跟着教程边学边练效果最佳。2. Docker 基础概念解析2.1 容器与虚拟机的本质区别很多人刚开始会把 Docker 容器和虚拟机混为一谈其实它们有本质区别。虚拟机VM模拟的是完整的操作系统每个 VM 都有自己的内核而容器共享主机内核只是通过命名空间和 cgroups 实现隔离。简单类比虚拟机就像在电脑里安装多个完整独立的电脑系统而容器更像是在同一个系统里运行的多个隔离的应用程序进程。这种架构差异使得容器启动更快秒级 vs 分钟级、资源占用更少MB级 vs GB级。2.2 Docker 核心组件Docker 架构包含三个核心概念镜像Image只读模板包含运行应用所需的一切代码、运行时、库、环境变量等容器Container镜像的运行实例具有可写层仓库Registry存储和分发镜像的地方最常用的是 Docker Hub理解这三者的关系很重要你从仓库拉取镜像用镜像创建容器容器运行你的应用。就像面向对象编程中的类镜像和对象容器的关系。3. Docker 安装与配置3.1 在不同系统上安装 DockerUbuntu/Linux 安装# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release # 添加 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 # 设置仓库 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 # 安装 Docker Engine sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装 sudo docker run hello-worldWindows/macOS 安装对于 Windows 10/11 和 macOS推荐使用 Docker Desktop。下载地址Windows: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exemacOS(Intel): https://desktop.docker.com/mac/main/amd64/Docker.dmgmacOS(Apple Silicon): https://desktop.docker.com/mac/main/arm64/Docker.dmg安装完成后在终端运行docker version验证安装。3.2 配置国内镜像加速国内访问 Docker Hub 可能较慢可以配置镜像加速器# 创建或修改 /etc/docker/daemon.json sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [ https://hub-mirror.c.163.com, https://mirror.baidubce.com ] } EOF # 重启 Docker 服务 sudo systemctl daemon-reload sudo systemctl restart docker注意修改配置后必须重启 Docker 服务才能生效。不同云服务商也提供专属加速地址如阿里云、腾讯云等。4. Docker 基础操作实战4.1 第一个容器Hello World让我们运行第一个容器docker run hello-world这个命令会检查本地是否有 hello-world 镜像如果没有从 Docker Hub 拉取基于镜像创建并启动容器容器执行后自动退出你会看到欢迎信息Hello from Docker!说明你的 Docker 安装正确。4.2 运行交互式容器让我们进入一个 Ubuntu 容器docker run -it ubuntu bash参数说明-i: 保持 STDIN 打开即使没有连接-t: 分配一个伪终端ubuntu: 镜像名称bash: 要运行的命令现在你就在一个全新的 Ubuntu 系统中了可以运行ls,cat /etc/os-release等命令。输入exit退出容器。4.3 容器生命周期管理常用容器管理命令# 列出运行中的容器 docker ps # 列出所有容器包括停止的 docker ps -a # 停止容器 docker stop 容器ID或名称 # 启动已停止的容器 docker start 容器ID或名称 # 删除容器 docker rm 容器ID或名称 # 查看容器日志 docker logs 容器ID或名称实操技巧给容器命名--name 参数比使用随机生成的 ID 更方便管理。例如docker run --name my_nginx -d nginx5. Docker 镜像深度解析5.1 镜像基本操作# 搜索镜像 docker search nginx # 拉取镜像 docker pull nginx:latest # 列出本地镜像 docker images # 删除镜像 docker rmi 镜像ID或名称5.2 理解镜像分层Docker 镜像采用分层存储结构。例如当你拉取 nginx 镜像时会看到多个层下载完成。这种设计带来两个主要优势共享层不同镜像可以共享相同的层节省存储空间快速构建修改时只需重建变化的层查看镜像分层docker history nginx:latest5.3 构建自定义镜像通过 Dockerfile 构建镜像是 Docker 的核心技能。创建一个简单的 Node.js 应用镜像创建项目目录和文件mkdir mynodeapp cd mynodeapp echo console.log(Hello Docker!); app.js创建 Dockerfile# 使用官方 Node.js 镜像作为基础 FROM node:14-alpine # 设置工作目录 WORKDIR /usr/src/app # 复制应用文件 COPY . . # 运行应用 CMD [node, app.js]构建镜像docker build -t mynodeapp .运行容器docker run mynodeapp6. Docker 数据管理6.1 数据卷Volume数据卷是持久化容器数据的首选方式# 创建数据卷 docker volume create myvol # 查看数据卷 docker volume inspect myvol # 使用数据卷 docker run -d -v myvol:/data --name db redis6.2 绑定挂载Bind Mount直接将主机目录挂载到容器docker run -d -v /path/on/host:/path/in/container nginx注意事项绑定挂载会完全覆盖容器内的目标目录使用时需谨慎。6.3 临时文件系统tmpfs对于不需要持久化的敏感数据docker run -d --tmpfs /app/cache nginx7. Docker 网络配置7.1 网络基础Docker 提供多种网络模式bridge默认模式容器通过虚拟网桥连接host容器直接使用主机网络none无网络连接自定义网络用户定义的网络查看网络docker network ls7.2 创建自定义网络# 创建网络 docker network create mynet # 运行容器并加入网络 docker run -d --networkmynet --name web nginx docker run -it --networkmynet --name client alpine sh # 在 client 容器中测试连接 ping web7.3 端口映射将容器端口映射到主机docker run -d -p 8080:80 --name webserver nginx现在可以通过 http://localhost:8080 访问 Nginx。8. Docker Compose 实战8.1 Compose 简介Docker Compose 用于定义和运行多容器应用。通过 YAML 文件配置服务然后使用单一命令启动所有服务。8.2 编写 docker-compose.yml创建一个 WordPress 项目version: 3.8 services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest ports: - 8000:80 restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress WORDPRESS_DB_NAME: wordpress volumes: db_data:8.3 常用 Compose 命令# 启动服务 docker-compose up -d # 查看服务状态 docker-compose ps # 停止服务 docker-compose down # 查看日志 docker-compose logs -f9. 生产环境最佳实践9.1 安全建议不要以 root 用户运行容器FROM node:14-alpine RUN addgroup -S appgroup adduser -S appuser -G appgroup USER appuser ...定期更新基础镜像docker pull nginx:latest扫描镜像漏洞docker scan nginx9.2 性能优化使用多阶段构建减小镜像大小# 构建阶段 FROM node:14 AS build WORKDIR /app COPY . . RUN npm install npm run build # 生产阶段 FROM nginx:alpine COPY --frombuild /app/dist /usr/share/nginx/html合理设置资源限制docker run -d --memory512m --cpus1.5 nginx9.3 监控与日志查看容器资源使用docker stats集中式日志管理docker run --log-driversyslog --log-opt syslog-addressudp://localhost:514 nginx10. 常见问题排查10.1 容器启动失败查看详细错误docker logs 容器ID交互式调试docker run -it --entrypoint sh nginx10.2 网络连接问题检查容器网络配置docker inspect 容器ID | grep IPAddress测试网络连通性docker run --rm busybox ping 8.8.8.810.3 存储空间不足清理无用资源docker system prune查看磁盘使用docker system df11. 进阶学习路径掌握基础后可以继续学习Docker Swarm原生的容器编排工具Kubernetes生产级容器编排系统CI/CD 集成将 Docker 融入开发流程Service Mesh如 Istio 等高级网络模式我在实际项目中发现Docker 的最佳学习方式是做中学。建议从一个小项目开始比如容器化你的个人博客逐步增加复杂度。遇到问题时Docker 官方文档和社区都是极好的资源。