前言

那么这里博主先安利一些干货满满的专栏了!

首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。

然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!


第四章-镜像仓库

概念和架构

镜像仓库(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):这是第三方注册表,供客户和Docker社区版用户使用。
  • 镜像注册表(Mirror Registry):这是第三方注册表,只有已注册用户才能访问,例如,阿里云注册后方可使用。
  • 供应商注册表(Vendor Registry):由发布Docker镜像的供应商提供的注册表服务,例如,Google和Redhat提供了这样的镜像仓库。
  • 私有注册表(Private Registry):这是由内部实体提供的注册表,没有防火墙和额外的安全层,仅供内部使用。

仓库的使用

镜像仓库使用流程

  • 通过 docker login 登录仓库
  • Docker pull 拉取需要的镜像
  • 通过 dockerfile 或者 commit 等方式制作完镜像通过 docker push 上传到仓库

仓库的拉取机制

启动容器时,docker daemon 会试图从本地获取相关的镜像。本地镜像不存在时,其将从 Registry 中下载该镜像并保存到本地。

常用的镜像仓库

docker hub

  • https://hub.docker.com

dockerhub是全球最大的镜像仓库,基本上可以说想要啥这里都有。


然后我们可以搜索自己想要的镜像。

然后有两种,一种是经过认证的镜像,一种是社区的镜像。一般建议使用经过认证的,比较靠谱。

镜像仓库命令

命令 别名 功能
docker login 登录仓库
docker pull docker image pull 拉取镜像
docker push docker image push 推送仓库
docker serach 查找仓库
docekr logout 登出仓库

如何学习一个命令。

第一种办法。

docker [命令名称] --help
[root@ALiCentos7:~]$ docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a registry.
If no server is specified, the default is defined by the daemon. Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
[root@ALiCentos7:~]$

第二种办法。

网站上的使用手册。

  • https://docs.docker.com/


docker login

登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。

docker login [OPTIONS] [SERVER]
-u :登陆的用户名
-p :登陆的密码
docker login -u 用户名 -p 密码

在此之前,我们要在docker官网上先注册一个账号。

docker pull

从镜像仓库中拉取或者更新指定镜像。

docker pull [OPTIONS] NAME[:TAG|@DIGEST]
-a : 拉取所有 tagged 镜像
--disable-content-trust : 忽略镜像的校验,默认开启

docker pull nginx:1.25.2


当然用这个id也可以下载。

docker pull nginx@sha256:48a84a0728cab8ac558f48796f901f6d31d287101bc8b317683678125e0d2d35

这样即可。

docker push

docker push [OPTIONS] NAME[:TAG]
-a : 推送所有 tagged 镜像
--disable-content-trust : 忽略镜像的校验, 默认开启

把本地的镜像推到镜像仓库中去。

其实这些概念的理解和Git很相像。

我们上一小节已经下载了一个仓库,能否直接push呢?

[root@ALiCentos7:~]$ docker push nginx:1.25.2
The push refers to repository [docker.io/library/nginx]
563c64030925: Layer already exists
6fb960878295: Layer already exists
e161c3f476b5: Layer already exists
8a7e12012e6f: Layer already exists
d0a62f56ef41: Layer already exists
4713cb24eeff: Layer already exists
511780f88f80: Layer already exists
errors:
denied: requested access to the resource is denied
unauthorized: authentication required [root@ALiCentos7:~]$

我们肯定是没有这个权限的,我们怎么能向nginx这个组织推我们自己的仓库呢?

我们可以推到我们自己的仓库里面去。

其实和Github是一个道理。

先创建一个仓库。

但是,我们还要改我们本地那个镜像的tag,不能用别人的那个叫nginx的了。

docker tag nginx:1.25.2 yufcbagpack/my-bit-nginx:1.25.2
[root@ALiCentos7:~]$ docker push yufcbagpack/my-bit-nginx:1.25.2
The push refers to repository [docker.io/yufcbagpack/my-bit-nginx]
563c64030925: Mounted from library/nginx
6fb960878295: Mounted from library/nginx
e161c3f476b5: Mounted from library/nginx
8a7e12012e6f: Mounted from library/nginx
d0a62f56ef41: Mounted from library/nginx
4713cb24eeff: Mounted from library/nginx
511780f88f80: Mounted from library/nginx
1.25.2: digest: sha256:48a8xxxxxcab8ac558f48796f901f6dxxxxxx317683678125e0d2d35 size: 1778
[root@ALiCentos7:~]$

这样就推送完成了。

这样我们远程就能看到了。

docker search

从docker hub中查找想要的镜像。

docker search [OPTIONS] TERM
--no-trunc : 显示完整的镜像描述
-f <过滤条件> : 列出收藏数不小于指定值的镜像

找到了很多和nginx有关系的。

工作中一般不在这里找,肯定上官网方便,直接搜,搜到合适的直接pull就行了。

docker logout

docker logout [SERVER]

镜像相关命令(部分)

因为后面学习我们要暂时用到一些镜像相关的命令,所以这里先学一点。

后面我们还会详细学习镜像相关的命令。

docker images

列出本地镜像。

docker images[OPTIONS] [REPOSITORY[:TAG]]

一些别名。

docker image list
docker image ls

一些参数。

-a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
--digests : 显示镜像的摘要信息;
-f : 显示满足条件的镜像;
--format : 指定返回值的模板文件;
--no-trunc : 显示完整的镜像信息;
-q : 只显示镜像 ID。

这里是一些例子。

具体用法可以看文档。

与此同时,docker的命令可以和shell命令结合使用。

docker images | grep nginx

docker image inspect

查看一个镜像的详情。

docker image inspect nginx:1.25.2


用id也是可以的。

docker tag

标记本地镜像,将其归入某一仓库。

Nginx了解

一种web服务器。

  • http://t.csdn.cn/HbaDD

Centos7安装Nginx

检查系统上是否有Nginx
(base) [yufc@ALiCentos7:~]$ ps -ef | grep nginx
yufc 32437 32299 0 09:26 pts/0 00:00:00 grep --color=auto nginx
(base) [yufc@ALiCentos7:~]$ nginx
bash: nginx: command not found
(base) [yufc@ALiCentos7:~]$

经过检查,是没有的。如果有,就可以先选择卸载nginx,再进行重新安装。

卸载Nginx

如果是通过yum源安装的,那些在很简单,直接yum remove nginx即可。

安装Nginx

centos 配置 nginx 源

rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
(base) [yufc@ALiCentos7:~]$ sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0el7.ngx.noarch.rpm
[sudo] password for yufc:
Retrieving http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
warning: /var/tmp/rpm-tmp.YwES4G: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:nginx-release-centos-7-0.el7.ngx ################################# [100%]
(base) [yufc@ALiCentos7:~]$
(base) [yufc@ALiCentos7:~]$ ll /etc/yum.repos.d/
total 40
-rw-r--r-- 1 root root 675 Apr 27 23:11 CentOS-Base.repo
-rw-r--r-- 1 root root 998 Dec 11 2018 CentOS-SCLo-scl.repo
-rw-r--r-- 1 root root 971 Oct 29 2018 CentOS-SCLo-scl-rh.repo
-rw-r--r-- 1 root root 2099 Sep 1 19:52 docker-ce.repo
-rw-r--r-- 1 root root 230 Apr 27 23:11 epel.repo
-rw-r--r-- 1 root root 1358 Sep 5 2021 epel.repo.rpmnew
-rw-r--r-- 1 root root 1457 Sep 5 2021 epel-testing.repo
-rw-r--r-- 1 root root 1838 Apr 27 2017 mysql-community.repo
-rw-r--r-- 1 root root 1885 Apr 27 2017 mysql-community-source.repo
-rw-r--r-- 1 root root 113 Jul 15 2014 nginx.repo
(base) [yufc@ALiCentos7:~]$

配置一下缓存,加速下载

yum makecache

下载nginx

sudo yum install -y nginx

下载完成

(base) [yufc@ALiCentos7:~]$ nginx -v
nginx version: nginx/1.24.0
(base) [yufc@ALiCentos7:~]$
启动nginx
(base) [yufc@ALiCentos7:~]$ systemctl start nginx
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:
==== AUTHENTICATION COMPLETE ===
(base) [yufc@ALiCentos7:~]$

Nginx在机器上的默认配置


还有这个default.conf里面有很多重要的信息。

server {
listen 80;
server_name localhost; #access_log /var/log/nginx/host.access.log main; location / {
root /usr/share/nginx/html; # 这里表示了nginx这个服务的首页
index index.html index.htm;
} #error_page 404 /404.html; # 这个是404的html # redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
} # proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#} # deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
    location / {
root /usr/share/nginx/html; # 这里表示了nginx这个服务的首页
index index.html index.htm;
}

我们可以进这个目录看一下。

容器相关命令(部分)

因为后面学习我们要暂时用到一些容器相关的命令,所以这里先学一点。

后面我们还会详细学习容器相关的命令。

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 退出的时候自动删除容器

我们想在这个机器上,使用一个centos7容器来运行这个docker run。

所以先在dockerhub上面下载一个centos7。

如果docker run不带任何参数,会发现啥现象都没有的。

[root@ALiCentos7:~]$ docker run centos:7
[root@ALiCentos7:~]$

因为你没有给命令过去和这个容器交互。

docker ps可以查看所有正在运行的容器。

docker ps -a可以查看所有创建过的容器。

这里面我们可以看到,我们这个容器是被创建了的,但是退出了。

所以不带参数的docker run不带参数,默认运行/bin/bash

-d参数

后台运行容器,并返回容器 ID。

如果在后台运行,我们按^c是不会停掉的。

-t, -i, -it参数

-t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-i : 以交互模式运行容器,通常与 -t 同时使用;


-P, -p参数

先看一下这个命令。

docker run -d -p 80:80 nginx:1.24.0
  • -P : 随机端口映射,容器内部端口随机映射到主机的端口

  • -p : 指定端口映射

这个意思就是,启动一个nginx容器!-p表示映射端口。

80:80表示宿主机的80端口映射到nginx容器的80端口上。

报错了:端口被占用,这是为什么?

是因为我们宿主机已经启动了一个nginx了。

[root@ALiCentos7:~]$ netstat -nltp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 693/nginx: master p
[root@ALiCentos7:~]$

所以我们不要使用宿主机的80端口了,我们使用8081端口。

[root@ALiCentos7:~]$ docker run -d -p 8081:80 nginx:1.24.0
1c737416845472f193c3f402f7de62808e88a8781d0508a001f87ee99de5298e
[root@ALiCentos7:~]$

-P就会随机分配一个端口给我们。

使用-p会多一些。

–name参数和-h参数
--name="nginx-lb" : 为容器指定一个名称;
-h "mars" : 指定容器的 hostname;
-e username="ritchie" : 设置环境变量;


此时的名字就不是乱来的了。

如果我们不指定宿主机名字,hostname是随机的。


添加环境变量。

–cpuset-cpus和-m参数
--cpuset-cpus="0-2" or --cpuset-cpus="0,1,2" : 绑定容器到指定 CPU 运行;
-m : 设置容器使用内存最大值;
–link[]

添加链接到另一个容器。

–rm

如果这个容器退出了,自动清理。

docker ps

列出容器。

docker ps [OPTIONS]

别名。

docker container ls
docker container list
docker container ps

参数。

-a : 显示所有的容器,包括未运行的
-f : 根据条件过滤显示的内容
--format : 指定返回值的模板文件。如json 或者 table
-l : 显示 latest 的容器
-n : 列出最近创建的n 个容器。
-no-trunc : 不截断输出。
-g : 静默模式,只显示容器编号
-s : 显示总的文件大小

Docker从认识到实践再到底层原理(四-1)|Docker镜像仓库|超详细详解的更多相关文章

  1. Docker 介绍以及其相关术语、底层原理和技术

    https://ruby-china.org/topics/22004 Docker是啥 Docker是一个程序运行.测试.交付的开放平台,Docker被设计为能够使你快速地交付应用.在Docker中 ...

  2. 【docker 一】入门实践、环境部署、基本操作指令、镜像库、数据卷

    简述 `docker是如火如荼的容器技术,今后会陆续上传关于微服务技术的学习笔记,希望能和大家一起学习一起分享!` docker环境搭建 1.获取最新版的Docker安装包 $ wget -qO- h ...

  3. docker centos 镜像中安装python36详解!生成centos+python36的基础镜像

    获取centos镜像docker pull centos:7.4.1708 启动并进入centos的容器docker run -i –t centos /bin/bash下载安装python编译环境依 ...

  4. docker镜像管理和dockerfile详解(8)

    docker镜像加速 docker-io先到 https://cr.console.aliyun.com/ 注册一下,登录成功后,在控制台,看左侧,有一个加速器按钮,点开找到自己的专属加速链接,我的是 ...

  5. Docker集群实验环境布署--swarm【2 搭建本地镜像仓库】

      在10.40.100.148上   # docker run -d -p 5000:5000 --restart=always --name docker-registry.venic.com - ...

  6. 集合类再探:不可变类的好处,Collector接口详解,使用内部迭代

    集合类再探 注:本文使用的pom依赖见文末. 集合类的基础 - Iterable.Iterator java语言层面支持对实现了Iterable接口的对象使用for-each语句.Iterator可以 ...

  7. UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解

    {x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展.虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Bind ...

  8. 『忘了再学』Shell基础 — 32、Shell中test测试命令详解

    目录 1.test测试命令 (1)test命令介绍 (2)test命令使用方式 (3)示例 2.按照文件类型进行判断 3.按照文件权限进行判断 4.两个文件之间进行比较 5.两个整数之间比较 6.字符 ...

  9. 2、docker安装:内核要求、docker三要素、安装、helloworld、底层原理

    1.前提说明 1.CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 2.前提条件:内 ...

  10. 『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理

    目录 1.Docker的底层原理 2.Docker中常用的基本概念 3.run命令的运行流程 4.为什么Docker比VM快 Docker架构图: 我们依照Docker架构图进行Docker基础概念的 ...

随机推荐

  1. 基于 HTML5 WebGL + WebVR 的 3D 虚拟现实可视化培训系统

    前言 2019 年 VR, AR, XR, 5G, 工业互联网等名词频繁出现在我们的视野中,信息的分享与虚实的结合已经成为大势所趋,5G 是新一代信息通信技术升级的重要方向,工业互联网是制造业转型升级 ...

  2. 如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?

    本文是"在Serverless平台上构建AIGC应用"系列文章的第一篇文章. 前言 随着ChatGPT 以及 Stable Diffusion,Midjourney 这些新生代 A ...

  3. Python异步编程原理篇之协程的IO

    协程的IO asyncio 作为实现异步编程的库,任务执行中遇到系统IO的时能够自动切换到其他任务.协程使用的IO模型是IO多路复用.在 asyncio 低阶API 一篇中提到过 "以Lin ...

  4. java进阶(4)--抽象类与接口的区别

    1.抽象类是半抽象的,接口是全抽象的   2.抽象类中有构造方法,接口中没有构造方法   3.类与类之间不能多继承,接口与接口之间支持多继承   4.一个类可以同时实现多个接口,一个类只能继承一个抽象 ...

  5. 以太网链路连接 和 ISIS/OSPF等路由协议关系

    转载请注明出处: 以太网链路连接和ISIS/OSPF协议之间存在关联和区别 关联: 以太网链路连接是指通过以太网物理媒介(如电缆)将网络设备进行连接,使它们可以交换数据. ISIS(Intermedi ...

  6. Linux 常见重要系统文件

    Linux 常见重要系统文件 目录 Linux 常见重要系统文件 网卡配置文件 文件内容举例: DNS配置文件 文件内容举例: 系统hosts文件 文件内容举例: fstab文件 文件内容举例: rc ...

  7. SV 接口中的clocking

    接口 module可以例化模块,可以例化接口 接口不能例化模块 采样和数据驱动 时钟驱动数据,数据会有延迟,RTL仿真的时候,不会仿真出这个延时;RTL仿真的时候,不会仿真出寄存器的延时;只有在门级仿 ...

  8. java - 字符串转数字

    Integer.valueOf("str").intValue(): Integer.valueOf("123").intValue():

  9. Laravel - except() 函数

         /**      *  用户添加      * @param 接收的表单数据  (name,password,id)      * @return 返回添加是否成功      */      ...

  10. [转帖]Mnesia reports that this RabbitMQ cluster has experienced a network partition.

    一 问题描述 双节点RabbitMQ集群发生了脑裂,节点日志报错: [error] <0.6318.0> Mnesia(rabbit@pc2): ** ERROR ** mnesia_ev ...