镜像仓库 (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 Registry 中的镜像通常由开发人员制作,而后推送至“公共”或“私有”Registry 上保存,供其他人员使用,例如“部署”到生产环境
镜像仓库的拉取机制
启动容器时,docker daemon 会试图从本地获取相关的镜像;本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地
DockerHub
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。具有以下功能:
(1)个人可以注册私有仓库,能够发布自己的镜像
(2)提供镜像检索能力
(3)提供海量官方和认证组织的镜像
(4)从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
(5)支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服
务器会自动将相关的有效负载发送到客户端的 webhook URL。 )
Docker Hub 功能浏览
镜像搜索
镜像tag查找
对应版本拉取命令
镜像的大小,id,cpu架构查看
国内镜像源
国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。国内很多云服务商都提供了国内镜像加速器服务,例如:
阿里云加速器(点击管理控制台 -> 登录账号(淘宝账号) -> 右侧镜像工具 -> 镜像加速器-> 复制加速器地址)
网易云加速器地址 https://hub-mirror.c.163.com
百度云加速器地址"https://mirror.baidubce.com"
可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
# 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
后确保 json 的格式正确
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
添加完成后需要重新加载配置,重启 Docker:
# 加载配置
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 pull | docker image pull | 拉取镜像 |
docker push | docker image push | 推送镜像 |
docker search | 查找镜像 | |
docker logout | 登出仓库 |
如果想要学习某个命令,例如学习docker login,可以添加上 --help 参数,就会有对应的命令信息
或者直接去官网学习:https://docs.docker.com/engine/reference/commandline/cli/
docker login
登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker login [OPTIONS] [SERVER]
关键参数:
-u :登陆的用户名
-p :登陆的密码
可以自行去docker官网去注册,然后再进行登录
docker pull
从镜像仓库中拉取或者更新指定镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
别名
docker image pull
关键参数
-a :拉取所有 tagged 镜像
–disable-content-trust :忽略镜像的校验,默认开启
docker push
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push [OPTIONS] NAME[:TAG]
别名
docker image push
关键参数
-a :推送所有 tagged 镜像
–disable-content-trust :忽略镜像的校验,默认开启
需要自行注册登录,然后创建一个仓库
必须按照规定上传
需要给原来的镜像按照规定重新取名,再提交
再验证一下,发现已经成功 push 到 docker hub 上了
docker search
从 Docker Hub 查找镜像
docker search [OPTIONS] TERM
关键参数
–no-trunc :显示完整的镜像描述
-f <过滤条件>:列出收藏数不小于指定值的镜像
查找nginx的镜像
查找nginx镜像stars大于10的镜像
但是往往找镜像,都是去站点上找,因为查看方面
docker logout
登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub
docker logout [SERVER]
docker images
列出本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
别名
docker image ls, docker image list
关键参数
-a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
–digests :显示镜像的摘要信息
-f :显示满足条件的镜像
–format :指定返回值的模板文件
–no-trunc :显示完整的镜像信息
-q :只显示镜像 ID
列出本地全部镜像,以及列出本地镜像名为nginx:1.23.4的镜像
也可以跟shell配合使用
docker image inspect
查看镜像详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]
docker tag
标记本地镜像,将其归入某一仓库,相当于mv命令,进行重命名
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker run
创建一个新的容器并运行一个命令
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
别名
docker container run
关键参数
-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 run 无参
拉取CentOS 7的镜像,并运行
此时发现run之后,里面退出了,这是因为centos 7默认的命令是/bin/bash,需要长时间交互,因为这里没有交互,所以直接退出了
通过以下命令查看是否创建容器
#查看正在运行的容器
docker ps
#查看所有的容器
docker ps -a
通过以下命令从新启动容器
docker run -it centos:7 bash
参数 -d
因为docker run 无参是前台运行,它会把所有的日志都打印到前台,例如启动nginx服务
因此可以使用-d选项,使其成为后台运行
docker run -d nginx:1.23.4
参数 -p
docker run -d -p 80:80 nginx:1.23.4
在指定端口时,需要注意宿主机的端口没被占用,如果没有
通过curl命令向本机的32768端口发送请求
成功访问到了nginx
参数 --name
如果不使用–name,那么启动容器时,docker将会随机给容器取名,根本记不住
参数 --cpuset-cpus
给nginx指定CUP为0核和1核
这里出错的原因不是语法错误,而是我的云服务只有1核
从新指定为0核
参数 --link
在一个终端启动一个容器,名为mycentos1,再在另一个终端启动另外一个容器,名为mycentos2,并链接大mycentos1上,从而实现容器互联
终端1启动名为mycentos1的容器
另一个终端启动名为mycentos2的容器,并链接到mycentos1上,进行ping操作,查看是否能ping通
这里本质上就是把mycentos1的IP地址进行了DNS的解析,在/etc/hosts文件中就能看到
但是mycentos1不能ping通mycentos2,因为没对mycentos2的IP地址进行DNS解析
docker ps
列出容器
docker ps [OPTIONS]
别名
docker container ls, docker container list, docker container ps
关键参数
-a :显示所有的容器,包括未运行的
-f :根据条件过滤显示的内容
- -format :指定返回值的模板文件。如 json 或者 table
-l :显示 ;的容器
-n :列出最近创建的 n 个容器
- -no-trunc :不截断输出
-q :静默模式,只显示容器编号
-s :显示总的文件大小
首先查看nginx服务是否在运行,或者查看是否有nginx服务
可以通过杀死master进程,从而杀死整个nginx服务
删除nginx
安装nginx
# centos 配置 nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
可以在这个目录下查看是否配置成功
构建缓存,这样下载起来速度就会变快
#安装nginx
yum install -y nginx
安装完成之后,查看 nginx 是否启动,如果没有启动,则可以手动启动
#查看版本
nginx -v
#手动启动
命令1:nginx
命令2:systemctl start nginx
访问nginx的首页
查看nginx默认的配置文件
nginx默认监听80端口,访问根的话,就会访问到 /usr/share/nginx/html/index.html
将 /usr/share/nginx/html/index.html 的内容修改一下,然后再次访问nginx的首页
安装nginx,首先得检查环境,查看机器上是否有nginx,有的话,就卸载掉,然后进行nginx的下载安装,并完成启动,如果觉得首页不好看,再调整首页的配置信息
通过docker搭建nginx服务
首先拉去合适的镜像
docker pull nginx:1.24.0
查看对应的详细信息
docker image inspect nginx:1.24.0
进入容器,启动nginx,然后修改对应的页面信息
docker run -it -p 80:80 nginx:1.24.0 bash
nginx
cd /usr/share/nginx/html/
echo "fl" > index.html
总体来看,使用docker搭建nginx还是挺方便的