一、什么是 Docker Registry
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。
镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。
整体视图如下:
- 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com。一个 Registry 中可以存在多个Repository,Repository 可分为“顶层仓库”和“用户仓库”;·用户仓库名称格式为“用户名/仓库名”,每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像。
- Repository: 由某特定的 docker 镜像的所有迭代版本组成的镜像仓库。
- 镜像名称(name)+标签(tag): 如 nginx:latest
- 认证能力: 提供用户注册、登录、登出能力。
- 索引: 提供镜像的索引信息,方便检索。
一个容器镜像包含了两个部分,一个是 元数据,其实就是由dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum这些信息都会记录下来,另有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的blob里面,真正占有空间的就是这些 blob。
二、镜像仓库分类
按是否对外开放分别,也是研发职员常说的
- 公有仓库: 像阿里云、 dockerhub 等放到公有网络上,不用登录就可以下载镜像,供各人访问使用
- 私有仓库: 不对外开放,往往位于私有网络,只有公司内部职员可以使用。
按供应商和面向群体分别
- sponsor(赞助)registry: 第三方的 registry,供客户和 docker 社区版使用。
- mirror(镜像)registry: 第三方的 registry,只让客户使用,例如阿里云必须注册才能使用。
- vendor(供应商) registry: 由发布 docker 镜像的供应商提供的registry,例如像Google 和 Redhat 提供了镜像仓库服务
- private registry: 通过没有防火墙和额外的安全层的私有实体提供的registry,仅供内部使用。
三、镜像仓库工作机制
- 镜像仓库使用流程
• 通过 docker login 登录仓库
• docker pull 拉取需要的镜像
• 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库
- 现实研发中镜像仓库怎样使用
Docker Registry 中的镜像通常由开发职员制作,而后推送至“公共”或“私有”Registry上生存,供其他职员使用,例如“部署”到生产情况:
- 名词解释
- 开发情况:开发职员使用的一套情况
- 测试情况:需求开发完成后,发布到供测试职员举行测试的情况
- 预发布情况:版本测试完成后,发布到和生产类似的情况,提前模仿生产发布
- 生产情况:真正面向客户的情况
- 镜像仓库的拉取机制
启动容器时, docker daemon 会试图从本地获取相干的镜像、本地镜像不存在时,其将从 Registry 中下载该镜像并生存到本地。
四、常用的镜像仓库
- DockerHub
- Docker Hub 是什么?
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。具有以下功能:
- 个人可以注册私有仓库,可以或许发布本身的镜像
- 提供镜像检索能力
- 提供海量官方和认证构造的镜像
- 从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
- 支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相干的有用负载发送到客户端的 webhook URL )
- Docker Hub 功能浏览
- 镜像搜索
- 镜像 tag 查找
- 对应版本拉取命令
- 镜像的大小、id、cpu架构查察
- 国内镜像源
国内从 Docker Hub 拉取镜像偶然会碰到困难,此时可以设置镜像加速器。国内很多云服务商都提供了国内镜像加速器服务,例如:
- 阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器-> 复制加速器地址)
- 网易云加速器地址
- 百度云加速器地址
可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
- Shell
- {
- # 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
- 后确保 json 的格式正确
- "registry-mirrors": [
- "https://hub-mirror.c.163.com",
- "https://mirror.baidubce.com"
- ]
- }
复制代码 添加完成后需要重新加载设置,重启 Docker:
- Shell
- # 加载配置
- sudo systemctl daemon-reload
- # 重启 docker
- sudo systemctl restart docker
- #查看 docker 状态
- sudo systemctl status docker
复制代码
- 私有仓库
私有镜像仓库则是指部署在公司或构造内部,用于自身应用 Docker 镜像存储、分发的镜像仓库。在构建公司内部使用的自动化发布体系的过程中,从安全的角度出发,应用的打包镜像一样寻常情况下只会被存储在私有镜像仓库中, CI/CD 流程的衔接点也是通过向私有镜像仓库上传镜像和拉取镜像的操纵来完成的。
- Harbor: Harbor 是 VMware 公司近来开源的企业级 Docker Registry 项目, 其目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的registry 为底子,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。 Harbor 的每个组件都是以 Docker 容器的情势构建的,使用 Docker Compose 来对它举行部署。
- Nexus: Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,目前常被用来作为 Maven 私服、 Docker 私服。
- Docker registry: 由 docker 官方提供的私服,类似于 docker hub。用于生存公司内部上传的 Docker 镜像。
五、常用命令
镜像仓库命令
命令清单
docker login: 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
- docker login [OPTIONS] [SERVER]
复制代码
当然我们也可以通过指定选项来登录:
- docker login -u cjl1314520
复制代码
docker pull: 从镜像仓库中拉取或者更新指定镜像
- docker pull [OPTIONS] NAME[:TAG|@DIGEST]
复制代码
- 关键参数
○ -a 拉取所有 tagged 镜像
○ --disable-content-trust 忽略镜像的校验,默认开启
- 样例一
- 先在dockerhub上找到我们想要下载的镜像:
- 输入下载命令docker pull nginx:1.23.4
- 样例二
- 找到所要下载的镜像的DIGEST,如下:
- 输入下载命令docker pull nginx@sha256:557c9ede65655e5a70e4a32f1651638ea3bfb0802edd982810884602f700ba25
docker push: 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
- docker push [OPTIONS] NAME[:TAG]
复制代码
- 关键参数
- -a 推送所有 tagged 镜像
- --disable-content-trust 忽略镜像的校验,默认开启
- 样例
这里我们不能直接往nginx站点里推送镜像
我们需要先在站点上创建仓库:
这里我们需要穿插一条命令:
- docker tag: 给镜像取名字
- 演示:docker tag nginx:1.23.4 cjl1314520/mybitnginx:v1.23.4
使用命令推送镜像到我们的仓库:
- docker push cjl1314520/mybitnginx:v1.23.4
复制代码
这里我们可以看到,镜像已经被推送到我们在dockerhub上创建的仓库里了。
下面我们拉取一下我们本身仓库中的镜像:
- docker pull cjl1314520/mybitnginx:v1.23.4
复制代码
当然我们也可以使用 docker push cjl1314520/mybitnginx -a 把所有的镜像都推送到docker hub仓库中。
docker search: 从 Docker Hub 查找镜像
- docker search [OPTIONS] TERM
复制代码
- 关键参数
- --no-trunc 表现完整的镜像描述
- -f <过滤条件> 列出收藏数不小于指定值的镜像
- 样例
- #查找所有stars=10的nginx
- docker search -f stars=10 nginx
复制代码
- #查看nginx完整的镜像描述
- docker search --no-trunc nginx
复制代码
docker logout
: 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
镜像命令(部分)
docker images
: 列出本地镜像
- docker images
- [OPTIONS] [REPOSITORY[:TAG]]
复制代码
- docker image ls, docker image list
复制代码
- 关键参数
- -a 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
- --digests 表现镜像的摘要信息;
- -f 表现满意条件的镜像;
- --format 指定返回值的模板文件;
- --no-trunc 表现完整的镜像信息;
- -q 只表现镜像 ID。
- 样例
- #查找nginxdocker images
- nginx#查找详细的nginx版本docker images
- nginx:1.23.4
复制代码
当然,docker命令是可以和Linux下的命令结合使用的。
docker image inspect: 查察镜像详细信息
- docker image inspect [OPTIONS] IMAGE [IMAGE...]
复制代码
- #查看镜像详细信息
- docker image inspect nginx:1.23.4
复制代码
- #通过ID来查看镜像的详细信息
- docker image inspect IMAGE ID
复制代码
docker tag: 标记本地镜像,将其归入某一仓库
- docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
复制代码
- docker tag ac232364af84 cjl1314520/mybitnginx:vv
复制代码
容器命令(部分)
docker run: 创建一个新的容器并运行一个命令
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
复制代码
- 关键参数
- -d: 背景运行容器,并返回容器 ID。
- -i: 以交互模式运行容器,通常与 -t 同时使用。
- -P: 随机端口映射,容器内部端口随机映射到主机的端口。
- -p: 指定端口映射,格式为: 主机(宿主)端口:容器端口。
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用。
- --name="nginx-lb": 为容器指定一个名称。
- -h "mars": 指定容器的 hostname。
- -e username="ritchie": 设置情况变量。
- --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2": 绑定容器到指定 CPU 运行。
- -m :设置容器使用内存最大值。
- --network="bridge": 指定容器的网络毗连类型。
- --link=[]: 添加链接到另一个容器。
- –volume , -v: 绑定一个卷。
- --rm :shell 退出的时间自动删除容器。
- 样例一
起首查察我们所在的操纵体系的版本:
去docker hub上找一个Ubuntu 20.04的镜像
拉取该镜像
- #不带任何参数--没有任何效果
- docker run ubuntu:20.04
- #带参数--可以看到,终端变成了Ubuntu操作系统
- docker run -it ubuntu:20.04
复制代码
背景运行容器
- docker run -d nginx:1.24.0
复制代码
使用 docker ps 查察
- docker run -it ubuntu:20.04 bash
复制代码
- docker run -d -p 8081:80 nginx:1.24.0
复制代码
- docker run -d -P nginx:1.24.0
复制代码
- #--name选项
- docker run -d --name mynginx1 nginx:1.24.0
- #-h选项
- docker run -it -h myubuntu ubuntu:20.04 bash
- #-e选项
- docker run -it -h myubuntu -e myenv=test ubuntu:20.04 bash
复制代码
当我们不指定内存时,可以看一下:
- docker run -d --name mynginx1 --cpuset-cpus="1" nginx:1.24.0
复制代码
- docker run -d --name mynginx2 -m 500m nginx:1.24.0
复制代码
- #在一个终端启动一个容器
- docker run -it --name myubuntu1 ubuntu:20.04 bash
- #另一个终端启动另一个容器
- docker run -it --name myubuntu2 --link myubuntu1:mywebsite1 ubuntu:20.04 bash
复制代码
- docker run -it --name myubuntu1 --rm ubuntu:20.04 bash
复制代码
docker ps: 列出容器
- docker container ls, docker container list, docker container ps
复制代码
- 关键参数
- -a :表现所有的容器,包括未运行的
- -f :根据条件过滤表现的内容
- --format :指定返回值的模板文件。如 json 或者 table
- -l :表现 latest 的容器
- -n :列出近来创建的 n 个容器
- --no-trunc :不截断输出
- -q : 静默模式,只表现容器编号。
- -s :表现总的文件大小
- 样例
- docker ps
- docker ps -a
- docker ps -f name =mynginx1
- docker ps -f name=mynginx1
- docker ps --format json
- docker ps -l
- docker ps -n 2
- docker ps -q
- docker ps -s
复制代码
六、docker镜像仓库实战
综合实战一:搭建一个 nginx 服务
查找并拉取nginx镜像
- 选择一个nginx镜像,版本最好是比力新的,没有安全漏洞的
- 拉取该镜像
- 运行容器 docker run -p 8099:80 --name myweb1 -h myweb1.com -e myenv=test -d nginx:1.24.0
修改nginx首页
- 使用终端的方式重新运行该容器
- 进入指定目录,修改html文件内容
- 再次革新,查察效果
综合实战二:Docker hub上创建本身私有仓库
Busybox 简介
BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。 BusyBox 包含了一些简朴的工具,例如 ls、 cat 和 echo 等等,还包含了一些更大、更复杂的工具,例如:grep、 find、 mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简朴的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的很多工具和命令,也包含了 Linux 体系的自带的 shell。 busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他乃至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有戋戋 1M 左右的大小.因海外带宽较小,我们拉取该镜像推送到本身的仓库。
宿主机CentOS上安装BusyBox
- #创建目录
- mkdir -p /data/mybusybox
- #进入该目录
- cd /data/mybusybox/
复制代码- wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 --no-check-certificate
复制代码
Docker hub上创建本身的私有仓库
综合实战三:阿里云创建本身的私有仓库
创建账号
进入 阿里云,点击右上角完成注册,可以使用支付宝快速注册
创建仓库
登录并推送镜像
由于仓库创建时是私有的,以是当我们退出账号时,是不能拉取镜像并推送镜像的。
我入职了一个公司,开发一个镜像,我怎么选择用哪个作为底子镜像啊?
一样寻常大型公司有本身专门的镜像制作构造,他们会选取对应的体系版本作为底子镜
像,例如华为某部分选取欧拉来制作底子镜像,腾讯选择本身的 TLinux 制作底子镜像,
不会由于出现 CentOS 不维护了无法使用的情况,而且这些镜像一样寻常都会经过严酷的
安全扫描,然后作为底子组件提供给各个部分。一样寻常的公司往往也会同意镜像的底子
版本,以是这个选择个人一样寻常不用太多纠结。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |