Docker 镜像优化与安全:从镜像体积到供应链安全

为什么要优化 Docker 镜像 Docker 镜像并不是一个简单的压缩包,而是由多个只读 Layer 组成的文件系统。 例如: Dockerfile │ ├── FROM ├── RUN ├── COPY └── RUN │ ▼ Image Layers │ ▼ Container 镜像体积会直接影响: 构建时间。 镜像 Push 时间。 镜像 Pull 时间。 CI/CD 执行时间。 磁盘占用。 容器启动速度。 镜像攻击面。 因此,镜像优化并不只是为了“让镜像变小”。 更准确地说: 镜像优化 │ ├── 减少无用文件 ├── 减少无用依赖 ├── 提高构建缓存命中率 ├── 缩短构建时间 ├── 减少网络传输 └── 降低攻击面 Docker 官方也将“小而聚焦”的镜像作为生产镜像构建的重要目标,并强调镜像大小和安全性之间存在直接关系。 因此,一份生产级 Dockerfile 通常应该同时考虑: 体积 性能 缓存 安全 可维护性 而不是只关注其中一个指标。 选择合适的基础镜像 基础镜像是整个 Docker 镜像的起点。 例如:...

2024年05月13日 · 5 min · Leanku

Docker CI/CD 实战:从 Git Push 到 Build、Push、Deploy

Docker CI/CD 要解决什么问题 前面的 Docker 系列已经介绍了 Dockerfile、Docker Compose、镜像构建、镜像 Push 以及 Harbor 私有镜像仓库。 如果每次发布都手动执行: git pull docker build -t registry.example.com/backend/api:v1.0.0 . docker push registry.example.com/backend/api:v1.0.0 ssh server docker pull registry.example.com/backend/api:v1.0.0 docker compose up -d 项目规模较小时问题不大,但随着服务数量增加,手工发布会逐渐暴露出几个问题: 容易漏执行步骤。 镜像 Tag 容易写错。 测试和生产环境操作不一致。 发布过程缺少统一记录。 无法方便地回滚。 开发人员需要直接登录生产服务器。 发布效率随着项目数量增加而下降。 CI/CD 的核心目标,就是把这些重复操作交给自动化系统完成。 一个典型的 Docker CI/CD 流程如下: Git Push │ ▼ CI Pipeline │ ├── Checkout ├── Test ├── Build Image ├── Tag Image └── Push Image │ ▼ Harbor │ ▼ Deploy │ ▼ Production 最终开发人员只需要:...

2024年05月11日 · 8 min · Leanku

Docker Registry 与 Harbor:搭建私有 Docker 镜像仓库

为什么需要私有 Docker 镜像仓库 前面的文章介绍了 Docker 镜像的构建、Tag 和 Push。实际开发中,镜像通常不会只保存在开发者本机,而是需要进入一个统一的镜像仓库。 一个典型的发布流程如下: 开发者 │ │ docker build ▼ 本地 Docker Image │ │ docker tag ▼ 私有镜像仓库 │ ├── 测试服务器 ├── 生产服务器 ├── CI/CD └── Kubernetes 如果团队直接使用 Docker Hub 等公共 Registry,需要考虑镜像可见性、网络访问、权限管理以及企业内部代码和基础镜像的存储问题。 私有 Registry 的主要价值就是建立企业内部的镜像分发中心: ┌──────────────┐ │ CI/CD │ └──────┬───────┘ │ push ▼ ┌──────────┐ ┌──────────────┐ │ Developer│───────▶│ Private │ │ Docker │ push │ Registry │ └──────────┘ └──────┬───────┘ │ pull ┌────────────┼────────────┐ ▼ ▼ ▼ 测试环境 生产环境 K8s 集群 Docker Registry 是镜像仓库的基础能力,而 Harbor 在 Registry 之上增加了 Web 管理、用户体系、项目权限、镜像扫描、Robot Account、复制等企业级能力。...

2024年05月10日 · 5 min · Leanku

Docker Build 与 Push 详解:从镜像构建到镜像仓库

在前面的文章中,我们已经介绍了 Dockerfile 和 Docker Compose。 Dockerfile 解决的是「如何定义一个镜像」,Compose 解决的是「如何运行和管理多个容器」。 但一个完整的 Docker 应用交付流程还缺少一个重要环节: Dockerfile ↓ docker build ↓ Docker Image ↓ docker tag ↓ docker push ↓ Container Registry ↓ docker pull ↓ 服务器 ↓ docker run / docker compose 这就是 Docker 镜像从「构建」到「发布」再到「部署」的完整链路。 本文重点介绍 docker build、docker tag、docker login、docker push、docker pull 以及 docker buildx build,并结合一个 PHP 应用说明实际项目中的镜像发布流程。 1. Docker 镜像发布的完整流程 一个 Docker 镜像从代码进入服务器,通常经历以下几个阶段: 开发环境 │ ▼ Dockerfile │ │ docker build ▼ Docker Image │ │ docker tag ▼ Registry Image │ │ docker push ▼ Container Registry │ │ docker pull ▼ 部署服务器 │ │ docker run │ 或 docker compose ▼ Container 其中每个命令负责不同的事情:...

2024年05月08日 · 7 min · Leanku

Docker Compose 详解:从多容器编排到完整开发环境

单独使用 Docker 时,我们通常需要执行: docker run 来启动一个容器。 但一个实际项目往往并不只有一个容器。 例如一个 PHP/Hyperf 项目可能需要: Nginx PHP / Hyperf MySQL Redis RabbitMQ 如果全部手动使用 docker run 管理,不仅命令很长,而且容器之间的网络、Volume、环境变量、启动顺序等都需要自己维护。 Docker Compose 就是为解决这个问题而设计的。 Docker 官方将 Compose 定义为用于定义和运行多容器应用的工具,可以在一个 Compose 文件中定义服务、网络和 Volume,并通过命令统一管理整个应用栈。当前推荐使用 Compose Specification。 1. Docker Compose 是什么 Docker Compose 的核心思想是: 一个应用 │ ├── PHP ├── Nginx ├── MySQL └── Redis │ ▼ compose.yaml │ ▼ docker compose up -d 也就是说: Docker 负责容器,Compose 负责组织容器。 例如: services: php: image: php:8.3-cli mysql: image: mysql:8....

2024年05月06日 · 6 min · Leanku

Dockerfile 详解:从基础指令到生产级镜像构建

Docker 的核心使用方式可以简单理解为: Dockerfile ↓ docker build ↓ Docker Image ↓ docker run ↓ Docker Container 如果说 Docker Container 解决的是“应用怎么运行”,那么 Dockerfile 解决的就是“应用运行环境怎么构建”。 在实际项目中,我们很少直接使用一个现成镜像完成所有工作。对于 PHP、Java、Node.js、Go 等应用,通常需要把项目代码、运行环境、依赖以及启动方式封装成自己的镜像。 Docker 官方将 Dockerfile 定义为描述镜像构建过程的文本文件,Docker 会按照其中的指令顺序构建镜像。Dockerfile 通常从 FROM 开始,并支持 RUN、COPY、CMD、ENTRYPOINT、ENV、ARG、WORKDIR、USER、HEALTHCHECK 等指令。 1. Dockerfile 是什么 一个最简单的 Dockerfile: FROM nginx:1.27 COPY ./html /usr/share/nginx/html 然后执行: docker build -t my-nginx:1.0 . Docker 会读取当前目录下的 Dockerfile,并根据指令构建镜像。 这里有两个重要概念: Dockerfile 定义: 使用什么基础镜像 安装什么软件 复制什么文件 设置什么环境变量 使用什么用户 容器启动时运行什么程序 Image Dockerfile 执行完成后得到镜像。 例如: Dockerfile │ │ docker build ▼ my-nginx:1....

2024年05月06日 · 5 min · Leanku

Docker 使用详解:从安装配置到常用命令实战

Docker 使用详解:从安装配置到常用命令实战 Docker 已经成为后端开发和部署中非常常见的基础工具。 无论是本地开发,还是测试、CI/CD、服务器部署,都经常会遇到: MySQL Redis RabbitMQ Nginx PHP Node.js Python 这些服务都可以通过 Docker 快速运行。 相比直接在操作系统中安装各种软件,Docker 最大的优势之一是: 把应用及其运行环境封装成容器,让开发、测试和部署环境更加一致。 本文不深入讨论 Docker 底层实现,而是以实际使用为主,从安装开始,重点介绍日常开发中最常用的 Docker 命令。 1. Docker 是什么? Docker 是一个容器化平台。 传统方式安装一个 PHP 项目,可能需要: 操作系统 ↓ PHP ↓ PHP 扩展 ↓ Composer ↓ Nginx ↓ MySQL ↓ Redis 不同开发者的电脑可能存在: PHP 版本不同 MySQL 版本不同 扩展不同 配置不同 系统环境不同 于是就容易出现: “我的电脑上可以运行,你的电脑为什么不行?” Docker 的思路是把应用运行环境标准化。 例如: Docker ├── PHP 8.3 ├── Nginx ├── MySQL 8 └── Redis 每个服务运行在独立容器中。...

2024年05月05日 · 6 min · Leanku

常用Docker镜像

常用Docker镜像 php-msf-docker docker run --privileged --restart=always -it -d --hostname=php-msf --name=php-msf-docker -p 2202:22 -p 80:80 -p 8000:8000 -p 9501:9501 -v D:\Develop\Docker\WWW:/php-msf/data/www leanku/php-msf-docker Rabbitmq docker run -d --name rabbitmq -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=guest -p 15672:15672 -p 5672:5672 rabbitmq:3.8-management MySQL docker run -p 13306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=root -v D:\Develop\Docker\app-mysql:/var/lib/mysql -d mysql:5.7 Redis docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes Elasticsearch docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery....

2023年06月01日 · 1 min · Leanku

docker删除none镜像

docker删除none镜像 1、使用git bash进入到docker文件夹 2、查询所有的none镜像 docker images | grep none 3、查询所有的none镜像的id docker images | grep none | awk '{print $3}' 4、删除所有的none镜像 docker images | grep none | awk '{print $3}' | xargs docker rmi docker none镜像说明 一、有效的 none 镜像 Docker文件系统的组成,docker镜像是由很多 layers组成的,每个 layer之间有父子关系,所有的docker文件系统层默认都存储在/var/lib/docker/graph目录下,docker称之为图层数据库。 最后做一个总结< none>:< none> 镜像是一种中间镜像,我们可以使用docker images -a来看到,他们不会造成硬盘空间占用的问题(因为这是镜像的父层,必须存在的),但是会给我们的判断带来迷惑。 二、无效的 none 镜像 另一种类型的 < none>:< none> 镜像是dangling images ,这种类型会造成磁盘空间占用问题。 像Java和Golang这种编程语言都有一个内存区,这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间,将他返回给堆内存,所以这块内存区对于之后的内存分配是有用的 docker的悬挂(dangling)文件系统与上面的原理类似,他是没有被使用到的并且不会关联任何镜像,因此我们需要一种机制去清理这些悬空镜像。 我们在上文已经提到了有效的< none>镜像,他们是一种中间层,那无效的< none>镜像又是怎么出现的?这些 dangling镜像主要是我们触发 docker build 和 docker pull命令产生的。 使用下面的命令可以清理 docker rmi $(docker images -f "dangling=true" -q)

2023年03月11日 · 1 min · Leanku

php-msf-docker

php-msf-docker 基于centos:centos7.9.2009镜像制作的php开发环境镜像 主要包含: PHP-8.1.14 redis-5.3.7 swoole-src-5.0.2 nginx-1.21.5 supervisor sshd GitHub地址 : https://hub.docker.com/r/leanku/php-msf-docker DockerHub地址 : https://hub.docker.com/r/leanku/php-msf-docker 包含扩展 bcmath,Core,ctype,curl,date,dom,exif,fileinfo,filter,ftp,gd,gettext,hash,iconv,intl,json,libxml,mbstring,mysqli,mysqlnd,openssl,pcntl,pcre,PDO,pdo_mysql,pdo_pgsql,pdo_sqlite,pgsql,Phar,posix,redis,Reflection,session,shmop,SimpleXML,soap,sockets,sodium,SPL,sqlite3,standard,sysvsem,tokenizer,xml,xmlreader,xmlwriter,xsl,zip,zlib,swoole 运行示例 docker run --privileged --restart=always -it -d \ --hostname=php-msf --name=php-msf-docker \ -p 22:22 -p 80:80 -p 3306:3306 -p 8000:8000 -p 9501:9501 \ -v /c/docker/www:/php-msf/data/www \ leanku/php-msf-docker SSH 默认用户:super 密码:123456 ssh [email protected]

2023年03月11日 · 1 min · Leanku