十大网站建设公司,wordpress文章无法访问,大宗商品交易平台是什么,百度指数数据官网文章目录 容器介绍#xff0c;容器工作机制、容器常用命令说明容器网络容器网络简介容器常用网络类型 - Bridge容器常用网络类型 - Host容器常用网络类型 - None其他容器网络类型【Macvlan、Overlay、IPvlan】容器网络相关配置 容器存储容器中应用数据的存储容器持久化存储配置… 文章目录 容器介绍容器工作机制、容器常用命令说明容器网络容器网络简介容器常用网络类型 - Bridge容器常用网络类型 - Host容器常用网络类型 - None其他容器网络类型【Macvlan、Overlay、IPvlan】容器网络相关配置 容器存储容器中应用数据的存储容器持久化存储配置修改容器持久化存储删除容器持久化存储容器镜像容器镜像说明容器镜像分层结构容器copy-on-write特性UnionFS联合文件系统AUFS简介OverlayFS简介OverlayFS简介Registry容器镜像命名格式查看镜像拉取容器镜像拉取公共镜像拉去私有镜像 推送容器镜像打包和解压容器镜像删除容器镜像制作镜像方式1使用Dockerfile制作镜像方式2使用命令docker commit Dockerfile详述Dockerfile简介Dockerfile结构Dockerfile基础镜像Dockerfile镜像描述信息Dockerfile构建容器指令 - RUNDockerfile构建容器指令 - COPYDockerfile构建容器指令 - ADDDockerfile构建容器指令 - WORKDIRDockerfile构建容器指令 - ENVDockerfile构建容器指令 - EXPOSEDockerfile构建容器指令 - VOLUMEDockerfile设置镜像启动时执行任务的命令 - CMDDockerfile设置镜像启动时执行任务的命令 - ENTRYPOINTDockerfile建议Dockerfile优化案例 缩略语 容器介绍容器工作机制、容器常用命令说明
下面这篇文章 【hcie-cloud】【20】容器详解【容器介绍容器工作机制、容器常用命令说明】【上】
容器网络
容器网络简介
容器的网络实现有两种方式 第一种是容器引擎使用自带的网络子系统使用可插拔的网络驱动实现网络功能如docker第二种是容器引擎没有网络子系统需使用第三方的网络插件来实现各种网络功能如Containerd、iSula等docker也支持使用第三方的网络插件 常见的第三方网络插件有flannel、calico等在容器编排的场景中强烈推荐使用第三方网络插件由容器编排应用统一进行调度管理第三方的网络插件如flannel、calico等将放在容器编排中介绍本小节重点介绍各个网络功能的实现原理及使用场景
容器常用网络类型 - Bridge
Bridge是docker默认的网络类型连接在相同bridge上的容器及宿主机可以相互通信相反连接在不同bridge的容器不能直接通信 Bridge打通容器和宿主机之间的网络本质是添加了对应的iptables条目进行了NAT转换
容器常用网络类型 - Host
Host网络类型中容器共享宿主机的网络及接口这意味着容器的网络配置和宿主机是一样的 使用host网络类型的容器在转发性能方面可以得到最大的发挥但是容器之间的隔离性不好而且如果容器中的业务使用相同的端口会造成冲突而导致容器下线
容器常用网络类型 - None
None网络类型中容器中仅有loopback接口无法与外界进行通信 如果需要将容器彻底和外界进行隔离例如在容器中观察某个病毒程序的运行等场景那么将其网络类型设置为none
其他容器网络类型【Macvlan、Overlay、IPvlan】
Macvlan Macvlan网络类型中允许用户为容器指定mac地址可使其不需要bridge像一个物理网卡一样直接连接到真实的网络环境中Overlay Overlay类型的网络插件可以在多个宿主机上创建分布式网络使运行在它们上面的容器使用进行互相通信。容器编排中常使用overlay网络Ipvlan Ipvlan网络类型中用户可以完全控制基于IPv4和IPv6的网络寻址Macvlan网络类型中容器之间像物理网卡一样相互之间没有隔离一旦容器的数量比较庞大则会造成广播风暴占用大量的网络带宽单机场景中一般不是用overlay有bridge基本可以实现大部分功能IPvlan是经过考验的真正网络虚拟化技术的一个新的转折。Linux实现非常轻量级因为它们不是使用传统的Linux网桥进行隔离而是与Linux以太网接口或子接口相关联以强制网络之间的分离和与物理网络的连接。
容器网络相关配置
命令docker network ls可列出当前网络类型
[rootlocalhost etc]# docker network ls
NETWORK ID NAME DRIVER SCOPE
de9318b2d1fc bridge bridge local
eff3707e730d host host local
44e296e50379 none null local命令docker network create可创建一个新的网络
[rootlocalhost etc]# docker network create -d macvlan test
78cfffc0e65c80ba378994f533a4b15bfd272768f6943cf5d05a56e3a0dd75e0
[rootlocalhost etc]# docker network ls
NETWORK ID NAME DRIVER SCOPE
de9318b2d1fc bridge bridge local
eff3707e730d host host local
44e296e50379 none null local
78cfffc0e65c test macvlan local命令docker network create可以指定网络的类型还可以使用--subnet选项指定该网络的网段--gateway选项指定该网络的网关更多选项及其功能可使用help命令进行查看 命令docker network inspect NetworkName可查看网络的详细信息
[rootlocalhost etc]# docker network inspect test
[{Name: test,Id: 78cfffc0e65c80ba378994f533a4b15bfd272768f6943cf5d05a56e3a0dd75e0,Created: 2022-04-20T02:14:23.608005889-04:00,Scope: local,Driver: macvlan,EnableIPv6: false,
...........Ingress: false,ConfigFrom: {Network: },ConfigOnly: false,Containers: {},Options: {},Labels: {}}
]创建和运行容器时使用--network选项可为容器指定使用的网络例如命令docker run --network test -d busybox sleep 3600可为容器设置其使用名称为test的网络
[rootlocalhost etc]# docker run --network test -d busybox sleep 3600
[rootlocalhost etc]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9bba594e156 busybox sleep 3600 57 seconds ago Up 56 seconds sharp_robinson
[rootlocalhost etc]# docker inspect sharp_robinson | grep -A 5 testNetworkMode: test,PortBindings: {},RestartPolicy: {Name: no,MaximumRetryCount: 0},
--test: {IPAMConfig: null,Links: null,Aliases: [d9bba594e156],容器存储
容器中应用数据的存储 对容器中数据的修改仅保存在临时读写层无法进行永久存储一旦容器被删除这些数据就会同时被删除 如果需要将容器产生的数据做持久化保存有两种方式实现 将宿主机的文件或目录挂载给容器产生的数据保存在宿主机上使用第三方存储插件 容器停止时临时读写层的数据不会被删除只有容器被删除时这些数据才会被删除 在容器编排章节重点介绍第三方存储插件被章节主要介绍第一种方式
容器持久化存储配置
创建和运行容器时使用-v选项可将宿主机的指定文件或目录挂载到容器中-v参数可多次使用用来挂载多个文件或目录到容器中挂载后的文件或目录会覆盖掉容器中原来的文件或目录例如docker run -d -v /root/index.html:/usr/share/nginx/html/index.html nginx:1.21 将宿主机上的/root/index.html文件挂载给了容器的/usr/share/nginx/html/index.html
[rootlocalhost ~]# echo hello CCE index.html
[rootlocalhost ~]# docker run -d -v /root/index.html:/usr/share/nginx/html/index.html nginx:1.21
E5517b6737cf405c47969cc6d9bfe96b0798ce351e90eebbf235e7a2babe9221
[rootlocalhost ~]# docker inspect e5 | grep IPAddressSecondaryIPAddresses: null,IPAddress: 172.17.0.2,IPAddress: 172.17.0.2,
[rootlocalhost ~]# curl 172.17.0.2:80
hello CCE-v选项挂载宿主机文件或目录到容器时可以设置容器对挂载后的数据的权限 -ro容器对挂载后的数据有仅读权限-rw默认权限表示容器对挂载后的数据有读写权限 例如在命令docker run -d -v /root/index.html:/usr/share/nginx/html/index.html:rw -v /etc/localtime:/etc/localtime:ro nginx:1.21中/root/index.html可以被容器读写/etc/localtime容器仅有读取权限
[rootlocalhost ~]# echo hello CCE index.html
[rootlocalhost ~]# docker run -d -v /root/index.html:/usr/share/nginx/html/index.html:rw -v /etc/localtime:/etc/localtime:ro nginx:1.21
67d3926b4efc8dcd8e4160cf6f5260ff06f81b1b3a402e8c0d3723de4ec34eac
root67d3926b4efc:/# echo hello CCE again /usr/share/nginx/html/index.html
root67d3926b4efc:/# cat /usr/share/nginx/html/index.html
hello CCE
hello CCE again
root67d3926b4efc:/# echo hello CCE again /etc/localtime
bash: /etc/localtime: Read-only file system修改容器持久化存储
将宿主机的文件或目录挂载到容器后如果要对其进行修改如果容器对该文件具备读写权限可以在容器中修改也可以在宿主机上直接修改
[rootlocalhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67d3926b4efc nginx:1.21 /docker-entrypoint.… 10 minutes ago Up 10 minutes 80/tcp hungry_lehmann
[rootlocalhost ~]# curl 172.17.0.2:80
hello CCE
hello CCE again
[rootlocalhost ~]# echo hello CCE one more time index.html
[rootlocalhost ~]# curl 172.17.0.2:80
hello CCE
hello CCE again
hello CCE one more time删除容器持久化存储
被挂载到容器中的宿主机文件或目录的生命周期独立于容器因此容器被删除后这些文件仍然存在如果要删除需要在宿主机上执行rm操作在删除容器时使用-v选项并不会删除宿主机上的文件仅删除容器产生的一些数据容器在运行时也可以在宿主机上删除被挂载的文件但是一旦容器停止后就无法再启动了
容器镜像
容器镜像说明 容器镜像是容器的模板容器是镜像的运行实例runtime根据容器镜像创建容器 容器镜像挂载在容器根目录下是为容器中的应用提供隔离后执行环境的文件系统 容器镜像打包了整个操作系统的文件和目录rootfs当然也包括应用本身。即应用及其运行所需的所有依赖都被封装在容器镜像中。保证了本地环境和云端环境的高度一致 容器镜像采用分层结构 所有容器共享宿主机Kernel并且不能修改宿主机Kernel。即容器运行过程中使用容器镜像里的文件使用宿主机OS上的Kernel镜像是不可以修改的不可以超过128层 对一个应用来说操作系统是它运行所需要的最完整的依赖 容器镜像直接打包了应用运行所需要的整个操作系统从而保证了本地环境和云端环境的高度一致。对软件开发而言容器镜像打通了“开发 - 测试 - 部署”的流程 容器镜像只是提供了一套镜像文件系统中的各种文件而各种内核相关的模块或者特性支持完全依赖于宿主机
容器镜像分层结构
Docker镜像中引入层layer的概念。镜像制作过程中的每一步操作都会生成一个新的镜像层 容器镜像采用分层结构可分为镜像层和容器层 镜像层只读每一个镜像层都可以共享容器层可读写在容器启动时被加载到镜像层之上 容器镜像 一个完整镜像中的所有镜像层联合在一起即为一个统一的文件系统。用户在容器层中只能看到最上层的文件镜像的分层结构使得镜像的制作以增量的方式进行。这样每次镜像的拉取、推送时的数据量都比完整镜像小很多且宿主机或Registry上容器镜像占用的真实存储空间也比所有容器镜像总和小很多减少空间占用
容器copy-on-write特性
对容器的增删改查操作
操作具体执行创建文件新文件只能被添加在容器层中。删除文件依据容器分层结构由上往下依次查找。找到后在容器层中记录该删除操作。具体实现是UnionFS会在容器层创建一个”whiteout”文件将被删除的文件“遮挡”起来。修改文件依据容器分层结构由上往下依次查找。找到后将镜像层中的数据复制到容器层进行修改修改后的数据保存在容器层中。copy-on-write读取文件依据容器分层结构由上往下依次查找。
所有storage driver都支持镜像分层结构和写时复制CoW策略
UnionFS联合文件系统
UnionFS主要的功能是将多个不同位置的目录联合挂载union mount到同一个目录下 每一个镜像层都是Linux操作系统文件与目录的一部分。在使用镜像时docker会将所有的镜像层联合挂载到一个统一的挂载点上表现为一个完整的Linux操作系统供容器使用 docker镜像分层结构的实现借助于UnionFS联合文件系统的能力Union File System联合文件系统是实现docker镜像的技术基础。它是一种轻量级的高性能分层文件系统支持将文件系统中的修改进行提交和层层叠加。这个特性使得镜像可通过分层实现和继承。同时支持将不同目录挂载到同一个虚拟文件系统下 以Overlay2为例Overlay2是一种堆叠文件系统它依赖并建立在其它的文件系统之上如ext4fs、xfs等并不直接参与磁盘空间结构的划分仅将原来底层文件系统中不同的目录进行“合并”然后向用户呈现这也就是联合挂载技术
AUFS简介
AUFS 是联合文件系统的一种它在主机上使用多层目录存储结构每一个目录在 ausf 中都叫作分支而在 docker 中则称之为层layer最终呈现给用户的则是一个普通单层的文件系统每一个镜像层和容器层都是 /var/lib/docker 下的一个子目录镜像层和容器层都在 AUFS/diff 目录下每一层的目录名称是镜像或容器的 ID 值联合挂载点在 AUFS/mnt 目录下mnt 目录是真正的容器工作目录 AUFS读取文件的流程 如果要读取的文件在容器层中存在则直接从容器层读取如果要读取的文件在容器层中不存在时则从镜像层中按照层级查找该文件知道查找完成后然后读取文件内容如果要去读的文件既存在于镜像层又存在于容器层将会从容器层读取该文件 AUFS修改文件的机制及流程 AUFS 对文件的修改采用的是写时复制的工作机制这种工作机制可以最大程度节省存储空间当第一次在容器中修改某个文件时AUFS 会触发写时复制操作将被修改的文件从镜像层复制文件到容器层然后再执行对应的修改操作。后面如果要再次修改文件则直接在容器层进行修改当文件被删除时AUFS并不会真正将这个文件从镜像中删除因为镜像层是只读的而是创建一个whiteout格式的文件将要删除的文件遮挡起来使用户看不到
OverlayFS简介
OverlayFS是一个类似于AUFS的联合文件系统它比AUFS部署起来更简单性能更好。OverlayFS借助lowerdir、upperdir、merged和workdir实现和构建其中workdir对用户侧不可见 overlayFS文件系统的读流程 如果文件在upperdir层直接读取文件如果文件不在upperdir层则从lowerdir层获取 overlayFS文件系统的写流程 如果在 upperdir 中不存在overlay 和 overlay2 执行 copy_up 操作把文件从 lowdir 拷贝到 upperdir由于 overlayfs 是文件级别的即使文件只有很少的一点修改也会产生的 copy_up 的行为后续对同一文件的在此写入操作将对已经复制到容器的文件的副本进行操作。这也就是常常说的写时复制copy-on-write当文件在容器被删除时在upperdir创建 whiteout 文件lowerdir的文件是不会被删除的因为他们是只读的但 without 文件会阻止他们显示当目录在容器内被删除时在upperdir一个不透明的目录这个和上面 whiteout 原理一样阻止用户继续访问即便镜像层仍然存在
OverlayFS简介
OverlayFS有两种存储驱动overlay和overlay2其中推荐使用overlay2使用docker inspect可查看到当前容器使用的存储驱动信息
[rootlocalhost ~]# docker inspect bf
……..GraphDriver: {Data: {LowerDir: /var/lib/docker/overlay2/b4eef5898b52ed697302ab7f03ac990b4eeac7f8d0b0e98d2ac1cd9f7af010d1-init/diff:/var/lib/docker/overlay2/801de6e91d75ed7a70a4978f40c1441d7020753fd30c0122a28108239b2dc042/diff:/var/lib/docker/overlay2/8b4ccfb6da748d8a3a311b06a6bd8dfb466f8953cf805fcfa1d374048e0d228d/diff:/var/lib/docker/overlay2/f7b0d2d35e7b39ad52706465dc5f50885ec12db1f2a87dbe6be00ad0c3bfbbea/diff:/var/lib/docker/overlay2/09ff411dc8224739cf2d5578ddbf21f6d6d5d3b6b04038fa9702f4338a40a097/diff:/var/lib/docker/overlay2/6549a19669295423943929a5273152ce34b28002c7a204595a7543e19ec9b415/diff,MergedDir: /var/lib/docker/overlay2/b4eef5898b52ed697302ab7f03ac990b4eeac7f8d0b0e98d2ac1cd9f7af010d1/merged,UpperDir: /var/lib/docker/overlay2/b4eef5898b52ed697302ab7f03ac990b4eeac7f8d0b0e98d2ac1cd9f7af010d1/diff,WorkDir: /var/lib/docker/overlay2/b4eef5898b52ed697302ab7f03ac990b4eeac7f8d0b0e98d2ac1cd9f7af010d1/work},Name: overlay2},Mounts: [],
………….Registry Registry是存放容器镜像的仓库用户可进行镜像下载和访问它可分为公有和私有两类Registry 公有镜像仓库 docker Hub是docker公司为公众提供的托管RegistryQuay.io现为Red Hat下的公共托管Registry 私有镜像仓库 企业可以用docker Registry构建私有的Registry也可以使用云镜像仓库服务实现Registry本身是一个开源项目可以用于搭建私有Registry 云镜像仓库是云服务商提供的私有镜像仓库服务常用的云镜像仓库服务有 华为云的SWR阿里云的ACR 云镜像仓库服务还会提供镜像加速器功能 使用命令docker info可以查看到当前使用的镜像仓库地址
容器镜像命名格式
容器镜像一般包含四个部分 registry镜像仓库地址如果不指定一般表示使用官方的公共镜像。使用私有镜像仓库时建议使用完整路径path镜像存放的镜像仓库中的路径使用私有镜像仓库时建议使用完整路径imagename容器镜像名称tag镜像的版本号如果不指定则为latest通常建议设置为版本号-镜像中包含的软件-基础镜像信息 查看镜像
使用命令docker images可列出当前宿主机上的镜像
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/test-real/nginx 1.21 12766a6745ee 2 weeks ago 142MB
swr.cn-north-4.myhuaweicloud.com/test-real/nginx test 12766a6745ee 2 weeks ago 142MB
nginx 使用命令docker inspect 镜像名称可查看镜像的详细信息
[rootlocalhost ~]# docker inspect nginx:test
[{Id: sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619,RepoTags: [nginx:test,swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21,swr.cn-north-4.myhuaweicloud.com/test-real/nginx:test],RepoDigests: [swr.cn-north-4.myhuaweicloud.com/test-real/nginxsha256:83d487b625d8c7818044c04f1b48aabccd3f51c3341fc300926846bca0c439e6
..........拉取容器镜像
拉取公共镜像
使用命令docker pull可将镜像从镜像仓库拉取到本地例如命令docker pull nginx:1.21可将版本为1.21的nginx镜像拉取到本地。在本命令中省略了镜像仓库地址和路径系统将默认从官方镜像站拉取如下所示的docker.io/library/
[rootlocalhost ~]# docker pull nginx:1.21
1.21: Pulling from library/nginx
c229119241af: Pull complete
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:1.21
docker.io/library/nginx:1.21
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.21 12766a6745ee 2 weeks ago 142MB拉去私有镜像
如果从私有镜像库中拉取镜像首先需要登录镜像仓库然后再拉取镜像 例如命令docker login -u xxxxxxx -p xxxxx swr.cn-north-4.myhuaweicloud.com可登录云上的私有镜像仓库然后再使用命令docker pull swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21
[rootlocalhost ~]# docker login -u xxxxxxx -p xxxxx swr.cn-north-4.myhuaweicloud.com
Login Succeeded
[rootlocalhost ~]# docker pull swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21
1.21: Pulling from test-real/nginx
c229119241af: Pull complete
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:83d487b625d8c7818044c04f1b48aabccd3f51c3341fc300926846bca0c439e6
Status: Downloaded newer image for swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21
swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/test-real/nginx 1.21 12766a6745ee 2 weeks ago 142MB推送容器镜像
使用命令docker push可将更新或者创建的镜像推送的容器仓库可供其他人使用。在推送镜像时要使用镜像的完整路径才能推送到准确的位置例如命令docker push swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21可将镜像推送到对应位置在推送镜像时如果镜像站已存在相同的镜像系统会提示该镜像已存在
[rootlocalhost ~]# docker push swr.cn-north-4.myhuaweicloud.com/test-real/nginx:1.21
The push refers to repository [swr.cn-north-4.myhuaweicloud.com/test-real/nginx]
ea4bc0cd4a93: Layer already exists
fac199a5a1a5: Layer already exists
5c77d760e1f4: Layer already exists
33cf1b723f65: Layer already exists
ea207a4854e7: Layer already exists
608f3a074261: Layer already exists
1.21: digest: sha256:83d487b625d8c7818044c04f1b48aabccd3f51c3341fc300926846bca0c439e6 size: 1570如果没有修改镜像内容而仅是修改了镜像的信息是否可以将修改后的镜像推送到相同的镜像站 不可以系统会检测每个层的信息如果所有层的id都一致系统会认为是同一个镜像
打包和解压容器镜像
使用命令docker save可将一个或数个镜像打包成一个压缩包打包后的镜像可以下载到本地
[rootlocalhost ~]# docker save nginx:test -o nginx
[rootlocalhost ~]# ls
anaconda-ks.cfg nginx使用命令docker load可将打包后的镜像进行解压
[rootlocalhost ~]# docker load -i nginx
Loaded image: nginx:test
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/test-real/nginx 1.21 12766a6745ee 2 weeks ago 142MB
swr.cn-north-4.myhuaweicloud.com/test-real/nginx test 12766a6745ee 2 weeks ago 142MB
nginx删除容器镜像
使用命令docker rmi可删除当前宿主机上的镜像
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test 12766a6745ee 2 weeks ago 142MB
swr.cn-north-4.myhuaweicloud.com/test-real/nginx 1.21 12766a6745ee 2 weeks ago 142MB
swr.cn-north-4.myhuaweicloud.com/test-real/nginx test 12766a6745ee 2 weeks ago 142MB
[rootlocalhost ~]# docker rmi nginx:test
Untagged: nginx:test
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/test-real/nginx 1.21 12766a6745ee 2 weeks ago 142MB
swr.cn-north-4.myhuaweicloud.com/test-real/nginx test 12766a6745ee 2 weeks ago 142MB制作镜像
方式1使用Dockerfile制作镜像
推荐用这种方式直接去看我下面这篇文章下面文章是操作下面标题Dockerfile详述是概念可以都看看了解一下。 docker镜像构建详细说明
方式2使用命令docker commit
使用命令docker commit可以将修改后的容器提交副本形成一个新的容器 docker commit命令创建镜像比较方便但是在传递方面不如Dockerfile因此目前Dockerfile是比较推荐的创建镜像的方式后续主要介绍Dockerfile来创建镜像的方式
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.21 12766a6745ee 2 weeks ago 142MB
[rootlocalhost ~]# docker run -d nginx:1.21
bd46d46a32a4c4c02cb591226334d28630a6b3e1db98c6999170478f5adba24e
[rootlocalhost ~]# docker exec -it bd /bin/bash
rootbd46d46a32a4:/# echo hello CCE /usr/share/nginx/html/index.html
rootbd46d46a32a4:/# exit
Exit
[rootlocalhost ~]# docker commit bd nginx:test
sha256:d60c3f8cee30013b1649c3ec1cac1029d486f4f1ffe951a9bce45ad3ca184062
[rootlocalhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test d60c3f8cee30 5 seconds ago 142MB
nginx 1.21 12766a6745ee 2 weeks ago 142MBDockerfile详述
Dockerfile简介
Dockerfile是一个包含了一系列命令的文本文件这些命令可以用来构建一个容器镜像Dockerfile文件中的注释以“#”开始在Dockerfile所在的目录使用命令docker build构建镜像或者在命令docker build后添加-f选项用来指定Dockerfile的具体位置在命令docker build后面添加-t选项用来为创建的镜像指定tag
Dockerfile结构 Dockerfile基础镜像
在制作镜像时通常会以一个镜像为基础然后在其基础上进行修改作为基础的镜像就叫基础镜像也被称为base镜像Scratch是一个特殊的基础镜像表示一个空白的镜像制作Linux发行版镜像时通常会使用scratch作为基础镜像在Dockerfile中使用FROM命令指定基础镜像不可以省略必须是Dockerfile的第一条有效指令 Dockerfile镜像描述信息
Dockerfile中的镜像描述信息用来对镜像进行说明例如该镜像的作者、用途等元数据Dockerfile中的镜像描述信息使用LABEL指令进行添加描述信息以键值对的形式体现一个LABEL指令后面可添加多个键值对也可以多次使用LABEL设置多条信息在LABEL指令后使用“/”进行换行在Dockerfile中镜像描述信息是非必选内容 Dockerfile构建容器指令 - RUN
Dockerfile在容器构建时使用RUN指令在容器内执行某些操作例如安装软件、创建文件等RUN指令可以在同一Dockerfile中多次出现每执行一次镜像就会增加一层一条RUN指令后面可以执行多条命令命令之间使用“”隔开使用RUN指令如果要进行换行需使用“\” Dockerfile构建容器指令 - COPY
Dockerfile构建容器时使用COPY指令可以将宿主机的文件拷贝到镜像当中
Dockerfile构建容器指令 - ADD
Dockerfile中的ADD指令和COPY指令的作用一样也是将宿主机上的文件拷贝到镜像中ADD可以将tar、gz等格式的压缩包在拷贝到镜像中后自动解压并将压缩包从镜像中删除 对比ADD官方更推荐是用COPY 上面案例中哪个效果更好
Dockerfile构建容器指令 - WORKDIR
Dockerfile在容器构建时使用WORKDIR指令切换容器的工作目录如果所指定的工作目录不存在WORKDIR会自动创建该目录在Dockerfile中可多次使用WORKDIR来切换目录 Dockerfile构建容器指令 - ENV
Dockerfile在容器构建时可使用ENV指令创建环境变量在Dockerfile中可多次使用ENV来创建多个环境变量 Dockerfile构建容器指令 - EXPOSE
Dockerfile在容器构建时可使用EXPOSE指令宣告镜像启动时暴露的端口如果需要暴露多个端口可依次列在EXPOSE后面如果要指定端口协议格式为“EXPOSE 端口号/协议”例如“EXPOSE 80/tcp” Dockerfile构建容器指令 - VOLUME
Dockerfile在容器构建时可使用VOLUME指令将容器中的文件或目录挂载到宿主机上使用VOLUME指令挂载的文件或目录自动映射到宿主机的/var/lib/docker/volumes/volume name/_data目录下删除容器时由容器映射出来的数据默认不会同时被删除如果需要同时删除需要在删除容器时添加-v选项 Dockerfile设置镜像启动时执行任务的命令 - CMD Dockerfile在容器构建时可使用CMD指令设置镜像启动时执行的命令 CMD后面的命令可以被运行容器时运行的命令所覆盖 如果在一个Dockerfile中有多个CMD在构建镜像时不会报错但容器运行时仅执行最后一个
Dockerfile设置镜像启动时执行任务的命令 - ENTRYPOINT
Dockerfile在容器构建时也可以使用ENTRYPOINT指令设置镜像启动时执行的命令ENTRYPOINT与CMD不同所执行的命令不会被覆盖ENTRYPOINT后面一般是一个脚本用于容器启动时执行一些初始化配置ENTRYPOINT和CMD同时存在时CMD中的内容会作为ENTRYPOINT的参数或选项 Dockerfile建议
尽可能选择轻量级基础镜像优化镜像层缓存尽可能减少镜像层数分阶段构建尽量将Dockerfile相关文件放在同一目录
Dockerfile优化案例
以下Dockerfile存在哪些可优化的点
FROM centos:7RUN useradd nginx
COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN yum install -y wget
RUN wget -c http://nginx.org/download/nginx-1.21.0.tar.gz
RUN tar -xzvf nginx-1.21.0.tar.gz
RUN yum -y install gcc gcc-c autoconf automake make pcre-devel openssl openssl-devel
WORKDIR nginx-1.21.0
RUN ./configure --prefix/usr/local/nginx/ --usernginx --groupnginx --without-http_rewrite_module
RUN make make install
RUN cp /usr/local/nginx/sbin/nginx /usr/local/sbin/
EXPOSE 80
ENTRYPOINT [nginx,-g,daemon off;]有如下可以优化 基础镜像使用debian或其他轻量级镜像尽可能合并RUN把可能变化的构建操作放到下层将编译前的文件放入一个镜像正式的镜像从中拷贝编译后的文件完成后删除多余的文件 优化后dockfile如下
FROM centos:7 as buildCOPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN useradd nginx \yum install -y wget gcc gcc-c autoconf automake make pcre-devel openssl openssl-devel \wget -c http://nginx.org/download/nginx-1.21.0.tar.gz \tar -xzvf nginx-1.21.0.tar.gz
WORKDIR nginx-1.21.0
RUN ./configure --prefix/usr/local/nginx/ --usernginx --groupnginx --without-http_rewrite_module \make make installFROM debian:latest
RUN useradd nginx
COPY --frombuild /usr/local/nginx/ /usr/local/nginx/
COPY --frombuild /usr/local/nginx/sbin/nginx /usr/local/sbin/nginx
EXPOSE 80
ENTRYPOINT [nginx,-g,daemon off;]缩略语
缩略语英文全称解释APIApplication Programming Interface应用编程接口指的是应用程序之间为了保证互相通讯所提供的一系列特殊规则和要求K8sKubernetesKubernetes的缩写CLICommand-lineInterface 命令行视图LBLoad Balance负载均衡AIArtificial Intelligence人工智能OAOffice Automation办公自动化OTTOver The Top通过互联网向用户提供各种应用服务CSIContainer Storage Interface容器存储接口CCECloud Container Engine华为云容器引擎HCSHUAWEI CLOUD Stack华为云解决方案名称