从零开始玩转Docker:一站式掌握镜像、容器与仓库

一、Docker 是什么?为何要学习它?

Docker 是一个开源的容器化技术平台,它通过将应用及其依赖环境打包成轻量级、可移植的容器,实现“一次构建,处处运行”的愿景。相比传统虚拟机,Docker 容器直接运行在宿主机的内核上,无需启动完整的操作系统,因此具有更快的启动速度、更低的资源消耗和更高的可移植性。

为何学习 Docker?

  • 环境一致性:解决开发、测试、生产环境不一致的问题。
  • 快速部署:秒级启动容器,加速应用交付。
  • 资源高效:单个主机可运行数百个容器,充分利用硬件资源。
  • 生态丰富:拥有庞大的镜像仓库(如 Docker Hub)和工具链。

二、Docker 核心概念解析

1. 镜像(Image):容器的“模板”

定义:镜像是一个只读的模板,包含运行应用所需的所有文件系统、依赖库和配置信息。可以理解为容器的“源代码”。

操作示例

  1. # 拉取官方Nginx镜像
  2. docker pull nginx:latest
  3. # 查看本地镜像列表
  4. docker images
  5. # 删除镜像
  6. docker rmi nginx:latest

关键点

  • 分层存储:镜像采用联合文件系统(UnionFS),每一层代表一次修改,共享基础层以节省空间。
  • 标签管理:通过标签(如 :latest:1.25)区分不同版本。
  • 构建镜像:使用 Dockerfile 定义构建步骤,通过 docker build 生成镜像。

2. 容器(Container):镜像的运行实例

定义:容器是镜像的运行时实例,是一个隔离的进程空间,拥有独立的网络、文件系统和进程树。

操作示例

  1. # 基于Nginx镜像启动容器
  2. docker run -d --name my-nginx -p 80:80 nginx:latest
  3. # 进入容器内部
  4. docker exec -it my-nginx /bin/bash
  5. # 查看运行中的容器
  6. docker ps
  7. # 停止并删除容器
  8. docker stop my-nginx
  9. docker rm my-nginx

关键点

  • 状态管理:容器有“运行中”“已停止”“已删除”等状态。
  • 资源限制:通过 -m(内存)、--cpus(CPU)等参数限制容器资源。
  • 数据持久化:使用卷(Volume)或绑定挂载(Bind Mount)保存容器数据。

3. 仓库(Registry):镜像的存储与分发中心

定义:仓库是集中存储和分发 Docker 镜像的服务,类似于代码仓库(如 GitHub)。Docker Hub 是官方公共仓库,也可自建私有仓库(如 Harbor)。

操作示例

  1. # 登录Docker Hub
  2. docker login
  3. # 标记本地镜像为Docker Hub格式
  4. docker tag my-app:v1 username/my-app:v1
  5. # 推送镜像到Docker Hub
  6. docker push username/my-app:v1
  7. # 从私有仓库拉取镜像
  8. docker pull registry.example.com/my-app:v1

关键点

  • 镜像命名规范[registry-host/][namespace/]image-name:tag
  • 安全扫描:Docker Hub 提供镜像漏洞扫描功能。
  • 私有仓库:适合企业内部分发敏感镜像。

三、从零开始玩转 Docker 的实战步骤

1. 安装 Docker

  • Linux:通过包管理器安装(如 apt install docker.io)。
  • macOS/Windows:下载 Docker Desktop 并安装。
  • 验证安装:运行 docker --versiondocker run hello-world

2. 构建自定义镜像

示例:构建一个 Python Flask 应用镜像

  1. 创建项目目录并编写 app.py

    1. from flask import Flask
    2. app = Flask(__name__)
    3. @app.route("/")
    4. def hello():
    5. return "Hello, Docker!"
    6. if __name__ == "__main__":
    7. app.run(host="0.0.0.0", port=5000)
  2. 编写 Dockerfile

    1. FROM python:3.9-slim
    2. WORKDIR /app
    3. COPY requirements.txt .
    4. RUN pip install --no-cache-dir -r requirements.txt
    5. COPY . .
    6. CMD ["python", "app.py"]
  3. 构建并运行:

    1. docker build -t my-flask-app .
    2. docker run -d -p 5000:5000 my-flask-app

3. 使用 Docker Compose 管理多容器应用

示例:部署 WordPress + MySQL

  1. 创建 docker-compose.yml

    1. version: '3'
    2. services:
    3. db:
    4. image: mysql:5.7
    5. environment:
    6. MYSQL_ROOT_PASSWORD: example
    7. wordpress:
    8. image: wordpress:latest
    9. ports:
    10. - "8080:80"
    11. depends_on:
    12. - db
  2. 启动服务:

    1. docker-compose up -d

四、常见问题与解决方案

  1. 端口冲突:通过 -p 参数映射不同端口(如 -p 8081:80)。
  2. 数据丢失:使用卷(Volume)持久化数据:
    1. docker run -v /data/mysql:/var/lib/mysql mysql
  3. 性能优化
    • 避免在容器中运行 sshd,使用 docker exec 进入。
    • 使用 .dockerignore 文件排除无关文件。

五、进阶技巧

  1. 网络模式
    • host 模式:容器直接使用宿主机网络。
    • bridge 模式(默认):容器通过虚拟网桥通信。
  2. 日志管理
    1. docker logs -f my-container
  3. 资源监控
    1. docker stats

六、总结与行动建议

Docker 是现代开发不可或缺的工具,掌握镜像、容器与仓库的核心概念后,可进一步探索:

  • Kubernetes:容器编排的工业级解决方案。
  • CI/CD 集成:在 Jenkins/GitLab 中嵌入 Docker 构建步骤。
  • 安全实践:定期扫描镜像漏洞,使用最小化基础镜像。

行动建议

  1. 从简单应用(如静态网站)开始实践。
  2. 参与开源项目,学习他人的 Dockerfiledocker-compose.yml
  3. 关注 Docker 官方博客和社区(如 DockerCon)。

通过本文的指导,您已具备从零开始玩转 Docker 的能力。立即动手实践,让容器化技术为您的开发流程带来质的飞跃!