尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

轻松学习Docker容器的基础知识

发布时间:2026/9/3 16:14:47

资讯中心
01
ARTICLE

轻松学习Docker容器的基础知识

轻松学习Docker容器的基础知识
目录docker学习网站一.容器介绍1.1基本概念1.2容器的特点1.3容器的核心技术1.3.1Namespaces命名空间1.3.2Cgroups1.4容器与虚拟化二.部署Docker2.1简单介绍2.1.1基本概念2.1.2Docker的三大目标2.1.3Docker架构2.1.4工作机制2.2安装Docker三.docker的基本操作3.1镜像操作3.1.1搜索镜像3.1.2下载镜像3.1.3查看本地镜像仓库3.1.4复制镜像文件3.1.5删除镜像文件3.1.6打包镜像文件tar包3.1.7加载镜像文件tar包3.1.8查看镜像文件的信息3.2容器操作3.2.1查看容器列表3.2.2运行容器3.2.3创建容器3.2.4开启容器3.2.5停止容器3.2.6删除容器3.2.7暂停容器3.2.8恢复容器3.2.9查看容器的详细信息3.2.10查看容器日志3.2.11以交互方式进入容器3.3示例四.构建镜像文件4.1简单介绍4.2手动构建镜像文件4.3通过文件构建镜像文件4.4比较两种方式的不同点4.6镜像文件优化4.6.1准备工作4.6.2第一版4.6.2第二版4.6.3第三版4.6.4第四版docker学习网站Docker 文档https://docs.docker.top/index.htm说明这里我找到一个可以直接访问的docker学习网站可以提供给大家学习一.容器介绍1.1基本概念沙箱一种使软件运行在受限制的系统环境中的技术能够有效预防外来黑客通过该软件对我们系统的破环。容器简介容器可以说是一种沙箱技术就是将你的应用封装到一个集装箱的技术。它的核心功能就是两个隔离和搬用。容器与容器之间的相互隔离就是应用与应用之间的相互隔离互不干扰。同时容器也可以被轻松的搬用到其他虚拟机上使用。容器的核心技术共享操作系统的内核。Linux容器Linux容器本质上就是一个系统上运行的进程只不过有意思的点在于它会与系统中的其他服务进程隔离起来。它运行时所需的镜像文件除了系统内核也由自己内容的镜像文件支持与系统的镜像文件无关。因此它很方便被移植到其他系统上使用具备可移植性和一致性。软件容器容器本身是一种虚拟化的技术用于封装应用服务的软件包及其它的所有依赖和配置以便它能够在其他系统上能够正常工作。而软件容器会提供一种轻量级、一致性的运行环境确保在开发、测试和部署时有很好的可移植性1.2容器的特点跨平台性容器可以在不同的操作系统和云平台上使用同时确保应用环境的一致性。一致性和可重复性容器封装了应用服务及其所有依赖和配置文件确保了开发和测试时一致的运行环境。同时容器封装的应用服务支持多次重复部署避免不同环境导致的问题。资源隔离 容器提供了一定程度的隔离性使得多个容器可以在同一主机上并行运行而互不干扰。这种隔离性能够确保应用程序的稳定性和安全性。快速部署和启动 容器可以在几秒钟内启动启动时间更短。高可伸缩性容器架构支持自动化的横向扩展可以根据需求动态地增加或减少容器实例。这种高可伸缩性使得应用程序能够更好地应对流量和负载的变化。环境隔离 容器提供了独立的运行环境每个容器都有自己的文件系统、网络和进程空间。这种环境隔离有助于防止应用程序之间的相互影响提高了系统的稳定性和安全性。资源效率容器共享主机操作系统的内核相比虚拟机容器更加轻量级更加节省系统资源。持续集成和持续部署CI/CD 容器与持续集成和持续部署工具集成紧密使得开发团队能够更容易地实现自动化构建、测试和部署流程1.3容器的核心技术说明Namespaces的作用是隔离它让容器只能看见自己内部的资源而不干扰外部系统和其他容器的使用。Cgroups的作用是限制它让容器只能使用已经分配好的资源没办法无限制的使用系统资源。1.3.1Namespaces命名空间说明命名空间Linux 内核提供的一种“资源隔离”功能。它的作用是为进程打造一个独立的“虚拟小世界”。当有多个不同类型的命名空间被部署在同一个虚拟机时各个docker容器之间独立运行却共用同一个宿主机的内核。他们受docker主进程管理但进程树上属于独立的进程。每个容器都类似虚拟机一样拥有相互隔离的运行空间不同的是容器是在一个进程内搭建指定服务的运行环境同时不干扰主机的其他进程运行。1.基本概念基本概念只提供进程、文件系统和网络等资源的隔离确保容器运行时只会操作自己的服务进 程而不干扰容器外的进程运行。例如命名空间可以提供一个进程相互隔离的独立网络空间不同的容器间进程PID可以相同进程并不冲突影响但可以共享底层的计算和存储资源2.MNT Namespace——文件系统隔离基本概念每个容器都必须拥有一个根文件系统同时拥有一个用户空间应用服务在容器内部的用户空间中启动并在容器内部的环境中运行。例如一个ubuntu环境下部署了一个基于centos环境的nginx服务。在nginx服务启动时是运行在centos的环境下与ubuntu环境无关。它只是会调用ubuntu的系统内核而ubuntu和centos的内核都是Linux所以不会影响服务的正常运行。3. UTS Namespaces——主机名标识隔离基本概念包含操作系统内核的基本信息用于系统标识。如主机名内核名称等。它能够使每个容器拥有一个自己的主机名标识这个主机名标识独立于宿主机系统和其他容器。4. NET Namespaces——网络和端口隔离基本概念每个容器都有一个Vthex接口通过这个接口拥有自己的网络IP和端口容器内的端口和IP占用并不影响宿主机和其他容器的端口和IP的使用。5. PID Namespaces——进程隔离基本概念每个容器中都有一个独立的父进程PID1负责用来收养孤儿进程和僵尸进程同时容器内的进程只能看到该 Namespace 内的 PID 列表看不到宿主机或其他容器的 PID实现进程隔离。因此每个容器中都可以有相同的PID号6. User Namespaces——用户隔离基本概念每个容器内都可以拥有相同的用户uid和用户组gid他们之间互不冲突。只是用户仅会在当前的容器内存在和使用。1.3.2Cgroups说明Cgorups是Linux内核中的一个功能它的核心作用是完成限制、用户和管理进程组。Cgroups实现了对系统资源如CPU、I/O、内存、磁盘等的精细控制它允许系统管理员对一个进程的资源分配和限制该进程无法无限制地使用系统资源。容器本质上就是一个进程因此Cgroups也能够实现对容器的资源分配和限制。总的来说Cgroups能够限制一个进程使用资源的最大上限还能完成进程的优先级设置数量统计和资源控制等等。1.4容器与虚拟化1.传统虚拟化虚拟化其实就是在一个操作系统上运行另一个操作系统。通过软件模拟一个虚拟的电脑创造一个与主机完全隔离的环境将操作系统本身所需要的硬件全都虚拟出来的。例如我们在windows上使用VM软件运行Linux操作系统。虚拟化本身不会对主机的操作系统有任何影响因为它实质上就是一堆文件如果不需要删除即可。这套虚拟技术能够很好的让虚拟的操作系统运行应用服务而不会影响主机 操作系统的正常运行。缺点占用主机的资源较多启动时间长冗余步骤多2.容器容器的最大特征就是它并不是做到与主机的完全隔离而是一个进程的隔离。事实上它在运行时还是会依赖主机的内核资源。在容器中它会将软件运行所需的所有资源镜像文件、软件依赖包等全部打包在一个隔离的容器中。运行容器时只需要软件资源库和相关设置。因此部署变得高效且稳定。3.虚拟化与容器的不同之处虚拟化其实就是虚拟出一个完整的操作系统拥有自己的内核和硬件资源其中包含内存、CPU、硬盘等等。在这个操作系统上运行自己的服务进程。而容器并没有自己独立的内核和硬件资源它的内部只有一些文件运行服务时在容器内部运行进程。因此效率更高启动更快。对于系统来说容器只是系统中的一个进程。二.部署Docker2.1简单介绍2.1.1基本概念说明Docker是一款平台即服务的产品。它基于操作系统层的虚拟化技术将软件及其依赖项打包成容器的镜像文件。托管容器的产品名称Docker引擎。Docker能够帮助开发者在轻量级的容器中自动部署应用服务并使得不同容器之间的产品服务相互隔离从而高效工作。同时开发人员也可以将自己的软件打包成标准单元上传到Docker仓库中用于开发搬运和测试等工作。Docker将软件应用及其依赖文件全部打包到一个容器内以便一个应用程序能够从一个计算机资源快速在另外一个计算资源中运行。总的来说Docker容器镜像是一个轻量级的、独立的可执行软件包里面包含了运行程序所需的所有东西代码、运行环境、系统工具等等。容器镜像在运行时会变成容器服务。2.1.2Docker的三大目标Docker的三大目标build(构建)、ship传输、run (运行)。1.build构建docker build做一个完整的镜像文件方式手动构建和文件构建。2.ship传输docker pull或docker push即将构建的镜像文件上传到docker仓库中或者从docker仓库中下载容器镜像3.run运行docker run运行容器镜像文件从镜像文件变成容器进程。2.1.3Docker架构1.Docker Client客户端用户与Docker系统进行交互的接口用户通过CLI命令如docker run,docker build,docker pull等与 Docker守护进程通信发出管理容器的各种指令。2.Dockerd Docker 守护进程也称docker Engine他是docker 的核心部分负责处理docker client的请求管理 docker 的容器镜像、运行、网络和数据卷等等并将请求传递给下一级组件如Containerd。3.Containerd容器运行时负责管理容器的整个生理周期。包括容器的创建、执行、挂载等等。通过 gRPC接收 Docker的指令并进一步传递给 Runc和 Shim。生命周期启动、停止和删除容器镜像管理构建、拉取和上传容器镜像资源管理容器运行的资源限制日志管理处理容器的日志输出4.Runc:Runc是一个CLI工具负责容器的底层启动操作。通过fork进程创建容器containerd调用runc并确保Docker镜像以OCI标准的格式交给runc。5.Shim:Shim是一个中介程序在容器与Containerd之间进行隔离。当Runc启动完程序后shim会将Runc从系统中分离出来接管服务保持服务运行。如果Containerd重启或者崩溃掉容器仍然可以继续运行充当服务的父进程。作为父进程的shim负责管理容器与容器之间的通信。当应用服务结束后Shim负责接收容器的退出状态并清理资源。在Docker中shim的作用是让容器独立于Dockerd使得容器的运行更加稳定。2.1.4工作机制正常的docker服务运行流程如下说明由于Docker官方不允许我们直接访问docker官网因此我们需要借助代理去访问它。docker的工作流程就繁琐了需要我们借助代理在官网上下载它的镜像文件。之后再去运行它。2.2安装Docker1.前往阿里云官方镜像网站下载docker-ce软件源仓库说明由于dokcer官方不允许我们直接访问它因此我们需要配置阿里云源去安装docker官方镜像网站阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区https://developer.aliyun.com/mirror/1.1在搜索栏搜索docker进入docker-ce1.2找到软件源仓库地址复制它1.3使用wget命令下载软件仓库并指定安装位置(/etc/yum.repos.d)wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/ yum update #刷新yum软件仓库观察是否成功加入2.安装docker软件包说明docker中含有两个版本 社区版ce) 和 企业版ee其中社区版是免费的有开源代码和强大的社区企业版提供额外的安全性同时具备更多功能但需要付费使用yum install -y docker-ce3.添加docker.conf配置文件可选说明如果不做该操作在docker初始化时会出现以下警报3.1查看并列出所有与IP转发有关的内核配置说明默认情况下IP转发的所有功能都是关闭的需要我们手动去设置它sysctl -a | grep ip_forward #查看IP转发功能状态 sysctl -a | grep iptables #查看ipv4的iptables防火墙状态 sysctl -a | grep ip6tables ##查看ipv6的流量转发iptables防火墙状态3.3开启IP转发功能echo net.ipv4.ip_forward 1 /etc/sysctl.d/docker.conf ##启用 Linux 内核的 IP 数据包转发功能说明容器默认使用的是bridge模式有着自己的网段。如果不启用转发功能数据包就无法传递到外网上。3.4设置Linux流量转发时经过 iptablesecho net.bridge-nf-call-iptables 1 /etc/sysctl.d/docker.conf # 让经过 Linux 网桥Bridge的流量也经过 iptables 的 FORWARD 链 echo net.bridge-nf-call-ip6tables 1 /etc/sysctl.d/docker.conf #针对ipv6,让经过 Linux 网桥Bridge的流量也经过 iptables 的 FORWARD 链说明设置这个功能能够确保流量经过虚拟网桥时也能经过iptables的forward链。Docker 利用 iptables 来实现端口映射-p、网络隔离和NAT 地址转换3.5刷新内核参数sysctl --system4. 启动docker服务并设置开机自启systemctl enable --now docker5.完成docker初始化docker info说明不存在 docker.sock文件一般是在初始化前没有启动docker服务产生的问题解决方法systemctl restart docker #重新启动docker三.docker的基本操作说明官方的docker平台我们无法直接流畅地访问因此我们需要借助代理来访问。这里我推荐一个1ms1毫秒有免费和付费两种。免费能够访问但速度较慢付费版每月有定额高速访问流量。直接访问Docker平台yum search 镜像文件 #搜索镜像文件说明直接搜索Docker平台上的镜像文件连接会被拒绝借助代理访问Docker平台yum search docker.1ms.run/镜像文件 #借助docker.1ms.run代理访问Docker平台3.1镜像操作3.1.1搜索镜像yum search docker.1ms.run/镜像文件 #借助docker.1ms.run代理访问Docker平台说明搜索时除了官方镜像也会搜索到其他人自己的镜像需要做些区分3.1.2下载镜像yum pull docker.1ms.run/镜像文件:tag #借助docker.1ms.run代理访问Docker平台说明tag是指镜像文件的标签如果在下载时不加标签默认直接下载标签为lagest的镜像文件。此外使用代理下载的镜像文件文件前面一般会多出代理的名称3.1.3查看本地镜像仓库docker images说明查看本地镜像仓库里的所有镜像文件时本地操作所以不需要借助代理。参数说明REPOSITORY镜像文件名称TAG标签IMAGE_ID镜像文件IDCREATED创建时间SIZE文件大小3.1.4复制镜像文件docker tag 源镜像文件名称:tag 新镜像文件名称:tag说明该方式复制了一份新的镜像文件之后我们可以删除源镜像文件从而实现镜像文件的重命名3.1.5删除镜像文件docker rmi 镜像文件名称3.1.6打包镜像文件tar包docker save -o 打包名称 镜像文件3.1.7加载镜像文件tar包docker load -i 镜像文件的tar包3.1.8查看镜像文件的信息1.查看镜像文件的构造历史和分层docker history 镜像文件2.查看镜像的详细信息docker image inspect 镜像文件参数--format筛选信息3.2容器操作3.2.1查看容器列表docker ps [参数]参数-a展示所有容器列表包括正在运行和已经停止的容器不加-a,无法查看已经停止的容器。3.2.2运行容器docker run [参数] 镜像文件:tag #不写tag默认为latest参数--name为这个容器命名每一个容器的名称都是唯一的无法共享如果不加这个参数系统为自动为这个容器命名-p端口映射将本机上的端口映射成容器中的服务端口-d后台运行容器防止占用当前端口不加-d它会持续占用桌面使用 ctrl c,退出它测试直接访问本机的80端口无法直接访问到容器中的服务访问本机的8080端口容器中docker会将端口映射成80端口访问3.2.3创建容器说明仅创建一个容器但不运行它,需要我们手动启动它docker create 镜像文件3.2.4开启容器说明开启容器与启动容器不同。开启容器是将已经停止了的容器启动起来运行容器是将原先没有的容器启动起来。容器ID可以通过docker ps 查看docker start 容器ID/容器名称3.2.5停止容器说明容器停止并不代表已经被删除。在容器未被删除前无法创建与它同名的容器。同时已经停止的容器也可以通过start命令重新启动它。容器ID可以通过docker ps 查看1.温柔的停止容器终止信号。礼貌地告诉进程“请终止”进程可以捕获此信号并执行清理逻辑docker stop 容器ID/容器名称一次性停止所有容器docker stop $(docker ps -aq)测试在停止该容器的情况下创建一个新的同名容器有如下报错2.强制停止容器强制杀死信号。进程无法捕获或忽略此信号操作系统会直接回收该进程的资源。docker kill 容器ID/容器名称3.2.6删除容器说明之前说过停止容器不表示删除容器。在停止容器之后我们需要使用删除指令彻底删除该容器。docker rm 容器ID/容器名称一次性删除全部容器说明筛选出所有容器的ID一次性全部删除docker rm $(docker ps -aq)测试已经运行的容器无法直接删除需要加-f参数强制删除不加-f加-f3.2.7暂停容器docker pause 容器ID/容器名称3.2.8恢复容器docker unpause 容器ID/容器名称3.2.9查看容器的详细信息docker inspect 容器名称/容器ID参数--format筛选信息3.2.10查看容器日志说明容器日志能够在容器未正常启动时查看它的历史日志信息。日志需要在shell上输出出来才能够被docker api捕捉到并在命令窗口显示出来。存储位置/var/lib/docker/containers/容器IDdocker logs 容器ID/容器名称3.2.11以交互方式进入容器docker exec -it 容器名称/容器ID /bin/bash 或者 /sh退出操作ctrl d直接退出容器和停止容器服务ctrl p q仅退出容器内部容器服务依旧运行3.3示例3.3.1.成功运行一个小游戏容器1.搜索镜像docker search docker.1ms.run/yakexi0072.下载镜像docker pull docker.1ms.run/yakexi007/game2048 docker images #查看镜像仓库3.运行容器docker run -d --name game -p 80:80 docker.1ms.run/yakexi007/game20484.在浏览器上搜索本机IP3.3.2运行mysql服务1.加载mysql.tar包docker load -i mysql.tar2.运行容器说明这里只是启动mysql 服务后面我们还需要一个mysql客户端去访问它docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORDredat --name dbserver mysql3.安装mariadbyum install -y mariadb4.访问数据库mysql -h 127.0.0.1 -predat说明如果不指定主机mysql会找不到指定的socket文件四.构建镜像文件4.1简单介绍说明:构建镜像文件,主要分为两种方式,一种是手动方式,一种是文件方式。4.2手动构建镜像文件说明通过运行一个基础容器在里面手动执行命令安装软件、修改配置最后将修改后的容器“保存”为一个新镜像操作步骤1.启动一个基础容器并进入交互终端2.在容器终端内进行各种手动操作3.退出容器后执行docker commit将容器的当前状态保存为新镜像。核心操作命令docker commit 容器名称/ID 镜像文件自命名示例创建三个普通文件复制本机文件到容器中打包成一个镜像文件1.下载busybox镜像说明BusyBox 是一个“超级压缩的百宝箱”把一个完整 Linux 系统最常用的 300 多个命令全部塞进了一个仅有 1~2 MB 大小的单一文件中。方便我们用来测试。docker pull docker.1ms.run/busybox2.运行并进入busybox内部说明在容器内部创建三个文件并保持服务状态运行的情况下退出容器内部docker run --name demo -it docker.1ms.run/busybox touch file1 file2 file33.将本机的文件复制到容器内部docker cp os.sql demo:/4.封装成镜像文件docker commit -m add os.sql demo demo:v1参数-m备注镜像文件信息5.运行容器查看容器内部的文件情况docker run -it --name test demo:v14.3通过文件构建镜像文件说明编写一个名为Dockerfile的文本文件在里面逐条写明构建镜像所需的每一条指令基础镜像、依赖安装、文件复制、启动命令等然后通过docker build命令自动构建。操作步骤1.创建一个Dockerfile文件。2.按格式编写构建指令。3.在Dockerfile所在目录执行docker build命令。核心操作命令docker build -t 镜像文件自命名 .(Dockfile文件所在目录)参数-t为这个新的镜像文件起一个名字示例创建三个普通文件复制本机文件到容器中打包成一个镜像文件1.创建一个目录进入后创建一个Dockerfile文件mkdir Docker cd Docker touch Dockerfile touch os.sql #充当复制的源文件2.编写Dockfile文件vim Dockerfile内容如下FROM docker.1ms.run/busybox #引入busybox镜像 RUN touch file1 file2 file3 #创建三个普通文件 COPY os.sql / #把当前目录下的os.sql文件,复制到镜像文件的根目录/下3.构成镜像文件docker build -t demo:v2 . docker images4.测试:运行镜像文件查看容器内部是否含有文件4.4比较两种方式的不同点1.手动方式操作较为繁琐建议直接通过Dockfile文件一步生成镜像文件2.两种方式的信息不同在使用docker history中手动方式看不到具体的实现过程文件可以看到更加安全可靠手动创建镜像docker history demo:v1文件创建镜像docker history demo:v24.6镜像文件优化常见方法如下1.选择最精简的基础镜像2.减少镜像的层数压缩步骤3.清理镜像构建的中间产物例如压缩包4.注意优化网络请求5.多用构建缓存6.使用多阶段构建镜像下面我会从零使用源码编译nginx提前将nginx源包放到目录下4.6.1准备工作1.创建工作目录mkdir nginx cd nginx2.上传centos 7的镜像压缩包和nginx的源码包到当前目录下3.将本机的软件源仓库复制到这里用来充当容器的软件源仓库cp /etc/yum.repos.d/CentOS-Base.repo .4.加载centos7镜像文件到本地镜像文件仓库docker load -i centos7.tar4.6.2第一版1.编写Dockerfilevim Dockerfile内容如下FROM centos:7 #引入centos 7镜像 RUN rm -f /etc/yum.repos.d/*.repo #删除原有源 COPY CentOS-Base.repo /etc/yum.repos.d/ #添加新源 RUN yum install -y gcc make pcre-devel openssl-devel #安装依赖 ADD nginx-1.30.4.tar.gz /mnt/ #添加nginx的源码包并解压到/mnt目录下 WORKDIR /mnt/nginx-1.30.4 #cd /mnt/nginx-1.30.4 RUN sed -i s/CFLAGS$CFLAGS -g/#CFLAGS$CFLAGS -g/g auto/cc/gcc #注释掉 gcc 编译器的调试选项 -g减小编译出的二进制文件体积 RUN ./configure --with-http_ssl_module --with-http_stub_status_module #添加功能模块检查配置文件 RUN make #生成makefile文件 RUN make install #完成编译 EXPOSE 80 #暴露80端口 CMD [/usr/local/nginx/sbin/nginx,-g,daemon off;] #前台运行nginx2.构建镜像文件docker build -t nginx:v1 .3.运行容器观察服务是否启动docker run -d --name web1 -p 80:80 nginx:v1 curl localhost注意由于我们没有更改日志的输出位置所以使用docker logs 无法直接捕捉到日志如以下情况解决办法修改nginx.conf文件更改输出位置将日志输出到终端上1.复制nginx.conf文件docker cp web1:/usr/local/nginx/conf/nginx.conf .2.修改文件内容vim nginx.conf内容如下error_log /dev/stderr notice; #将错误日志输出到终端 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; access_log /dev/stdout main; #将访问日志输出到终端3.在Dockerfile中修改容器中的nginx.conf文件COPY nginx.conf /usr/local/nginx/conf4.测试docker logs web14.6.2第二版优化方式减少镜像层数清理镜像中的产物1.修改Dockerfile文件内容说明将多个RUN合并在一起同时清理掉与源码目录FROM centos:7 RUN rm -f /etc/yum.repos.d/*.repo COPY CentOS-Base.repo /etc/yum.repos.d/ ADD nginx-1.30.4.tar.gz /mnt/ WORKDIR /mnt/nginx-1.30.4 RUN yum install -y gcc make prce-devel openssl-devel sed -i s/CFLAGS$CFLAGS -g/#CFLAGS$CFLAGS -g/g auto/cc/gcc ./configure --with-http_ssl_module --with-http_stub_status_module make make install cd .. rm -fr nginx-1.30.4 yum clean all #将多个RUN合并在一起同时清理掉与源码目录 RUN yum remove -y gcc make pcre-devel openssl-devel COPY nginx.conf /usr/local/nginx/conf/ EXPOSE 80 CMD [/usr/local/nginx/sbin/nginx,-g,daemon off;]2.生成镜像文件docker build -t nginx:v2 .3.运行容器测试效果并查看镜像大小docker run --name web1 -d -p 80:80 nginx:v2 curl localhost #能看到页面说明功能正常 docker logs web1 docker images4.6.3第三版说明引入两个CentOS 7镜像文件一个镜像专门用来构建环境另一个作为实际的镜像文件将上一个镜像文件生成的 nginx服务和它的依赖文件全部拷到这个新的镜像文件上能够大幅减少空间大小。1.修改Dockerfile文件内容如下FROM centos:7 as build #搭建镜像文件环境用来生成nginx服务和它的依赖文件 RUN rm -f /etc/yum.repos.d/*.repo COPY CentOS-Base.repo /etc/yum.repos.d/ ADD nginx-1.30.4.tar.gz /mnt/ WORKDIR /mnt/nginx-1.30.4 RUN yum install -y gcc make prce-devel openssl-devel sed -i s/CFLAGS$CFLAGS -g/#CFLAGS$CFLAGS -g/g auto/cc/gcc ./configure --with-http_ssl_module --with-http_stub_status_module make make install cd .. rm -fr nginx-1.30.4 yum clean all RUN yum remove -y gcc make pcre-devel openssl-devel COPY nginx.conf /usr/local/nginx/conf/ FROM centos:7 #实际的镜像文件 COPY --frombuild /usr/local/nginx /usr/local/nginx #将最后的结果nginx的服务程序和依赖文件转移到这个文件中 EXPOSE 80 CMD [/usr/local/nginx/sbin/nginx,-g,daemon off;]2.生成镜像文件docker build -t nginx:v3 .3.运行容器测试效果并查看镜像大小docker run --name web1 -d -p 80:80 nginx:v3 curl localhost #能看到页面说明功能正常 docker logs web1 docker images4.6.4第四版说明这里直接调用官方的nginx镜像文件作为地基同时引入一个最精简的基础环境镜像文件构建一个新的镜像文件。简单理解就是把别人搭建好的nginx程序服务复制到一个最精简的系统环境上去运行。1.引入debain镜像文件docker load -i base-debian12.tar2.修改镜像文件内容如下FROM nginx:latest as base RUN mkdir -p /opt/var/cache/nginx \ cp -a --parents /usr/lib/nginx /opt \ cp -a --parents /usr/share/nginx /opt \ cp -a --parents /var/log/nginx /opt \ cp -aL --parents /var/run /opt \ cp -a --parents /etc/nginx /opt \ cp -a --parents /etc/passwd /opt \ cp -a --parents /etc/group /opt \ cp -a --parents /usr/sbin/nginx /opt \ cp -a --parents /usr/sbin/nginx-debug /opt \ cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt \ cp -a --parents /usr/lib/x86_64-linux-gnu/libpcre* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libc* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt \ cp -a --parents /lib/x86_64-linux-gnu/libzstd* /opt \ cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt \ cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt FROM gcr.io/distroless/base-debian12:latest COPY --frombase /opt / EXPOSE 80 443 ENTRYPOINT [nginx, -g, daemon off;]3.构建镜像文件docker build -t nginx:v4 .4.运行容器测试效果并查看镜像大小docker run --name web1 -d -p 80:80 nginx:v4 curl localhost #能看到页面说明功能正常 docker logs web1 docker images
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。