docker镜像管理,内网私有注册中心搭建

docker镜像特点

分层

Docker镜像是采⽤分层的⽅式构建的,每个镜像都有⼀系列的“镜像层”组成。分层结构是Docker镜像如此轻量的重要原因,当需要修改容器镜像内的某个⽂件时,只对处于最上⽅的读写层进⾏变动,不覆写下层已有⽂件系统的内容,已有⽂件在只读层中的原始版本仍然存在,但会被读写层中的新版晚间所隐藏。**当使⽤docker commit提交这个修改过的容器⽂件系统为⼀个新的镜像时,保存的内容仅为最上层读写⽂件系统中被被更新过的⽂件。分层达到了在不同镜像之间共享镜像层的效果。**可以提高利用率,减少存储

写时复制

Docker镜像使⽤了写时复制策略,在多个容器之间共享镜像,每个容器在启动的时候并不需要单独复制⼀份镜像⽂件,⽽是将所有镜像层以只读的⽅式挂载到⼀个挂载点,再在上⾯覆盖⼀个可读可写的容器层。在未更改⽂件内容是,所有容器共享同⼀份数据,只有在Docker容器运⾏过程中⽂件系统发⽣变化是,才会把变化的⽂件内容写到可读写层,并隐藏只读层中的⽼版本⽂件。写时复制配合分层机制建好了镜像对磁盘空间的占⽤和容器启动时间。

内容寻址

Docker 1.10版本后,Docker镜像映⼊了内容寻址存储的机制,根据⽂件内容来索引镜像和镜像层。与之前版本对每⼀个镜像层随机⽣成⼀个UUID不同,新模型对镜像层的内容计算校验和,⽣成⼀个内容哈希值,并以此哈希值代替之前的UUID作为镜像层的唯⼀标志。该机制提⾼了镜像的安全性,并在pull、push、load和save操作后检查数据的完整性。另外,基于内容哈希来索引镜像层,在⼀定程度上减少了ID的冲突并且增强了镜像层的共享。对于来⾃不同构建的镜像层只要拥有相同的内容哈希,也能被不同的镜像共享

联合挂载

联合挂载技术可以在⼀个挂载点同时挂载多个⽂件系统,将挂载点的原⽬录与被挂载内容进⾏整合,使得最终课件的⽂件系统将会包含整合之后的各个层的文件和⽬录。实现这种联合挂载技术的⽂件系统通常被称为联合⽂件系统(union filesystem)。 关于unionfs可以看前文docker核心原理

镜像管理

先介绍概念

registry(注册中心)

registry ⽤来保存Docker镜像,其中还包括镜像层次结构和关于镜像的元数据(元数据:描述数据的数据,主要描述数据属性的信息)。可以将registry简单的想象成类比git仓库之类的实体(object)。

Repository

repository 即由具有某个功能的Docker镜像的所有迭代版本构成的镜像组。registry由⼀系列经过命名的Repository组成,repository 通过命名规范对⽤户仓库和顶层仓库进⾏组织。⽤户仓库的命名由⽤户名和repository 名两部分组成,中间以“/”隔开,即username/repository_name的形式,repository名通常表示镜像所具有的功能,如ansible/ubuntu14.04-ansible、xlhmzch/mysql等;⽽顶层仓库则只包含repository名的部分,如Ubuntu。我们通常所说的镜像名其实就是指的repositoryrepository和镜像之间是什么关系呢?事实上,repository是⼀个镜像的集合,其中包含了多个不同版本的镜像,使⽤标签进⾏版本区分

manifest

主要存在于registry中作为Docker镜像的元数据⽂件,在pull、push、save和load中作为镜像结构和基础信息的描述⽂件。在镜像被pull或者load到Docker宿主机时,manifest被转化为本地的镜像配置⽂件config。

如何查看镜像manifest

#docker18.06以上
docker manifest inspect <image-name>

#其他方式,inspect看看config里有没有
docker inspect image-name  

# docker save 打包成tar 解压出来看
docker save -o nginx.tar a6bd71f48f68
tar -xvf nginx.tar -C test/
cat test/manifest.json
[{"Config":"a6bd71f48f6839d9faae1f29d3babef831e76bc213107682c5cc80f0cbb30866.json","RepoTags":null,"Layers":["ded7e6ada655a91d3af550d4c354c2512368552c13451fdb2660a9f5343464f0/layer.tar","b3ecd587aec41154f857a620ca9c38c2c4f674c89a74959580792bbd4cc85014/layer.tar","c445d82f9a4e46f0edd9ec7844aaa795b7105214a270b6a844d1ce4b7636ae8c/layer.tar","8fff66458fc65693849b6242d840ed0cb53a38f04ffcbe1aba82540968739f0d/layer.tar","43219b2f241ebc445bb3bc7559048b6de625c952c3386047865967fa2adde9a8/layer.tar","eb5ebcf97f7d3e0c232ac22257fc35c1bf4b4a7c9ed95bcf80aa9b694ed0e6ee/layer.tar","98cfb9f028db6fc9833d3305a49ae2b98fb3d57731188d9cd7304f3704d5520f/layer.tar"]}]
#前面是第一层,最后面是最上一层,重点看到对应目录下的json里是否有parent

image和layer

Docker内部的image概念是⽤来存储⼀组镜像相关的元数据信息,主要包括镜像的架构(如amd64)、镜像默认配置信息、构建镜像的容器配置信息、包含所有镜像层信息的rootfs。Docker利⽤rootfs中的diff_id 计算出内容寻址的索引(chainID)来获取layer相关信息,进⽽获取每⼀个镜像层的⽂件内容。

layer(镜像层)是⼀个Docker⽤来管理镜像层的中间概念,镜像是由镜像层组成的,⽽单个镜像侧可以被多个镜像共享,所以Docker将layer和image的概念分离。Docker镜像管理中的layer主要存放镜像的的diff_id、size、cache-id和parent等内容,实际的⽂件内容则由存储驱动来管理,并可以通过cache-id在本地索引到。

Dockerfile

Dockerfile是在通过docker build 命令构建⾃⼰的Docker镜像时需要使⽤到的定义⽂件。每⼀条指令描述了构建镜像的步骤。

镜像管理命令

docker 常用命令

案例
镜像构建
docker commit基于一个已存在的容器构建镜像
//运⾏⼀个nginx容器
docker run -d -p 81:80 nginx
//语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
//案例
docker commit b415cdd95dfc mynginx:v1

注意:提交⼀个容器只会保存在提交的那个时刻容器的⽂件系统的状态,⽽不是进程状态。docker容器不是虚拟机。如果环境的状态依赖于⼀些正在运⾏的进程状态,⽽这些进程不能通过标准⽂件恢复的话,docker commit 将⽆法帮助⽤户保存所需要的状态

使用场景: 构建临时测试镜像、容器被入侵后,保留现场

其他情况不建议用docker commit来构建⽣产现⽹环境的镜像。

  • 使⽤docker commit构建的镜像包含了编译构建、安装软件,以及程序运⾏产⽣的⼤量⽆⽤⽂件这会导致镜像体积很⼤,⾮常臃肿。
  • 使⽤docker commit构建的镜像会丢失掉所有对该镜像的操作历史,⽆法还原镜像的构建过程,不利于镜像的维护
docker build 构建镜像

dockerfile

一个简单的打印请求路径的http服务器

FROM golang:1.18 as builder
MAINTAINER dongya
RUN git clone https://gitee.com/yourdemo/helloworld.git
WORKDIR helloworld
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app"]
docker build -t hello:v1.0.0 -f Dockerfile .
docker run -p 80:80 -d --name example_server hello:v1.0.0
镜像分享
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
 docker tag IMAGE_ID TARGET_IMAGE[:TAG]

本地镜像管理,可以⽤版本号来指定镜像的tag,⽅便镜像管理
可以⽤来修改本地镜像名和tag,指定⽬标远程仓库镜像和tag

公共仓库分享

  1. 登录 https://hub.docker.com/ 创建公有的 repository,注意此处的repository具体到了镜像名
    例如:本例⼦使⽤的repository 为:dongya/mynginx 表示 dongya这个账户下mynginx镜像

  2. 登录远程仓库

    //语法
    //docker login [OPTIONS] [SERVER]
    docker login
    //打tag
    docker tag mynginx:v1 dongya/mynginx:v1
    //推送镜像
    docker push dongya/mynginx:v1
    
  3. 镜像推送成功之后,即可通过docker pull 拉取到镜像

docker save + docker load
docker save : 将指定镜像保存成 tar 归档⽂件。
docker save -o images.tar mynginx:v1 mysql:5.7.30
docker load -i images.tar

私有注册中心搭建并分析镜像
docker run -d -p 5000:5000 --name registry --restart=always registry:2
docker ps -a
# curl http://localhost:5000/v2/_catalog
# {"repositories":""}
mkdir -p $HOME/registry/
mkdir -p $HOME/registry/auth
mkdir -p $HOME/registry/data
yum install httpd-tools
htpasswd -Bbn testuser testpwd > /root/registry/auth/htpasswd
docker run --privileged -d -p 5000:5000 --name registry --restart=always -v $HOME/registry/data:/var/lib/registry -v $HOME/registry/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2

# 因为用的root用户,所以要加--privileged,不然容器会权限不够,一般不建议用root。

#修改配置文件,信任注册中心 重启服务。远程访问需要,配置在发起远程的机子

vim /lib/systemd/system/docker.service
ExecStart那加一个选项
--insecure-registry 10.74.18.61:5000

sudo systemctl daemon-reload
sudo systemctl restart docker

docker login http://10.74.18.61:5000
docker tag mynginxtest:1.1 10.74.18.61:5000/mynginx:1.0.0
docker push 10.74.18.61:5000/mynginx:1.0.0

一般用于内网环境 不用Https也行

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值