废话不多说(博主花费3周利用碎片化时间整理,求赞 嘿嘿)
1.5.1、 AUFS(Advanced Multi-Layered Unification Filesystem)
1.5.2、 OverlayFS(Overlay File System)
1.5.3、 Btrfs(B-Tree File System)
1、什么是容器?
容器其实是一种沙盒技术。沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去。
容器的本质到底是什么?
容器的本质是被隔离和资源限制的进程集合(容器内的进程无法访问容器外的进程)。容器镜像就是自带完整运行库和虚拟化环境的.exe安装包.
- docker介绍
官网:https://www.docker.com
docker.io ---docker官方库也叫docker-hub
容器内的进程无法访问容器外的进程Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
1.1、Docker跟原有的工具区别
传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;
1、rd(开发)开发产品(需要配置开发环境)lamp结构
2、测试(需要配置测试环境)
3.op(运维)上线(需要线上环境)
开发 测试 运维
有docker容器之后:
Docker的部署模式是:复制->运行。
1. rd(开发)开发产品(需要在docker容器里配置开发环境)
2. 把容器打包成镜像交给运维,运维上线
1.2、Docker对服务器端开发/部署带来的变化:
- 快速部署
- 对于部署来说可以极大的减少部署的时间成本和人力成本
- Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念是 Build once, Run anywhere(一次构建多次使用)
- 1)标准化应用发布,docker容器包含了运行环境和可执行程序,可以跨平台和主机使用;
- 2)节约时间,快速部署和启动,VM启动一般是分钟级,docker容器启动是秒级;
- 3)方便构建基于微服务架构的系统,通过服务编排,更好的松耦合(开发搞得);
- 4)节约成本,以前一个虚拟机至少需要几个G的磁盘空间,docker容器可以减少到MB级;
1.3、docker容器的优势
1.3.1、交付物标准化
Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
1.3.2、应用隔离
Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本.
1.3.3、一次构建,多次交付
类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。
1.4、Docker的度量(资源限制):
Docker是利用容器来实现的一种轻量级的虚拟技术,从而在保证隔离性的同时达到节省资源的目的。Docker的可移植性可以让它一次建立,到处运行。Docker的度量可以从以下四个方面进行
1.4.1、隔离性
通过内核的命名空间来实现的,将容器的进程、网络、消息、文件系统和主机名进行隔离。
1.4.2、可度量性
Docker主要通过cgroups控制组来控制资源的度量和分配。
1.4.3、移植性
Docker利用AUFS来实现对容器的快速更新。
AUFS是一种支持将不同目录挂载到同一个虚拟文件系统下的文件系统,支持对每个目录的读写权限管理。AUFS具有层的概念,每一次修改都是在已有的只写层进行增量修改,修改的内容将形成新的文件层,不影响原有的层。
1.4.4、安全性
安全性可以分为容器内部之间的安全性;容器与托管主机之间的安全性。
容器内部之间的安全性主要是通过命名空间和cgroups来保证的。
容器与托管主机之间的安全性主要是通过内核能力机制的控制,可以防止Docker非法入侵托管主机。
1.5、Docker容器的各位文件系统对比
1.5.1、 AUFS(Advanced Multi-Layered Unification Filesystem)
特点
最早的 Docker 默认存储驱动,基于联合挂载技术,支持多层镜像叠加。
启动速度快,适合开发环境。
优点
成熟稳定,社区支持广泛。
支持快速容器创建和销毁。
缺点
依赖 Linux 内核补丁,未被合并到主线内核,兼容性受限(仅适用于较旧内核版本)。
对并发写操作性能较差。
1.5.2、 OverlayFS(Overlay File System)
特点
当前 Docker 推荐的存储驱动,内核原生支持(Linux 4.0+)。
通过 lowerdir(只读层)和 upperdir(可写层)实现分层。
优点
性能优于 AUFS,尤其在大量小文件操作时。
内核原生支持,无需额外补丁,兼容性更好。
缺点:
在某些场景下(如频繁文件删除)可能导致 inode 耗尽问题。
对嵌套 OverlayFS 支持有限。
1.5.3、 Btrfs(B-Tree File System)
特点
基于 Btrfs 的子卷和快照功能实现镜像分层。
支持高级功能如数据去重、压缩和快照管理。
优点
存储效率高,适合大规模镜像管理。
快照功能便于备份和恢复。
缺点
稳定性相对较低,可能存在数据损坏风险。
配置复杂,对运维技能要求高。
1.5.4、 Device Mapper
特点
使用块设备映射技术,通过瘦供给(thin provisioning)管理存储。
默认用于 CentOS/RHEL 等发行版。
优点
支持块级存储,适合需要精细控制磁盘 I/O 的场景。
稳定性高,适合生产环境。
缺点:
存储效率较低,可能产生较大磁盘开销。
配置复杂,需预先分配存储池。
1.5.5、 ZFS
特点
基于 ZFS 文件系统的克隆和快照功能。
支持数据压缩、去重和高级存储管理。
优点
数据一致性和可靠性高。
存储优化能力强,适合大规模数据场景。
缺点
内存占用高,对硬件资源要求较高。
配置和维护复杂度高。
存储驱动 | 性能 | 稳定性 | 兼容性 | 适用场景 | 推荐指数 |
AUFS | 中 | 高 | 低 | 开发测试、快速迭代 | ★★☆☆☆ |
OverlayFS | 高 | 高 | 高 | 生产环境、通用需求 | ★★★★★ |
Btrfs | 中 | 中 | 中 | 存储优化、企业级应用 | ★★★☆☆ |
Device Mapper | 中 | 高 | 中 | 块存储需求、RHEL/CentOS 环境 | ★★★★☆ |
ZFS | 高 | 高 | 低 | 高可靠性、数据中心 | ★★★☆☆ |
- docker安装
2.1、本地安装
删除已经安装的docker环境
systemctl stop docker
docker rm -f $(docker ps -aq) 删除所有容器
docker rmi -f $(docker images -q) 删除所有镜像
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine \
docker-ce \
docker-ce-cli \
containerd.io
直接执行命令安装
[root@docker ~]# yum -y install epel*
[root@docker ~]# yum -y install docker
因为我的测试设备是centos9,所以yum安装的是podman-docker
正常启动方式:systemctl start docker
我的启动方式:systemctl start podman
注意甄别
验证安装
[root@docker ~]# docker version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
Client: Podman Engine
Version: 5.4.0
API Version: 5.4.0
Go Version: go1.23.4 (Red Hat 1.23.4-1.el9)
Built: Wed Feb 12 10:43:43 2025
OS/Arch: linux/arm64
2.2、官方脚本安装
curl -fsSL https://get.docker.com -o install-docker.sh
sh install-docker.sh
2.3、阿里云yum安装
安装dockerYUM源
[root@docker ~]# yum config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# ls /etc/yum.repos.d/docker-ce.repo
/etc/yum.repos.d/docker-ce.repo
安装
[root@docker ~]# yum -yinstall docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginn
查看版本
[root@docker ~]# docker version
Client: Docker Engine - Community
Version: 28.0.0
API version: 1.41 (downgraded from 1.48)
Go version: go1.23.6
Git commit: f9ced58
Built: Wed Feb 19 22:12:15 2025
OS/Arch: linux/arm64
Context: default
Server: linux/arm64/centos-9
Podman Engine:
Version: 5.4.0
APIVersion: 5.4.0
Arch: arm64
BuildTime: 2025-02-12T10:43:43-05:00
Experimental: false
GitCommit:
GoVersion: go1.23.4 (Red Hat 1.23.4-1.el9)
KernelVersion: 5.14.0-503.el9.aarch64
MinAPIVersion: 4.0.0
Os: linux
Conmon:
Version: conmon version 2.1.12, commit: f174c390e4760883511ab6b5c146dcb244aeb647
Package: conmon-2.1.12-1.el9.aarch64
OCI Runtime (crun):
Version: crun version 1.16.1
commit: afa829ca0122bd5e1d67f1f38e6cc348027e3c32
rundir: /run/crun
spec: 1.0.0
+SYSTEMD +SELINUX +APPARMOR +CAP +SECCOMP +EBPF +CRIU +YAJL
Package: crun-1.16.1-1.el9.aarch64
Engine:
Version: 5.4.0
API version: 1.41 (minimum version 1.24)
Go version: go1.23.4 (Red Hat 1.23.4-1.el9)
Git commit:
Built: Wed Feb 12 10:43:43 2025
OS/Arch: linux/arm64
Experimental: false
- docker加速配置
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度。
Docker 加速器对 Docker 的版本有要求吗?
需要 Docker 1.8 或更高版本才能使用。
Docker 加速器支持什么系统?
Linux, MacOS 以及 Windows 平台。
公益镜像:https://1ms.run
3.1、配置阿里云镜像加速
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到
在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fwief3ik.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload //刷新配置
systemctl restart docker
验证:docker info 出现 Registry Mirrors:
https://fwief3ik.mirror.aliyuncs.com/
则配置成功。
[root@docker ~]# docker info
...
Registry Mirrors:
https://fwief3ik.mirror.aliyuncs.com/
Live Restore Enabled: false
3.2、其他镜像源配置(拉取github需)
镜像源汇总:https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea
尝试拉取nginx
[root@docker ~]# docker pull docker.1ms.run/nginx:latest
Using default tag: latest
latest: Pulling from library/nginx
d51c377d94da: Pull complete
492c7b58b293: Pull complete
587f328750b8: Pull complete
60b452932acd: Pull complete
c60ea76daae0: Pull complete
fb23ee5f039b: Pull complete
0b59f5cbcfb9: Pull complete
Digest: sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
查看本地镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 678546cdd20c 2 weeks ago 197MB
3.3、docker国内镜像源下载
3.3.1、网易蜂巢镜像库
进入后注册即可
四、docker基本概念
4.1、docker系统
Docker系统有两个程序:docker服务端和docker客户端
docker服务端:是一个服务进程,管理着所有的容器。也叫docker engine(容器管理等)
docker客户端:扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。(命令行工具等)
大部分情况下,docker服务端和客户端运行在一台机器上
4.2、docker三大核心组件(重要)
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
4.3、容器的三大组成要素
命名空间 namespace:容器隔离(pid,net,mnt,user)
控制组 cgroups :资源(内存,cpu)
文件系统overlay2(UnionFS)
4.4、docker仓库
用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。
公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建
仓库(registry) -->Repository(仓库路径)-->镜像(按版本区分)
docker.io/centos:7
registry/repository:tag
4.4.1、docker 云服务商仓库
阿里云
网易蜂巢
daocloud
==
4.4.2、docker公共仓库
docker.io
docker官方库也叫docker-hub
类似于github一样,面向全球的一个docker镜像的公共仓库。如果在国内使用速度太慢。
4.4.3、docker私有仓库
个人或者公司部署的非公开库
4.5、docker镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。
在 Docker 的术语里,一个只读层被称为镜像,一个镜像是永久不会变的。由于 Docker 使用一个统一文件系统,由于镜像不可写,所以镜像是无状态的。
4.5.1、镜像由三部分组成:
镜像名称:仓库名称+镜像分类+tag名称(镜像版本)
1.存储对象:images
2.格式:库名/分类:tag
3.tag:表示镜像版本
4.5.2、镜像的分类方式
1.以操作系统名字
centos的docker镜像:
centos5
centos6
centos7
2.以应用的名字
nginx的docker镜像
tomcat的docker镜像
mysql的docker镜像
3.完整镜像名称示例
docker.io/library/nginx:v1
docker.io/library/nginx:latest
daocloud.io/library/nginx
4.5.3、镜像ID
所有镜像都是通过一个 64 位十六进制字符串来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的碰撞机率,所以服务器总是返回长ID。
镜像ID:64位的id号,一般我们看到的是12位的我们称之为短ID,只要我们每个ID号不冲突就可以了
镜像本身:是由一层一层的镜像合在一起的,最底层的镜像我们称为基础镜像,在这个基础镜像的基础上还可以在做镜像,在做的镜像称为子镜像,对于子镜像来讲在谁的基础之上做的就是父镜像。
基础镜像:一个没有任何父镜像的镜像,谓之基础镜像。
scratch (空镜像)
|
centos:9(基础镜像)
|
centos9+nginx (衍生镜像)
4.6、docker容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
4.7、docker镜像命名解析
首先要了解含义:Registry(镜像仓库地址)、Repository(仓库路径)、Tag(标签)
以下是格式:
[registry/][repository/]image_name[:tag]
或
[registry_host:port/][namespace/]repository:tag
实际用例:hub.c.163.com/public/nginx:1.2.1
4.8、docker镜像和容器的区别
区别大白话就是
镜像=网吧电脑(初始系统镜像)
容器=开机后的操作系统
等你重启后你在这个系统的操作就会被还原
维度 | 镜像 | 容器 |
用途 | 定义应用程序运行环境 | 运行应用程序实例 |
可修改性 | 只读 | 可读写(仅容器层) |
存储方式 | 持久化(本地或仓库) | 临时化(默认不保留修改) |
创建方式 | 通过Dockerfile构建 | 通过镜像实例化(docker run) |
资源占用 | 较大(包含完整依赖) | 较小(共享镜像层,仅增加容器层) |
典型操作 | docker build, docker push | docker start, docker exec |
4.9、命名空间(重要)
namespace 空间隔离
cgroup 资源限制
命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响
命名空间类型 | 隔离内容 | 典型应用场景 |
UTS | 主机名、域名 | 容器自定义网络标识 |
User | 用户和组ID映射 | 权限隔离与安全增强 |
PID | 进程ID | 容器内进程树独立性 |
Network | 网络设备、IP、端口 | 虚拟网络环境构建 |
Mount | 文件系统挂载点 | 容器文件系统隔离 |
IPC | 进程间通信资源(消息队列等) | 多容器间通信隔离 |
Cgroup | 控制组层级视图 | 资源配额管理的逻辑隔离 |
4.9.1、uts 命名空间
UTS("UNIX Time-sharing System") 命名空间允许每个容器拥有独立的 hostname 和 domain name,才使其在网络上可以被视作一个独立的节点而非主机上的一个进程。(隔离容器跟主机名,跟域名的空间)
4.9.2、user 命名空间
每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。(隔离主机名跟组名得空间)
4.9.3、pid命名空间
不同用户的进程就是通过 pid 命名空间隔离开的,且不同命名空间中可以有相同 pid。所有的 LXC 进程在 Docker中的父进程为Docker进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。(隔离不同进程间的PID)
4.9.4、net 命名空间
有 了 pid 命名空间, 每个命名空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。(做网络接口隔离的)
4.9.5、ipc 命名空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信号量、消息队列和共享内存、socket、管道等。
4.9.5.1、面试题:
linux系统里面ipc通信有几种方式
socket:网络进程间的通信
管道:本地进程间的通信:echo hello | grep e
信号:kill -9 PID 这种我们叫信号量级,也是本地进程间的通信
共享内存:每个操作系统里面共享内存多大,是物理内存的一半
消息队列:百度搜
4.9.6、mnt命名空间
mnt 命名空间允许不同名字空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。(隔离容器的目录)
五、镜像管理命令
5.1、命令合集
启动docker systemctl start docker
设置docker自启动 systemctl enable docker
查看docker版本信息 docker -v
查看docker版本与状态 docker version
查看docker运行状态 docker info
查看docker容器 docker ps
搜索镜像 docker search 搜索范围
按星级搜索镜像 docker search 搜索范围 --filter=stars=星级
查看本机镜像 docker images(旧)
查看本机镜像 docker images list(新)
查看镜像详细信息 docker image inspect 镜像ID号
查看所以镜像ID docker images -q
删除镜像 docker rmi 镜像名(或ID):版本号
强制删除镜像 docker rmi 镜像名 -f
删除所有镜像 docker images $(docker images -q)
下载指定镜像仓库(不知版本号默认最新) docker pull 镜像仓库名:版本号
上传指定镜像仓库 docker push 镜像仓库名:版本号
更改镜像仓库名和版本号 docker tag 镜像仓库名:版本号 新的镜像仓库名:新的版本号
5.2、搜索镜像
[root@docker ~]# docker search docker.1ms.run/nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20719 [OK]
nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 102
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 49
nginx/unit This repository is retired, use the Docker o… 65
nginx/nginx-ingress-operator NGINX Ingress Operator for NGINX and NGINX P… 2
nginx/nginx-quic-qns NGINX QUIC interop 1
nginx/nginxaas-loadbalancer-kubernetes 0
nginx/unit-preview Unit preview features 0
bitnami/nginx Bitnami container image for NGINX 199
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 128
bitnamicharts/nginx Bitnami Helm chart for NGINX Open Source 0
rancher/nginx 2
kasmweb/nginx An Nginx image based off nginx:alpine and in… 8
linuxserver/nginx An Nginx container, brought to you by LinuxS… 229
redash/nginx Pre-configured nginx to proxy linked contain… 3
dtagdevsec/nginx T-Pot Nginx 0
paketobuildpacks/nginx 0
vmware/nginx 2
chainguard/nginx Build, ship and run secure software with Cha… 4
gluufederation/nginx A customized NGINX image containing a consu… 1
droidwiki/nginx 0
intel/nginx 0
circleci/nginx This image is for internal use 2
corpusops/nginx https://github.com/corpusops/docker-images/ 1
antrea/nginx Nginx server used for Antrea e2e testing 0
查找 star 数至少为 100 的镜像,默认不加 s 选项找出所有相关 nginx 镜像
[root@docker ~]# docker search --filter=stars=200 docker.1ms.run/nginx
NAME DESCRIPTION STARS OFFICIAL
nginx Official build of Nginx. 20719 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 229
5.3、查看镜像
5.3.1、查看本地镜像
[root@docker ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.1ms.run/nginx latest 678546cdd20c 2 weeks ago 197MB
nginx latest 678546cdd20c 2 weeks ago 197MB
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.1ms.run/nginx latest 678546cdd20c 2 weeks ago 197MB
nginx latest 678546cdd20c 2 weeks ago 197MB
5.3.2、查看镜像详情
[root@docker ~]# docker image inspect 678546cdd20c
[
{
"Id": "sha256:678546cdd20cd5baaea6f534dbb7482fc9f2f8d24c1f3c53c0e747b699b849da",
"RepoTags": [
"docker.1ms.run/nginx:latest",
"nginx:latest"
],
"RepoDigests": [
"docker.1ms.run/nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496",
"nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496"
],
"Parent": "",
"Comment": "buildkit.dockerfile.v0",
"Created": "2025-02-05T21:27:16Z",
"DockerVersion": "",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.27.4",
"NJS_VERSION=0.8.9",
"NJS_RELEASE=1~bookworm",
"PKG_RELEASE=1~bookworm",
"DYNPKG_RELEASE=1~bookworm"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"Architecture": "arm64",
"Variant": "v8",
"Os": "linux",
"Size": 197285467,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/b17fbc16f2f0ba2d006659476f61fb49896849fef7a9f836a1b331a7a58e9ad2/diff:/var/lib/docker/overlay2/bdeab177c8eb40fe3517e9b19dcab605921e1c33f1ada31bb677a732ad845d1c/diff:/var/lib/docker/overlay2/2f587f1a1cc3ae5603895e102f4da82b7a10efc5f1901347ac4d9c00ac883195/diff:/var/lib/docker/overlay2/5e69e3b3faf3481f73fa293d2d7db70eea40c2cbcfc25c9108b242d0ebaa9875/diff:/var/lib/docker/overlay2/38d3817f912fc3b8efd8c1012a5dfc674e7289824584db99729931b897ea0746/diff:/var/lib/docker/overlay2/65d8a837f1b0535e89053d9aa97791811d2ef18046ae9e953e8b0a8ecd2fe647/diff",
"MergedDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/merged",
"UpperDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/diff",
"WorkDir": "/var/lib/docker/overlay2/58d9687b12f36832b3dae2ac7a58a6b5a093123f0c5d2079050cd09354a58180/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:52d51720ba2d06cecaed7505a36dbdf74d33d70a2e064ed714f88fe08fd403de",
"sha256:a0e17087bc6aa85a1e53141ba3aefd65390c0cf23bcf8e9e256be62dd1dbc431",
"sha256:55c80bdf194c972540214cd32a19f9d7639e722259f68370c85a2a8af9cd1831",
"sha256:de84c2fb18e8c98aaeec14e72f1fdbac796ae547bf60ca55599ce257e28673f3",
"sha256:6280cdec38c173efdc07e7e90f239c3ba18ddec07a0f50a20db0bcecb5728614",
"sha256:14916ed5c7892b043b565ce1a6865b5c8f251d2ffe4c8db556f302c78baccbde",
"sha256:e22d4b0b4d6e90068bcacbf5f67f39d49a90e84237138e8d7cdf0673db134aeb"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
5.3.3、查看所有镜像ID
[root@docker ~]# docker images -q
678546cdd20c
678546cdd20c
5.3.4、查看镜像制作过程(构建历史)
[root@docker ~]# docker history 678546cdd20c
IMAGE CREATED CREATED BY SIZE COMMENT
678546cdd20c 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago STOPSIGNAL SIGQUIT 0B buildkit.dockerfile.v0
<missing> 2 weeks ago EXPOSE map[80/tcp:{}] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENTRYPOINT ["/docker-entrypoint.sh"] 0B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 20-envsubst-on-templates.sh /docker-ent… 3.02kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 15-local-resolvers.envsh /docker-entryp… 389B buildkit.dockerfile.v0
<missing> 2 weeks ago COPY 10-listen-on-ipv6-by-default.sh /docker… 2.12kB buildkit.dockerfile.v0
<missing> 2 weeks ago COPY docker-entrypoint.sh / # buildkit 1.62kB buildkit.dockerfile.v0
<missing> 2 weeks ago RUN /bin/sh -c set -x && groupadd --syst… 100MB buildkit.dockerfile.v0
<missing> 2 weeks ago ENV DYNPKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV PKG_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_RELEASE=1~bookworm 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NJS_VERSION=0.8.9 0B buildkit.dockerfile.v0
<missing> 2 weeks ago ENV NGINX_VERSION=1.27.4 0B buildkit.dockerfile.v0
<missing> 2 weeks ago LABEL maintainer=NGINX Docker Maintainers <d… 0B buildkit.dockerfile.v0
<missing> 2 weeks ago # debian.sh --arch 'arm64' out/ 'bookworm' '… 97.1MB debuerreotype 0.15
5.4、删除镜像
注意!删除镜像如果报错,或者删的不彻底的话,就要看看镜像是否有加载成容器,如果有加载成容器的话,就要先把容器暂停,然后把镜像加载的那个容器删除掉,这样才能彻底删除镜像.!!!!!!
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id
docker rmi 镜像名或ID
[root@docker ~]# docker rmi 678546cdd20c
Error response from daemon: conflict: unable to delete 678546cdd20c (must be forced) - image is referenced in multiple repositories
上述报错是一个镜像ID被多个仓库引用,那么我们就通过名称删除
[root@docker ~]# docker rmi nginx
Untagged: nginx:latest
Untagged: nginx@sha256:9d6b58feebd2dbd3c56ab5853333d627cc6e281011cfd6050fa4bcf2072c9496
5.5、更改镜像名
docker tag docker.1ms.run/nginx:latest nginx:latest
我们会发现它不是原基础修改,而是新增一个id一致的别名用于引用。如果要在原镜像修改,需要加-f(慎重)
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.1ms.run/nginx latest 678546cdd20c 2 weeks ago 197MB
[root@docker ~]# docker tag docker.1ms.run/nginx:latest nginx:latest
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.1ms.run/nginx latest 678546cdd20c 2 weeks ago 197MB
nginx latest 678546cdd20c 2 weeks ago 197MB
- 容器管理命令
6.1、创建容器
6.1.1、创建但不启动
[root@docker ~]# docker create -it docker.1ms.run/nginx:latest /bin/bssh
47a16d927c1766fd73216ea504d0436a80459a15ade74a9ec6e2a26da621d0ec
6.1.2、创建并启动
[root@docker ~]# docker create -it --restart=always docker.1ms.run/nginx:latest /bin/bash
f632952710d3c6db9ea8aaa94c9e1b74abdca0be0036b0c73f2848d04871be27
创建并启动(建议使用)
[root@docker ~]# docker run -it --restart=always -d docker.1ms.run/nginx:latest /bin/bash
6.1.3、创建并后台启动
[root@docker ~]# docker run -itd --restart=always docker.1ms.run/nginx:latest /bin/bash
8a10bdd16755b8fb4cdf3b383ca23054302dcb85c4cc0a308c5d3b6d76e4dea8
-i :标准输入输出
-t:分配一个终端或控制台
--restart=always: #当docker启动时容器也会随之启动 (docker启动时,容器是默认关闭的)
也适用于create选项
-d 后台运行容器,并返回容器ID;
6.1.4、创建容器、并启动容器,自定义容器名称
docker run -it --restart=always --name 自定义容器的名称 镜像名称:镜像版本/bin/bash
[root@docker ~]# docker run -it --restart=always --name nginx docker.1ms.run/nginx:latest /bin/bash
root@04ec01d5b87d:/#
如果你在执行docker run时没有指定--name,那么自动生成一个随机字符串UUID。这个UUID标识是由Docker deamon生成的。
6.1.5、创建容器、并开启容器端口给宿主机
docker run -it -p 宿主机端口:容器端口 镜像ID或者镜像名:版本号
docker run -it --name jenkins1 -p 8081:8080 jenkins:v1
#启动刚刚编辑好的容器,-it运行,容器取名jenkins1 -p 8081:8080 将访问宿主机的8081端口映射到容器的8080端口,jenkins:v1 使用jenkns镜像的v1版本
如果一开始没有映射端口,那么如何访问容器的端口呢?
第一种就是在宿主机查询出容器的ip,宿主机通过容器ip+端口访问。(临时)
第二种就是重新创建容器并映射端口
6.2、查看命令
6.2.1、查看运行容器的状态
docker ps
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04ec01d5b87d docker.1ms.run/nginx:latest "/docker-entrypoint.…" 6 minutes ago Up 1 second 80/tcp nginx
8a10bdd16755 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 9 minutes ago Up 9 minutes 80/tcp priceless_heyrovsky
7b9896cad565 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 21 minutes ago Up 12 minutes 80/tcp beautiful_khorana
6.2.2、查看所有容器状态
docker ps -a
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04ec01d5b87d docker.1ms.run/nginx:latest "/docker-entrypoint.…" 7 minutes ago Up About a minute 80/tcp nginx
8a10bdd16755 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 10 minutes ago Up 10 minutes 80/tcp priceless_heyrovsky
7b9896cad565 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 22 minutes ago Up 14 minutes 80/tcp beautiful_khorana
f632952710d3 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 25 minutes ago Created gifted_borg
47a16d927c17 docker.1ms.run/nginx:latest "/docker-entrypoint.…" 26 minutes ago Created funny_driscoll
6.2.3、仅显示已停止容器
[root@docker ~]# docker ps -f "status=exited"
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6.2.4、查看容器详细信息
inspect :用于查看容器的配置信息,包含容器名、环境变量、运行命令、主机配置、网络配置和数据卷配置等。
目标:查找某一个运行中容器的id,然后使用docker inspect命令查看容器的信息。
提示:可以使用容器id的前面部分,不需要完整的id。
docker inspect 容器名或容器ID #机器上运行的一个容器ID或者容器名称
[root@docker ~]# docker inspect nginx
6.2.5、查看容器消耗资源情况
前提是容器得启动,才能查看容器消耗资源的情况
docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
04ec01d5b87d nginx 0.00% 772KiB / 1.6GiB 0.05% 3.27kB / 126B 0B / 0B 1
8a10bdd16755 priceless_heyrovsky 0.00% 772KiB / 1.6GiB 0.05% 3.97kB / 126B 0B / 0B 1
7b9896cad565 beautiful_khorana 0.00% 768KiB / 1.6GiB 0.05% 4.36kB / 126B 0B / 0B 1
6.2.6、查看容器ip
docker inspect my-web
my-web 是容器名
6.3、断开容器(退出)
6.3.1、断开容器并关闭容器
exit
6.3.2、断开容器但不关闭容器
ctrl +p +q 建议关闭终端会话即可(我的mac无法如此)
6.4、启动、暂停、重启容器
6.4.1、启动容器
# docker start 容器名称或ID
[root@docker ~]# docker start nginx
nginx
6.4.2、关闭容器
docker stop 容器名或容器ID #关闭容器
[root@docker ~]# docker stop nginx
nginx
docker kill 容器名称或容器ID #强制关闭容器
[root@docker ~]# docker kill nginx
nginx
stop和kill的区别:
docker stop命令给容器中的进程发送SIGTERM信号,默认行为是会导致容器退出,当然,容器内程序可以捕获该信号并自行处理,例如可以选择忽略。而docker kill则是给容器的进程发送SIGKILL信号,该信号将会使容器必然退出。
6.4.3、强制关闭所有启动状态的容器
docker kill $(docker ps -q)
[root@docker ~]# docker kill $(docker ps -q)
8a10bdd16755
7b9896cad565
6.4.4、重启容器
docker restart 容器名或容器ID
[root@docker ~]# docker restart nginx
nginx
6.5、删除容器
6.5.1、删除容器
注意:删除容器的话要先stop容器才能删除,不然会报错
docker rm 容器id或容器名称
[root@docker ~]# docker rm nginx
nginx
6.5.2、强制删除容器
docker rm 容器id或容器名称 -f
[root@docker ~]# docker rm nginx -f
nginx
6.5.3、删除所有启动状态的容器
docker rm -f $(docker ps -q)
6.5.4、删除所有容器
注意:删除容器的话要先stop容器才能删除,不然会报错
docker rm $(docker ps -qf status=exited)
6.6、暂停容器内的进程(暂停容器)
暂停容器内所有的进程,但是不暂停容器
[root@docker ~]# docker pause nginx
nginx
恢复容器内的进程
[root@docker ~]# docker unpause nginx
nginx
6.7、让容器在后台运行
# docker run -itd 镜像ID /bin/bash
如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行
6.8、恢复容器在前台运行
docker attach 容器ID/容器名字
6.9、修改容器名称
docker rename 旧的名称 新的名称
[root@docker ~]# docker rename nginx nginx_new
6.10、连接容器
前提是容器得启动,才能连接的到
docker exec -it 容器id /bin/bash
[root@docker ~]# docker exec -it nginx_new /bin/bash
root@80afafece35f:/#
6.11、查看容器日志
docker logs -f nginx_new(nginx_new为容器名称)
6.12、查看容器进程信息
docker top nginx_new(nginx_new为容器名称)
[root@docker ~]# docker top nginx_new
UID PID PPID C STIME TTY TIME CMD
root 16005 15983 0 Feb26 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 16035 16005 0 Feb26 pts/0 00:00:00 nginx: worker process
101 16036 16005 0 Feb26 pts/0 00:00:00 nginx: worker process
6.13、wait查看退出码
wait:捕捉容器停止时的退出码
docker awit nginx_new
状态码:0表示正常退出 非0为异常 125是docker守护进程本身的错误
6.14、主机和容器直接互相COPY文件
6.14.1、容器里拷贝文件到主机
docker cp 容器名:拷贝文件路径 拷贝文件放主机路径
docker cp nginx_new:/tmp/abc.sh /root
[root@docker ~]# docker start nginx_new
nginx_new
[root@docker ~]# docker exec -it nginx_new /bin/bash
root@80afafece35f:/# cd /tmp/
root@80afafece35f:/tmp# touch abc.sh
root@80afafece35f:/tmp# exit
exit
[root@docker ~]# docker cp nginx_new:/tmp/abc.sh /root
Successfully copied 1.54kB to /root
[root@docker ~]# ls
1ms-helper.bin abc.sh Desktop Downloads linux.sh Pictures Templates
200 anaconda-ks.cfg Documents install-docker.sh Music Public Videos
6.14.2、主机里拷贝文件到容器内
docker cp 主机文件路径 容器名:/拷贝文件放置路径
docker cp /root/bbb.sh nginx_new:/tmp
[root@docker ~]# docker cp /root/bbb.sh nginx_new:/tmp
Successfully copied 1.54kB to nginx_new:/tmp
- 容器、镜像、打包、制作、迁移
7.1、容器打包、恢复
7.1.1、容器文件系统打包成镜像包
将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
类似一个静态文件目录打包,不包含镜像的元数据(如历史层、启动命令、环境变量等)
就是将更改后的容器导出成镜像包,跟虚拟机的快照一个意思,只不过这个镜像包是可以用在其他机器上。
7.1.2、语法一
docker export -o 自定义导出包的名称.tar 容器ID
[root@docker ~]# docker export -o ngingx_jx.tar 80afafece35f
7.1.3、语法二
docker export 容器名称 > 镜像.tar
[root@docker ~]# docker export nginx_new>ngingx_jx2.tar
7.1.4、镜像包导入恢复
就是将打包好的镜像包导入到本地的docker镜像库里
docker import 镜像包 自定义镜像名称:自定义版本
[root@docker ~]# docker import ngingx_jx.tar nginx:1.1
sha256:9659d81a794e1d572e32451a9d3c60cec6b80eb7a74560dce70e4f1ef46c826e
如果需要将镜像包发送到其他机器的话就直接scp将镜像包拷贝过去即可
7.2、通过容器创建本地镜像
容器运行起来后,又在里面做了一些操作,并且要把操作结果保存到镜像里
方案:
使用 docker commit 指令,把一个正在运行的容器,直接提交为一个镜像。
commit 是提交的意思,类似告诉svn服务器我要生成一个新的版本。
就是给容器拍摄一个快照,只不过拍的快照变成镜像而已
7.2.1、语法一
docker commit 容器ID 自定义镜像名:自定义版本
[root@docker ~]# docker commit b5acd4169785 nginx1.2
sha256:0ed04697b77b0ed17048a33f14c657bb0c6df52dc1aad4828d98e16d269eadd9
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx1.2 latest 0ed04697b77b 24 seconds ago 196MB
nginx 1.1 9659d81a794e 26 minutes ago 196MB
docker.1ms.run/nginx latest 678546cdd20c 3 weeks ago 197MB
nginx latest 678546cdd20c 3 weeks ago 197MB
注释
docker commit -m "my images version1" -a "soso" 108a85b1ed99 daocloud.io/ubuntu:v2
-m 添加注释
-a 作者
108a85b1ed99 容器环境id
daocloud.io/ubuntu:v2 镜像名称:hub的名称/镜像名称:tag
-p,–pause=true 提交时暂停容器运行
7.3、镜像打包、导入
7.3.1、镜像打包
完整镜像(包含所有层、元数据、标签等信息)
本地将镜像打包成镜像.tar包
语法:
docker save -o 镜像包名.tar 镜像名
[root@docker ~]# docker save -o nginx_jx1.jar nginx1.2:latest
7.3.2、镜像包导入
docker load < 镜像包名.tar
[root@docker ~]# docker load < nginx_jx1.jar
Loaded image: nginx1.2:latest
7.4、通过Dockerfile创建镜像(实操)
Docker 提供了一种更便捷的方式,叫作 Dockerfile
docker build命令用于根据给定的Dockerfile构建Docker镜像。(步骤可追溯)
Dockerfile就是你不用创建容器,运行Dockerfile文件后,文件里的配置会帮你自动配置好你想要的镜像,前提是你得在镜像里写配置的信息
编写 Dockerfile → 执行 docker build → 运行容器
7.4.1、docker build配置及说明
创建目录
[root@docker ~]# mkdir build_test
创建docker build文件
[root@docker ~]# cd build_test/
[root@docker build_test]# touch Dockerfile
编写docker bulid文件
# Dockerfile Comment
FROM nginx:1.1
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
语法 | 说明 |
FROM | 指定基础镜像(如 FROM ubuntu:22.04) |
WORKDIR | 设置容器内的工作目录(类似 cd) |
COPY | 复制宿主机文件到镜像中(如 COPY ./app /app) |
ADD | 类似 COPY,但支持自动解压或拉取远程 URL(慎用) |
RUN | 在镜像内执行命令(如安装依赖:RUN apt-get update && apt-get install -y nginx) |
ENV | 设置环境变量(如 ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk) |
EXPOSE | 声明容器运行时监听的端口(如 EXPOSE 80) |
CMD | 指定容器启动时的默认命令(只能有一个 CMD) |
ENTRYPOINT | 类似 CMD,但参数不会被覆盖(通常与 CMD 结合使用) |
7.4.2、创建测试页面
[root@docker build_test]# echo "<h1>Hello 这是测试页面</h1>" > index.html
7.4.3、docker build语法(构建镜像)
docker build 选项 生成镜像名:自定义版本 . #注意后面还有个点
. 表示的意思是当前目录下的所有文件
-t 表示指定镜像名称和标签
[root@docker build_test]# docker build -t my-nginx_test:1.0 .
2025/02/27 12:27:23 in: []string{}
2025/02/27 12:27:23 Parsed entitlements: []
[+] Building 0.2s (7/7) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 218B 0.0s
=> [internal] load metadata for docker.io/library/nginx:1.1 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 131B 0.0s
=> [1/2] FROM docker.io/library/nginx:1.1 0.0s
=> [2/2] COPY ./index.html /usr/share/nginx/html 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:a7abceb34399e7314ad53905040229c4c81db6bf9980714b47214ee7d1eb2924 0.0s
=> => naming to docker.io/library/my-nginx_test:1.0 0.0s
7.4.4、验证镜像
[root@docker build_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-nginx_test 1.0 a7abceb34399 40 seconds ago 196MB
nginx1.2 latest 0ed04697b77b 49 minutes ago 196MB
nginx 1.1 9659d81a794e About an hour ago 196MB
docker.1ms.run/nginx latest 678546cdd20c 3 weeks ago 197MB
nginx latest 678546cdd20c 3 weeks ago 197MB
7.4.5、运行容器
[root@docker build_test]# docker run -d -p 8080:80 --name my-web my-nginx_test:1.0
669762f7ce67a478333495dad889de5a35c75429ca6bf03839f139dfa714ccaf
7.4.6、效果验证
[root@docker build_test]# docker inspect my-web | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.4",
"IPAddress": "172.17.0.4",
[root@docker build_test]# curl 172.17.0.4
<h1>Hello 这是测试页面</h1>
7.4.7、扩展----CMD与ENTRYPOINT区别
一、dockerfile中的 CMD
1、每个dockerfile中只能有一个CMD如果有多个那么只执行最后一个。
2、CMD 相当于启动docker时候后面添加的参数看,举个简单例子:
# docker run -itd --name test image(镜像) /bin/bash -c
a、镜像名称后面跟了一个/bin/bash -c ,其实等价于在dockerfile中的CMD ["/bin/bash","-c"]。
b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在执行的时候再添加了,如果添加了参数的话那么就相当于要执行你添加的参数,默认的CMD中的参数就无效了。
二、dockerfile中的ENTRYPOINT
1、一个dockerfile中ENTRYPOINT也只能存在一个,若存在多个那么只执行最后一个,你可以理解为开机启动的意思,和CMD有点像,不过还是有区别。
2、举个简单例子:
a、dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么启动的时候镜像就执行了这个里面的内容,如果你像上面带参数的话就相当于在这个执行的内容后面再加入参数。
案例:
如果我们的dockerfile中有a中的这句话然后我们启动我们的docker:
#docker run -itd --name test image(镜像名) /bin/bash -c
此时就相当于我们启动docker的时候执行了:tail -f /var/log/nginx/access.log /bin/bash -c
这个命令明显就不对.
7.4.8、dockerfile优化
编译一个简单的nginx成功以后发现好几百M。
1、分离编译环境和运行环境,剔除无用依赖,大幅减小生产镜像体积。
2、每次进行依赖安装后,记得yum clean all【centos】
#yum clean all 清除缓存中的rpm头文件和包文件
3、选择比较小的基础镜像。alpine
4、合并 RUN 指令
5、配置写好后用ai工具让他给你再检查下是否还能再优化,善于利用AI工具