Docker 入门手册

Docker 入门手册
docker-beginners-guide

1. Docker 简介

Docker 是一个开源的容器化平台,它使应用程序的创建、部署和运行更加轻松。Docker 通过将应用及其依赖项打包到一个容器中,保证在任何环境下都能一致地运行。

1.1 Docker 的演变史

  • 2013年发布:Docker 由 Solomon Hykes 创建,最初作为一个内部项目,用于简化应用的部署。
  • 2014年 Docker Hub 发布:Docker Hub 是一个在线存储和分享 Docker 镜像的仓库,使得共享应用变得更加简单。
  • 2017年 Docker 企业版:支持大规模的容器管理,为企业提供更强的安全性和管理功能。
  • 现在:Docker 已经成为 DevOps 和微服务架构中不可或缺的工具,并与 Kubernetes 等容器编排工具紧密结合。

1.2 Docker 和虚拟机的区别

特性 Docker(容器) 虚拟机(VM)
启动速度 几秒钟启动一个容器 通常需要几分钟
资源占用 占用较少,只使用必需资源 需要完整的操作系统,资源开销大
隔离性 基于操作系统级别的隔离,轻量 基于硬件虚拟化,隔离更强
使用场景 适合微服务、持续集成、快速部署 适合需要完整系统环境的应用

总结:Docker 通过共享操作系统内核,实现了更轻量和快速的应用隔离,更适合现代的微服务架构。


2. Docker 基本操作详解

2.1 Docker 镜像(Image)操作

  • 拉取镜像

    docker pull nginx:latest
    

    从 Docker Hub 上下载指定版本的镜像。

  • 构建镜像

    docker build -t myapp:1.0 .
    

    从当前目录中的 Dockerfile 构建镜像,并命名为 myapp:1.0

  • 查看本地镜像

    docker images
    

    列出本地所有的镜像。

  • 删除镜像

    docker rmi myapp:1.0
    

    删除指定的镜像。

2.2 Docker 容器(Container)操作

  • 启动容器

    docker run -d --name mynginx -p 8080:80 nginx
    

    启动一个名为 mynginx 的容器,并将宿主机的 8080 端口映射到容器的 80 端口。

  • 查看运行中的容器

    docker ps
    

    列出所有运行中的容器。

  • 停止容器

    docker stop mynginx
    

    停止名为 mynginx 的容器。

  • 删除容器

    docker rm mynginx
    

    删除一个停止的容器。


3. Dockerfile 详解及示例

Dockerfile 是用来定义如何构建镜像的文件。以下是一些常用指令和示例:

  • FROM:指定基础镜像

    FROM node:18
    

    使用官方的 Node.js 18 版本作为基础。

  • COPY:复制文件到镜像

    COPY . /app
    

    将当前目录的所有文件复制到镜像的 /app 目录。

  • RUN:运行命令

    RUN npm install
    

    在构建镜像时安装依赖。

  • EXPOSE:声明容器运行时监听的端口

    EXPOSE 3000
    
  • CMD:指定容器启动时执行的命令

    CMD ["node", "app.js"]
    

Dockerfile 编写策略

  • 尽量使用官方基础镜像,减少安全风险。
  • 将频繁变动的内容(如代码)放到 COPY 的后面,以减少构建缓存失效的次数。
  • 使用 .dockerignore 文件,排除不需要的文件(如 node_modules)。

4. 常用场景和操作技巧

4.1 查看 Docker 磁盘占用

  • 查看容器、镜像、卷等的磁盘占用

    docker system df
    

    列出镜像、容器、数据卷的磁盘占用情况。

  • 清理无用数据

    docker system prune
    

    删除所有未使用的容器、镜像和网络。

4.2 应用限制与资源管理

  • 限制容器的 CPU 使用

    docker run -d --name myapp --cpus="1.5" myapp:latest
    

    myapp 容器的 CPU 使用限制为最多 1.5 个核心。

  • 限制容器的内存使用

    docker run -d --name myapp --memory="512m" myapp:latest
    

    限制容器的内存使用为 512MB。

4.3 日志查看与过滤

  • 查看容器日志

    docker logs myapp
    
  • 实时查看容器日志

    docker logs -f myapp
    
  • 按时间过滤日志

    docker logs --since 1h myapp
    

    查看最近 1 小时内的日志。

4.4 挂载数据卷(Volume)

数据卷用于在容器和宿主机之间共享数据,并保证数据持久化。

  • 创建数据卷

    docker volume create mydata
    
  • 挂载数据卷到容器

    docker run -d -v mydata:/app/data myapp
    

    mydata 挂载到容器内的 /app/data 目录。

  • 查看所有数据卷

    docker volume ls
    
  • 删除未使用的数据卷

    docker volume prune
    

5. 实战场景及优化建议

5.1 本地开发环境使用 Docker

  • 使用 docker-compose 管理多个容器(如数据库、应用服务):

    version: '3'
    services:
      web:
        image: myapp
        ports:
          - "8080:80"
        volumes:
          - ./app:/app
      db:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: example
    
  • 优点:使用 docker-compose 可以轻松地定义和管理多容器应用,适合本地开发和测试。

5.2 部署到生产环境

  • 使用 docker swarmKubernetes 进行容器编排,管理大规模容器集群。
  • 将应用日志输出到集中式日志系统(如 ELK),方便日志的集中管理与分析。
  • 设置健康检查(HEALTHCHECK),确保容器在运行时自动恢复异常。

5.3 常见问题及解决方法

  • 容器磁盘空间不足:定期使用 docker system prune 清理未使用的容器、镜像和数据卷。
  • 容器网络问题:使用 docker network 创建自定义网络,隔离不同应用的网络环境。
  • 镜像体积过大:通过精简 Dockerfile 指令、合并 RUN 命令、使用多阶段构建来减少镜像大小。

总结

Docker 通过简单易用的命令和强大的容器化技术,让应用的开发和部署变得更加高效。
无论是构建镜像、管理容器,还是优化资源,Docker 都能帮助开发者提升生产力。

Read more

了解 SOLID 原则,包含 C# 代码示例

了解 SOLID 原则,包含 C# 代码示例

SOLID 原则让开发者能够编写易于扩展的代码,并避免常见的编码错误。这些原则由 Robert C. Martin 提出,已成为面向对象编程的重要基础。 什么是 SOLID 原则? SOLID 是五个设计原则的缩写,分别代表: * S - 单一职责原则(Single Responsibility Principle,SRP) * O - 开闭原则(Open/Closed Principle,OCP) * L - 里氏替换原则(Liskov Substitution Principle,LSP) * I - 接口隔离原则(Interface Segregation Principle,ISP) * D - 依赖倒置原则(Dependency Inversion Principle,DIP)

作者 Chasen Liu
Linux 文件系统概述

Linux 文件系统概述

目录结构及解释 / (根目录) * 作用: 根目录是文件系统的顶层,所有文件和目录都从这里开始。系统的所有其他目录都挂载在这个目录下。 * 建议: 不要在根目录下直接存放用户文件或程序,保持其整洁,并尽量减少根目录下的修改。 /usr (用户系统资源) * 作用: 包含用户安装的应用程序和库文件,是系统中最大的目录之一,主要用于存放系统级别的二进制文件、库文件和共享数据。 * 子目录: * /usr/bin: 存放用户可执行的二进制文件(程序),如常用命令 ls、cp。 * /usr/sbin: 存放系统管理员使用的命令,如 fdisk、shutdown。 * /usr/lib: 包含程序和库文件。 * /usr/local: 用户自定义安装的软件放在这里,避免和系统包产生冲突。 * /usr/share: 存放共享数据,如文档、手册页和区域设置文件。 * 建议: 将自定义编译的软件安装到 /usr/local/ 下,确保系统与用户自定义软件的分离,便于维护。

作者 Chasen Liu
Kafka 和 RabbitMQ 的全面对比

Kafka 和 RabbitMQ 的全面对比

Kafka 和 RabbitMQ 是目前流行的消息队列和数据流处理工具,但它们的设计思路和应用场景各不相同。本文将从核心概念、适用场景、优缺点以及对比方面详细说明 Kafka 和 RabbitMQ 的区别。 一、Kafka 和 RabbitMQ 的架构简介 Kafka Kafka 是 LinkedIn 开发并捐献给 Apache 基金会的分布式数据流平台。其核心设计理念是处理大规模、高吞吐量的实时数据流。 * 设计理念:主要关注高吞吐量和持久化,适合处理大量数据的实时流处理场景。 * 架构特点:以发布-订阅模型为基础,Kafka 中的数据被持久化到磁盘,并可以从任意时刻开始重复消费。 * 典型应用:数据流管道(Data Pipelines)、日志聚合、实时分析、监控系统、事件溯源等。 RabbitMQ RabbitMQ 是由 Pivotal Software 开发的消息队列系统,基于 AMQP(

作者 Chasen Liu