当前位置: 首页 > article >正文

(第三十七天)

一、使用 Dockerfile 创建镜像
Dockerfile 文件命令介绍:
FORM 指定基础镜像为该镜像的最后修改版本
FROM < img:tag > 指定基础镜像为该镜像的⼀个 tag 版本
MAINTAINER 指定镜像创建者,企业内部不⽤指定,对外发布也可以不指定
RUN 运⾏命令,安装软件
CMD 设置 container 启动时进⾏的操作,如果容器镜像中有这 个命名,启动容器时,不要⼿动让容
器执⾏其他命令
ENTRYPORINT (⼊⼝点 )cmd 每次只能执⾏⼀个指令, entrypoint 可以多⾏执⾏。
USER 设置容器进程的⼀些⽤户
EXPOSE 暴露端⼝ 指定容器需要映射到宿主机的端⼝
ENV 设置环境变量 -e
ADD 从宿主机 src 复制⽂件到容器的 dest 路径
volumn 指定挂载点
WROKDIR 切换⽬录
ONBUILD 在⼦镜像中执⾏指令
1 、查看 docker 的原始 overlay2 文件
# 删除原始的 docker 目录, docker 恢复原始状态没有任何镜像和容器
[root@docker ~] # rm -rf /var/lib/docker/*
# 启动 docker ,自动生成 docker 目录
[root@docker ~] # systemctl start docker
# 查看 overlay2 目录,该目录下只有两个文件
# backingFsBlockDev 可能与底层文件系统的块设备相关信息有关
# l 存放了一些链接文件
[root@docker ~] # ls /var/lib/docker/overlay2/
backingFsBlockDev l
[root@docker 003 ] # ls -l /var/lib/docker/overlay2/l
总用量 0
[root@docker ~] # ls -l /var/lib/docker/overlay2/backingFsBlockDev
brw-------. 1 root root 253 , 0 8 27 18 :49
/var/lib/docker/overlay2/backingFsBlockDev
2 、拉取镜像之后观察 overlay2 文件的变化
# 拉取 centos 的镜像
[root@docker ~] # docker pull centos
# 1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927 centos 的镜
像文件
[root@docker ~] # ls /var/lib/docker/overlay2/
1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927
backingFsBlockDev l
[root@docker ~] # ls -l /var/lib/docker/overlay2/l
总用量 0
lrwxrwxrwx. 1 root root 72 8 27 18 :50 5UARUS4DFDNH37GG65JKMFRO4M - >
../1341061cbeb80e7b74279a892f637fc3e2f03222f88a05bc93a7019647f9c927/diff
# 查看镜像
[root@docker ~] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
3 、使用 Dockerfile 自动化创建 httpd 镜像
# 创建 001 目录
[root@docker ~] # mkdir 001
# 切换到 001 目录中
[root@docker ~] # cd 001
# 编辑 abc.sh 脚本文件
[root@docker 001 ] # vim abc.sh
#!/bin/bash
# 删除有关 httpd 的所有文件
rm -rf /run/httpd/*
# “/sbin/httpd” :这是 HTTP 服务器的可执行文件路径
# “-D FOREGROUND” :这是传递给 httpd 可执行文件的参数
# “-D” 通常用于指定一个服务器特定的指令或选项。
# “FOREGROUND” 表示将服务器运行在前台,而不是作为后台进程运行。这样可以在终端窗口中直接看
到服务器的输出信息,便于观察服务器的启动过程、运行状态以及可能出现的错误消息
exec /sbin/httpd -D FOREGROUND
# 编辑首页文件
[root@docker 001 ] # echo "ff" > index.html
# 创建 Dockerfile 文件
[root@docker 001 ] # vim Dockerfile
# 基于什么镜像创建本镜像
FROM centos:latest
# 在基础镜像的基础上创建可写层运 RUN 的命令,然后继续封装为一个新的镜像。以下的命令都是执行
一次创建一次新的镜像。
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo
https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum clean all && yum makecache
RUN yum -y install epel-release
RUN yum -y install httpd
# 在最新的镜像的基础上创建可写层将当前目录下的 abc.sh 文件添加到可写层的 / 下,然后封装为一个
新的镜像。
ADD abc.sh /abc.sh
ADD index.html /var/www/html/index.html
RUN chmod + x /abc.sh
# 设置 container 启动时进 的操作,如果容器镜像中有这个命名,启动容器时,不要 ⼿ 动让容器执
其他命令
CMD [ "/bin/bash" , "/abc.sh" ]
# 使用 build 命令进行 httpd 镜像构建
[root@docker 001 ] # docker build -t centos:httpd .
[ + ] Building 205 .2s (14/14) FINISHED
# 查看 overlay2 文件,发现创建了很多中间镜像文件
[root@docker 001 ] # ls /var/lib/docker/overlay2/
25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92 l
8y0ib03cyjk3bikvwj40k7c37
laqzfqudwz025q498kfbo901r
backingFsBlockDev
m492nzrx1jlex30ds1l70r48e
cwm0hlso2ikxpnnew7h6r3gsk
mp1170uu9wy5pnkchxm3bth3k
gnntltza2z80epdbv3ih2xga1
mrgs02l8tzf0rrmbt2m8fjwpy
ixnyvcpy4lx99f1y7h8xyz8iu
rduyzuv1kxytktqve6jfbodat
kubfqbqaklvn332f9ypyp4lvo
xtcj5pgcz6s3o4wk466q9t09h
# 查看镜像
[root@docker 001 ] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos httpd 403dce14659e About a minute ago 338MB
centos latest 5d0da3dc9764 2 years ago 231MB
4 、使用刚才创建的 httpd 镜像创建一个 httpd 的容器(不用执
/bin/bash 命令)
# 创建容器之后,容器直接在后台运行,是 up 状态
[root@docker 001 ] # docker run -d --name c0 centos:httpd
5ae9cfa3d3460a737daf4e33860b36edb37e7380e15090faee51a2462cbe3a5c
# 查看容器状态
[root@docker 001 ] # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
PORTS NAMES
5ae9cfa3d346 centos:httpd "/bin/bash /abc.sh" 10 seconds ago Up 9
seconds c0
# 查看 overlay2 文件
[root@docker 001 ] # ls /var/lib/docker/overlay2/
25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92
kubfqbqaklvn332f9ypyp4lvo
515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f l
515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f-init
laqzfqudwz025q498kfbo901r
8y0ib03cyjk3bikvwj40k7c37
m492nzrx1jlex30ds1l70r48e
backingFsBlockDev
mp1170uu9wy5pnkchxm3bth3k
cwm0hlso2ikxpnnew7h6r3gsk
mrgs02l8tzf0rrmbt2m8fjwpy
gnntltza2z80epdbv3ih2xga1
rduyzuv1kxytktqve6jfbodat
ixnyvcpy4lx99f1y7h8xyz8iu
[root@docker 001 ] # cd
5 、使用 Dockerfile 自动化创建 yum 镜像
[root@docker ~] # cp -r 001 002
[root@docker ~] # cd 002
[root@docker 002 ] # ls
abc.sh Dockerfile index.html
[root@docker 002 ] # rm -rf abc.sh
[root@docker 002 ] # rm -rf index.html
[root@docker 002 ] # vim Dockerfile
FROM centos:latest
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo
https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
RUN yum clean all && yum makecache
RUN yum -y install epel-release
CMD /bin/bash
# 完成特别快只用了 0.1s ,说明该创建的镜像在创建 httpd 镜像时已经创建过了,现在只是又调用了一
下而已
[root@docker 002 ] # docker build -t centos:yum .
[ + ] Building 0 .1s (9/9) FINISHED
[root@docker 002 ] # ls /var/lib/docker/overlay2/
25dd2217dc1c5af7a64f050bd9fd7b0d4f73fd1146638b68376553ed1871cb92
kubfqbqaklvn332f9ypyp4lvo
515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f l
515b357ebc9fdefa191a492824c9a55ca1958d969cd5e36740787ec16859644f-init
laqzfqudwz025q498kfbo901r
8y0ib03cyjk3bikvwj40k7c37
m492nzrx1jlex30ds1l70r48e
backingFsBlockDev
mp1170uu9wy5pnkchxm3bth3k
cwm0hlso2ikxpnnew7h6r3gsk
mrgs02l8tzf0rrmbt2m8fjwpy
gnntltza2z80epdbv3ih2xga1
rduyzuv1kxytktqve6jfbodat
ixnyvcpy4lx99f1y7h8xyz8iu
xtcj5pgcz6s3o4wk466q9t09h
6 、使用 Dockerfile 自动化创建 nginx 镜像
[root@docker ~] # cp -r 002 003
[root@docker ~] # cd 003
[root@docker 003 ] # vim Dockerfile
# 基于 centos:yum 镜像
FROM centos:yum
RUN yum -y install nginx
# Nginx 的配置文件 /etc/nginx/nginx.conf 中添加 “daemon off;” 这一行内容。
# 通常情况下, Nginx 在默认配置中是以守护进程( daemon )的方式运行的。添加 “daemon off;”
可以让 Nginx 在前台运行,而不是作为后台守护进程。这在某些特定的场景下可能是有用的,比如在容器环境中,希望 Nginx 直接在前台运行以便更好地观察其运行状态或者与其他进程进行交互。
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
# 暴露端 指定容器需要映射到宿主机的端
EXPOSE 80
CMD /usr/sbin/nginx
[root@docker 003 ] # docker build -t centos:nginx .
[ + ] Building 194 .2s (7/7) FINISHED
7 、使用刚才创建的 nginx 镜像创建一个 nginx 的容器(不用执
/bin/bash 命令)
[root@docker 003 ] # docker run -d --name nc centos:nginx
34bf6e6f1ecfcb0e1f717385a3553fe058bab65caa4603280951d98976efebe6
[root@docker 003 ] # docker ps --all
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
34bf6e6f1ecf centos:nginx "/bin/sh -c /usr/sbi…" 8 seconds ago Up
7 seconds 80 /tcp nc
二、搭建私有仓库
1 、拉取 registry 镜像并创建运行容器
容器注册表( Container Registry
容器注册表是用于存储和分发容器镜像的存储库。它就像一个集中的仓库,开发者可以将自己构建
的容器镜像推送到注册表中进行存储,也可以从注册表中拉取所需的镜像来部署应用。
# 拉取 registry
[root@docker 003 ] # docker pull registry
# 创建挂载目录
[root@docker ~] # mkdir /regist
# 启动容器同时映射端口,挂载目录
[root@docker ~] # docker run -d --name r2 -v /regist/:/var/lib/registry -
p5000:5000 registry:latest
# 访问仓库,发现仓库中并没有镜像
[root@docker ~] # curl localhost:5000/v2/_catalog
{ "repositories" :[]}
# 浏览器访问: 10.0.0.100:5000/v2/_catalog
2 、修改 daemon.json 文件,指定私有仓库地址
# 修改 daemon.json 文件
[root@docker ~] # vim /etc/docker/daemon.json
# “insecure_registries” :这个配置项用于指定不安全的容器注册表地址列表。
# “http://10.0.0.100:5000” :这是一个具体的容器注册表地址。这里使用的是 HTTP 协议,而不
是更安全的 HTTPS 协议。
{
"registry-mirrors" : [
"https://do.nark.eu.org" ,
"https://dc.j8.work" ,
"https://docker.m.daocloud.io" ,
"https://dockerproxy.com" ,
"https://docker.mirrors.ustc.edu.cn" ,
"https://docker.nju.edu.cn"
],
"host" : [
"tcp://0.0.0.0:2375" ,
"unix:///var/run/docker.sock"
],
"insecure_registries" : [
"hhtp://10.0.0.100:5000"
]
}
# 重启 docker 服务
[root@docker ~] # systemctl restart docker.service
# 启动 registry 容器
[root@docker ~] # docker start r2
r2
[root@docker ~] # docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
fa7e9e9adafa registry:latest "/entrypoint.sh /etc…" 16 minutes ago Up
2 seconds 0 .0.0.0:5000->5000/tcp, :::5000->5000/tcp r2
# 访问仓库
[root@docker ~] # curl localhost:5000/v2/_catalog
{ "repositories" :[]}
3 、为本地镜像打标签,并上传打标签的镜像到私有仓库中
# 查看 tag 的使用方式
[root@docker ~] # docker tag --help
Usage: docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
Aliases:
docker image tag, docker tag
# centos:yum 打上标签,会产生一个有标签的镜像
[root@docker ~] # docker tag centos:yum 10.0.0.100:5000/centos:yum
# 查看镜像列表
[root@docker ~] # docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10 .0.0.100:5000/centos yum 3d6ddceabada About an hour ago 272MB
centos yum 3d6ddceabada About an hour ago 272MB
# 将打标签后的镜像推送到私有镜像仓库中
[root@docker ~] # docker push 10.0.0.100:5000/centos:yum
The push refers to repository [10.0.0.100:5000/centos]
4f03d8e3bd27: Pushed
8ce251db6acd: Pushed
d7497f8ce860: Pushed
84f544839c6f: Pushed
74ddd0ec08fa: Pushed
yum: digest:
sha256:e80a8c39150c1ba15a9cb34d9960a450a26f341f35f943fdac7caa40d39f817a size:
1366
# 访问仓库,发现有一个 centos 的镜像
[root@docker ~] # curl localhost:5000/v2/_catalog
{ "repositories" :[ "centos" ]}
4 、查看 regist 文件内容
[root@docker ~] # ls /regist/
docker
[root@docker ~] # cd /regist/docker/
[root@docker docker] # ls
registry
[root@docker docker] # cd registry/
[root@docker registry] # ls
v2
[root@docker registry] # cd v2
[root@docker v2] # ls
blobs repositories
[root@docker v2] # cd repositories/
[root@docker repositories] # ls
centos
[root@docker repositories] # cd centos/
[root@docker centos] # ls
_layers _manifests _uploads
[root@docker centos] # cd _layers/
[root@docker _layers] # ls
sha256
[root@docker _layers] # cd sha256/
# 发现镜像,并且是一层一层上传的
[root@docker sha256] # ls
3127685a2e9b21beb8a870ee9575646f1c0d441661874cdcaa01a724218939e2
3d6ddceabadaa475bb81ca4b5eae508c311f9068a8be6042d72156c4581e9eec
a1d0c75327776413fa0db9ed3adcdbadedc95a662eb1d360dad82bb913f8a1d1
aa878f71d044e7eb143fd07094be06161a149d682da4aec03095b375af7de50b
c35bf6dcc39cf1d32233a720c48ae058ef098f69466706e5e886df747532fccc
f53bb2d73e0577b30c56e94b8901c26108dbb5b4a2bb1b4a622c1c41fdf5b489

http://www.kler.cn/a/282414.html

相关文章:

  • 【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练
  • 在Node.js中如何使用TypeScript
  • 【小白可懂】微信小程序---课表渲染
  • 华为Ensp模拟器配置RIP路由协议
  • GPIO相关的寄存器(重要)
  • 【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
  • Unity(2022.3.41LTS) - 着色器
  • 【自由能系列(初级)】大脑功能与贝叶斯计算——深层生成模型的自由能原理
  • junit格式报告解析工具
  • shell脚本-采集容器内自定义端口tcp连接数并通过http接口推送到Prometheus
  • Ruby 多线程
  • UTONMOS:探索未来游戏的元宇宙纪元新篇章
  • 微知-nandflash和norflash名字为什么叫nand和nor?主要区别是什么?
  • js | XMLHttpRequest
  • 【QT | 开发环境搭建】Linux系统(Ubuntu 18.04) 安装 QT 5.12.12 开发环境
  • MyBatis 源码解析:Environment 与 DataSource 配置实现
  • 【网络安全】服务基础第一阶段——第五节:Windows系统管理基础---- DHCP部署与安全
  • 您应该让 ChatGPT 控制您的浏览器吗?
  • VTK+Qt+Cmake+VS的环境搭建
  • 数据赋能(188)——开发:数据产品——影响因素、直接作用、主要特征
  • 黑马程序员Python机器学习|1机器学习概述
  • oracle日常训练
  • 面试专题:如何对对象的部分属性按序访问
  • 深入浅出神经网络-学习小结
  • 使用mime/multipart上传文件报错:multipart: NextPart: EOF
  • javascript网页设计案例