从零开始玩转Docker:手把手教你玩转镜像、容器与仓库

从零开始玩转Docker:一站式入门指南,带你快速掌握镜像、容器与仓库

一、为什么需要Docker?

在传统开发中,环境配置常成为项目落地的“隐形杀手”。不同操作系统、依赖库版本冲突、开发/测试/生产环境不一致等问题,导致开发者需花费大量时间“救火”。Docker的出现彻底改变了这一局面——它通过容器化技术将应用及其依赖打包为独立、可移植的单元,实现“一次构建,处处运行”。

核心优势:

  • 轻量级:容器共享主机内核,资源占用远低于虚拟机。
  • 一致性:镜像封装完整环境,消除“在我机器上能运行”的尴尬。
  • 快速部署:秒级启动容器,支持弹性伸缩。
  • 生态丰富:Docker Hub提供海量预构建镜像,覆盖主流技术栈。

二、Docker安装与基础环境配置

1. 安装Docker

  • Linux(Ubuntu示例)

    1. # 卸载旧版本(如有)
    2. sudo apt-get remove docker docker-engine docker.io containerd runc
    3. # 安装依赖
    4. sudo apt-get update
    5. sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    6. # 添加Docker官方GPG密钥
    7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    8. # 添加稳定版仓库
    9. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    10. # 安装Docker引擎
    11. sudo apt-get update
    12. sudo apt-get install docker-ce docker-ce-cli containerd.io
    13. # 验证安装
    14. sudo docker run hello-world
  • Windows/macOS:通过Docker Desktop一键安装,支持图形化界面管理。

2. 基础命令速查

  1. docker version # 查看版本
  2. docker info # 显示系统信息
  3. docker --help # 查看帮助

三、核心概念深度解析

1. 镜像(Image):应用的“蓝图”

镜像是一个只读模板,包含运行应用所需的一切:代码、运行时、库、环境变量和配置文件。可类比为编程中的“类”,而容器是其实例。

常用操作:

  • 拉取镜像
    1. docker pull nginx:latest # 从Docker Hub下载最新版Nginx镜像
  • 查看本地镜像
    1. docker images
  • 删除镜像
    1. docker rmi nginx:latest

实战:构建自定义镜像

通过Dockerfile定义镜像构建步骤,例如部署一个Python Flask应用:

  1. # 使用官方Python基础镜像
  2. FROM python:3.9-slim
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制依赖文件并安装
  6. COPY requirements.txt .
  7. RUN pip install --no-cache-dir -r requirements.txt
  8. # 复制应用代码
  9. COPY . .
  10. # 暴露端口
  11. EXPOSE 5000
  12. # 启动命令
  13. CMD ["python", "app.py"]

构建并运行:

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

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

容器是镜像的可写层,通过隔离的进程空间、网络和文件系统运行应用。

常用操作:

  • 启动容器
    1. docker run -d --name my-nginx nginx:latest # -d后台运行,--name指定名称
  • 进入容器
    1. docker exec -it my-nginx /bin/bash # -it交互模式
  • 查看运行中容器
    1. docker ps
  • 停止/启动容器
    1. docker stop my-nginx
    2. docker start my-nginx

关键参数解析:

  • -p:端口映射(主机端口:容器端口)
  • -v:挂载主机目录到容器(数据持久化)
  • --rm:容器退出后自动删除(适合测试)

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

仓库是集中存放镜像的地方,Docker Hub是官方公共仓库,也可自建私有仓库(如Harbor)。

常用操作:

  • 登录Docker Hub
    1. docker login
  • 推送镜像
    1. docker tag my-flask-app username/my-flask-app:v1 # 打标签
    2. docker push username/my-flask-app:v1
  • 拉取私有仓库镜像
    1. docker pull registry.example.com/my-app:latest

四、进阶技巧与最佳实践

1. 优化镜像大小

  • 使用多阶段构建(Multi-stage Builds):

    1. # 第一阶段:构建
    2. FROM golang:1.18 AS builder
    3. WORKDIR /app
    4. COPY . .
    5. RUN go build -o myapp .
    6. # 第二阶段:运行
    7. FROM alpine:latest
    8. COPY --from=builder /app/myapp .
    9. CMD ["./myapp"]
  • 选择精简基础镜像(如alpinescratch)。

2. 数据持久化

使用卷(Volumes)避免容器删除后数据丢失:

  1. docker run -v /host/path:/container/path nginx

3. 网络配置

  • 创建自定义网络:
    1. docker network create my-network
    2. docker run --network=my-network nginx
  • 容器间通信:同一网络的容器可通过名称互相访问。

4. Docker Compose编排多容器

通过docker-compose.yml定义和运行多容器应用:

  1. version: '3'
  2. services:
  3. web:
  4. image: nginx
  5. ports:
  6. - "80:80"
  7. db:
  8. image: postgres
  9. environment:
  10. POSTGRES_PASSWORD: example

启动命令:

  1. docker-compose up -d

五、常见问题与解决方案

  1. 权限错误:Linux下普通用户运行Docker需加入docker组:
    1. sudo usermod -aG docker $USER
    2. newgrp docker # 立即生效
  2. 端口冲突:使用docker ps确认端口占用,修改-p参数。
  3. 镜像拉取慢:配置国内镜像源(如阿里云、腾讯云)。

六、总结与行动建议

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

  • Kubernetes:容器编排,管理大规模集群。
  • CI/CD集成:在Jenkins/GitLab中嵌入Docker构建。
  • 安全实践:定期扫描镜像漏洞(如Trivy工具)。

立即行动

  1. 安装Docker并运行hello-world验证。
  2. 尝试构建一个自定义镜像(如静态网站)。
  3. 使用docker-compose部署一个多容器应用(如WordPress+MySQL)。

通过持续实践,你将从Docker新手进阶为容器化专家,显著提升开发效率与部署可靠性!