从零开始玩转 Docker:掌握镜像、容器与仓库的完整指南

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

一、为什么需要 Docker?

在传统开发中,环境配置一直是开发者最头疼的问题之一。本地开发环境与生产环境不一致、依赖库版本冲突、多项目环境隔离困难……这些问题不仅消耗大量时间,还可能导致线上故障。Docker 的出现彻底改变了这一局面。

Docker 是一种轻量级的容器化技术,通过将应用及其依赖打包成独立的容器,实现“一次构建,到处运行”。与虚拟机相比,Docker 容器共享主机内核,无需启动完整的操作系统,因此启动更快、资源占用更少。无论是开发、测试还是部署,Docker 都能提供一致的运行环境,显著提升效率。

二、Docker 的核心概念:镜像、容器与仓库

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

镜像可以理解为容器的“蓝图”或“模板”。它是一个只读的文件系统,包含了运行应用所需的所有依赖:代码、运行时、系统工具、库等。镜像通过分层存储,每一层都是独立的、可复用的,这种设计使得镜像的构建和分发非常高效。

常用镜像操作:

  • 拉取镜像:从仓库下载镜像到本地。

    1. docker pull ubuntu:20.04

    这条命令会从 Docker Hub 下载 Ubuntu 20.04 的官方镜像。

  • 查看本地镜像

    1. docker images

    输出示例:

    1. REPOSITORY TAG IMAGE ID CREATED SIZE
    2. ubuntu 20.04 abc123456789 2 weeks ago 72.9MB
  • 删除镜像

    1. docker rmi ubuntu:20.04

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

容器是镜像的运行实例,它基于镜像创建,并在独立的命名空间中运行。与虚拟机不同,容器是轻量级的,启动速度极快(通常在秒级)。容器可以启动、停止、删除,且彼此隔离。

常用容器操作:

  • 运行容器

    1. docker run -it --name my_container ubuntu:20.04 /bin/bash
    • -it:以交互模式运行,并分配一个伪终端。
    • --name:指定容器名称。
    • /bin/bash:在容器中启动 Bash shell。
  • 查看运行中的容器

    1. docker ps

    输出示例:

    1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    2. 123abc456def ubuntu:20.04 "/bin/bash" 10 seconds ago Up 9 seconds my_container
  • 停止容器

    1. docker stop my_container
  • 启动已停止的容器

    1. docker start my_container
  • 删除容器

    1. docker rm my_container

    注意:删除前需确保容器已停止。

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

仓库是用于存储和分发 Docker 镜像的地方。Docker Hub 是最常用的公共仓库,类似 GitHub 的代码托管平台。企业也可以搭建私有仓库(如 Harbor)来存储内部镜像。

常用仓库操作:

  • 登录 Docker Hub

    1. docker login

    输入用户名和密码后即可登录。

  • 推送镜像到仓库

    1. docker tag ubuntu:20.04 myusername/ubuntu:20.04
    2. docker push myusername/ubuntu:20.04
    • docker tag:为镜像打标签,格式为 用户名/镜像名:标签
    • docker push:将镜像推送到远程仓库。
  • 从仓库拉取镜像

    1. docker pull myusername/ubuntu:20.04

三、实战案例:从零开始部署一个 Web 应用

1. 编写一个简单的 Python Web 应用

创建一个 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

Dockerfile 是用于构建镜像的脚本文件。在同一目录下创建 Dockerfile

  1. # 使用官方 Python 镜像作为基础
  2. FROM python:3.9-slim
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制当前目录文件到工作目录
  6. COPY . .
  7. # 安装依赖
  8. RUN pip install flask
  9. # 暴露端口
  10. EXPOSE 5000
  11. # 定义启动命令
  12. CMD ["python", "app.py"]

3. 构建镜像

  1. docker build -t my-flask-app .
  • -t:指定镜像名称和标签。
  • .:表示使用当前目录的 Dockerfile。

4. 运行容器

  1. docker run -p 5000:5000 --name my-flask-container my-flask-app
  • -p 5000:5000:将主机的 5000 端口映射到容器的 5000 端口。
  • --name:指定容器名称。

访问 http://localhost:5000,你应该能看到“Hello, Docker!”的页面。

四、Docker 的进阶技巧

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

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过编写 docker-compose.yml 文件,可以一键启动复杂应用。

示例 docker-compose.yml

  1. version: '3'
  2. services:
  3. web:
  4. build: .
  5. ports:
  6. - "5000:5000"
  7. redis:
  8. image: "redis:alpine"

启动命令:

  1. docker-compose up

2. 优化镜像大小

  • 使用多阶段构建:

    1. # 第一阶段:构建
    2. FROM python:3.9 as builder
    3. WORKDIR /app
    4. COPY . .
    5. RUN pip install --user flask
    6. # 第二阶段:运行
    7. FROM python:3.9-slim
    8. WORKDIR /app
    9. COPY --from=builder /root/.local /root/.local
    10. COPY . .
    11. ENV PATH=/root/.local/bin:$PATH
    12. CMD ["python", "app.py"]
  • 选择更小的基础镜像(如 alpine 版本)。

3. 使用 .dockerignore 文件

类似于 .gitignore.dockerignore 可以排除不必要的文件(如 __pycache__.git),减少构建上下文的大小。

五、总结与展望

通过本文,你已掌握了 Docker 的核心概念(镜像、容器、仓库)和基本操作(拉取、运行、构建、推送)。从简单的单容器应用到复杂的多容器编排,Docker 都能提供强大的支持。

未来,你可以进一步学习:

  • Docker Swarm 或 Kubernetes 的集群管理。
  • CI/CD 流水线中的 Docker 集成。
  • 安全最佳实践(如镜像签名、最小权限原则)。

Docker 不仅是开发者的利器,也是企业实现 DevOps 和微服务架构的关键技术。希望这篇指南能成为你 Docker 之旅的起点!