从零开始玩转Docker:快速掌握镜像、容器与仓库

一、Docker是什么?为什么需要它?

Docker是一个开源的容器化技术平台,通过将应用及其依赖打包成轻量级、可移植的“容器”,实现跨环境的一致性运行。与传统虚拟化技术(如VMware)相比,Docker容器直接共享主机内核,无需独立操作系统,因此启动更快、资源占用更低。
核心优势

  • 环境一致性:解决“开发环境能运行,生产环境报错”的痛点。
  • 轻量级:单个容器可能仅占用几十MB资源,而虚拟机通常需GB级。
  • 快速部署:秒级启动容器,支持弹性伸缩。
  • 生态丰富:拥有庞大的镜像仓库(如Docker Hub),覆盖主流编程语言和工具。

二、Docker核心概念解析

1. 镜像(Image):应用的“安装包”

镜像是一个只读的模板,包含运行应用所需的一切:代码、运行时、库、环境变量等。例如,一个Nginx镜像可能包含Nginx二进制文件、配置文件和依赖库。
关键操作

  • 拉取镜像:从仓库下载镜像到本地。
    1. docker pull nginx:latest # 下载最新版Nginx镜像
  • 查看本地镜像
    1. docker images # 列出所有本地镜像
  • 删除镜像
    1. docker rmi nginx:latest # 删除指定镜像

    进阶技巧:通过Dockerfile自定义镜像。例如,创建一个运行Python脚本的镜像:

    1. FROM python:3.9 # 基于Python 3.9官方镜像
    2. WORKDIR /app # 设置工作目录
    3. COPY script.py . # 复制脚本到容器
    4. CMD ["python", "script.py"] # 运行脚本

    构建并运行:

    1. docker build -t my-python-app . # 构建镜像
    2. docker run my-python-app # 运行容器

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

容器是镜像的运行时实例,可启动、停止、删除。每个容器拥有独立的文件系统、网络和进程空间,但共享主机内核。
关键操作

  • 运行容器
    1. docker run -d -p 80:80 nginx # 后台运行Nginx,映射主机80端口到容器80端口
    • -d:后台运行。
    • -p:端口映射(主机端口:容器端口)。
  • 查看运行中的容器
    1. docker ps # 列出所有运行中的容器
  • 进入容器
    1. docker exec -it <容器ID> /bin/bash # 进入容器的bash终端
  • 停止/启动容器
    1. docker stop <容器ID> # 停止容器
    2. docker start <容器ID> # 启动已停止的容器
  • 删除容器
    1. docker rm <容器ID> # 删除已停止的容器
    2. docker rm -f <容器ID> # 强制删除运行中的容器(谨慎使用)

    实际应用场景

  • 开发环境隔离:为不同项目创建独立容器,避免依赖冲突。
  • 微服务部署:每个微服务运行在独立容器中,通过Docker Compose编排。

3. 仓库(Registry):镜像的“存储库”

仓库是集中存放镜像的地方,分为公有(如Docker Hub)和私有(如Harbor)。用户可上传(push)或下载(pull)镜像。
关键操作

  • 登录Docker Hub
    1. docker login # 输入用户名和密码
  • 标记镜像(为上传做准备):
    1. docker tag my-python-app username/my-python-app:v1 # 添加标签
  • 上传镜像
    1. docker push username/my-python-app:v1 # 推送到Docker Hub
  • 从私有仓库拉取镜像
    1. docker pull my-registry.com/my-app:latest

    企业级实践

  • 使用私有仓库(如Harbor)存储内部镜像,避免依赖公有仓库。
  • 通过docker scan检查镜像漏洞(需Docker Desktop或企业版)。

三、Docker实战:从安装到部署

1. 安装Docker

  • Linux(Ubuntu)
    1. sudo apt update
    2. sudo apt install docker-ce docker-ce-cli containerd.io
    3. sudo systemctl enable docker # 开机自启
  • Mac/Windows:下载Docker Desktop并安装。

2. 部署一个Web应用

步骤

  1. 创建Dockerfile
    1. FROM node:14
    2. WORKDIR /app
    3. COPY package*.json ./
    4. RUN npm install
    5. COPY . .
    6. EXPOSE 3000
    7. CMD ["node", "server.js"]
  2. 构建镜像:
    1. docker build -t my-node-app .
  3. 运行容器:
    1. docker run -d -p 3000:3000 my-node-app
  4. 访问http://localhost:3000验证。

3. 使用Docker Compose编排多容器

创建docker-compose.yml

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

启动服务:

  1. docker-compose up -d # 后台启动

四、常见问题与优化

1. 性能优化

  • 减少镜像层数:合并RUN指令,减少中间层。
  • 使用多阶段构建:例如,先编译Go代码,再复制二进制文件到轻量级镜像。

    1. FROM golang:1.16 AS builder
    2. WORKDIR /app
    3. COPY . .
    4. RUN go build -o myapp
    5. FROM alpine:latest
    6. COPY --from=builder /app/myapp .
    7. CMD ["./myapp"]

2. 安全建议

  • 避免以root用户运行容器。
  • 定期更新基础镜像(如python:3.9python:3.10)。
  • 使用docker scan检测漏洞。

3. 调试技巧

  • 查看容器日志:
    1. docker logs <容器ID>
  • 检查资源占用:
    1. docker stats # 实时监控容器CPU/内存

五、总结与进阶方向

通过本文,你已掌握Docker的核心能力:镜像构建、容器管理和仓库操作。下一步可探索:

  • Kubernetes:大规模容器编排。
  • Docker Swarm:轻量级集群管理。
  • CI/CD集成:在Jenkins/GitLab中嵌入Docker。

Docker不仅是开发工具,更是现代云原生架构的基石。从本地开发到生产部署,掌握Docker将显著提升你的效率与可靠性。立即动手实践,开启容器化之旅吧!