前言

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

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

然后就是博主最近最花时间的一个专栏《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 登出仓库

如何学习一个命令。

第一种办法。

  1. docker [命令名称] --help
  1. [root@ALiCentos7:~]$ docker login --help
  2. Usage: docker login [OPTIONS] [SERVER]
  3. Log in to a registry.
  4. If no server is specified, the default is defined by the daemon.
  5. Options:
  6. -p, --password string Password
  7. --password-stdin Take the password from stdin
  8. -u, --username string Username
  9. [root@ALiCentos7:~]$

第二种办法。

网站上的使用手册。

  • https://docs.docker.com/


docker login

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

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

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

docker pull

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

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

  1. docker pull nginx:1.25.2


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

  1. docker pull nginx@sha256:48a84a0728cab8ac558f48796f901f6d31d287101bc8b317683678125e0d2d35

这样即可。

docker push

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

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

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

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

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

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

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

其实和Github是一个道理。

先创建一个仓库。

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

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

这样就推送完成了。

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

docker search

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

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

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

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

docker logout

  1. docker logout [SERVER]

镜像相关命令(部分)

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

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

docker images

列出本地镜像。

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

一些别名。

  1. docker image list
  2. docker image ls

一些参数。

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

这里是一些例子。

具体用法可以看文档。

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

  1. docker images | grep nginx

docker image inspect

查看一个镜像的详情。

  1. docker image inspect nginx:1.25.2


用id也是可以的。

docker tag

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

Nginx了解

一种web服务器。

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

Centos7安装Nginx

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

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

卸载Nginx

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

安装Nginx

centos 配置 nginx 源

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

配置一下缓存,加速下载

  1. yum makecache

下载nginx

  1. sudo yum install -y nginx

下载完成

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

Nginx在机器上的默认配置


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

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. #access_log /var/log/nginx/host.access.log main;
  5. location / {
  6. root /usr/share/nginx/html; # 这里表示了nginx这个服务的首页
  7. index index.html index.htm;
  8. }
  9. #error_page 404 /404.html; # 这个是404的html
  10. # redirect server error pages to the static page /50x.html
  11. #
  12. error_page 500 502 503 504 /50x.html;
  13. location = /50x.html {
  14. root /usr/share/nginx/html;
  15. }
  16. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  17. #
  18. #location ~ \.php$ {
  19. # proxy_pass http://127.0.0.1;
  20. #}
  21. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  22. #
  23. #location ~ \.php$ {
  24. # root html;
  25. # fastcgi_pass 127.0.0.1:9000;
  26. # fastcgi_index index.php;
  27. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  28. # include fastcgi_params;
  29. #}
  30. # deny access to .htaccess files, if Apache's document root
  31. # concurs with nginx's one
  32. #
  33. #location ~ /\.ht {
  34. # deny all;
  35. #}
  36. }
  1. location / {
  2. root /usr/share/nginx/html; # 这里表示了nginx这个服务的首页
  3. index index.html index.htm;
  4. }

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

容器相关命令(部分)

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

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

docker run

创建一个新的容器并运行一个命令。

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

重要参数

  1. -d : 后台运行容器,并返回容器 ID;
  2. -i : 以交互模式运行容器,通常与 -t 同时使用;
  3. -P : 随机端口映射,容器内部端口随机映射到主机的端口
  4. -p : 指定端口映射
  5. -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  6. --name="nginx-lb" : 为容器指定一个名称;
  7. -h "mars" : 指定容器的 hostname;
  8. -e username="ritchie" : 设置环境变量;
  9. --cpuset-cpus="0-2" or --cpuset-cpus="0,1,2" : 绑定容器到指定 CPU 运行;
  10. -m : 设置容器使用内存最大值;
  11. --network="bridge" : 指定容器的网络连接类型;
  12. --link=[] : 添加链接到另一个容器;
  13. --volume , -v : 绑定一个卷
  14. --rm : shell 退出的时候自动删除容器

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

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

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

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

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

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

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

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

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

-d参数

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

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

-t, -i, -it参数

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

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


-P, -p参数

先看一下这个命令。

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

  • -p : 指定端口映射

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

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

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

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

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

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

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

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

使用-p会多一些。

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


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

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


添加环境变量。

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

添加链接到另一个容器。

–rm

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

docker ps

列出容器。

  1. docker ps [OPTIONS]

别名。

  1. docker container ls
  2. docker container list
  3. docker container ps

参数。

  1. -a : 显示所有的容器,包括未运行的
  2. -f : 根据条件过滤显示的内容
  3. --format : 指定返回值的模板文件。如json 或者 table
  4. -l : 显示 latest 的容器
  5. -n : 列出最近创建的n 个容器。
  6. -no-trunc : 不截断输出。
  7. -g : 静默模式,只显示容器编号
  8. -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. 【转载】内存基本概念-node, zone ,page

    1. Linux描述物理内存 在linux 内存管理(一)中介绍了UMA和NUMA,Linux通过巧妙办法把UMA和NUMA的差别隐藏了起来,所谓的UMA其实就是只有一个结点的NUMA.内存的每个结点 ...

  2. 简单的winform学生管理系统Demo

    界面效果 练习重点 1. 关系表的创建 2. 增删改查的操作,及sqlhelper的封装 3. 跨页面数据传递,编辑页数据提交后数据局步刷新到列表数据 项目源码 FrmStuddentList pub ...

  3. 小白学正则表达式之 regexp

    1. 正则表达式介绍 正则表达式是程序文本处理常用的模板模式,按照解析正则表达式的引擎可将正则表达式分为 POSIX 基础正则表达式(Basic regular expression,BRE) 引擎和 ...

  4. kafka 集群环境搭建

    本文为博主原创,未经允许不得转载: 如果搭建单机节点 kafka 可看我的这篇博客: 搭建 kafka 集群环境,只需要在搭建单机 kafka 环境的基础上,多增加几个kafka 服务实例即可. 多增 ...

  5. [转帖]Postmark - 存储性能测试工具

    1. 引言 Postmark是由著名的NAS提供商NetApp开发,用来测试其产品的后端存储性能. Postmark主要用于测试文件系统在邮件系统或电子商务系统中性能,这类应用的特点是:需要频繁.大量 ...

  6. [转帖]10--k8s之数据持久化

    https://www.cnblogs.com/caodan01/p/15136217.html 目录 一.emptDir 二.hostPath 三.pv 和 pvc 1.环境准备 2.创建pv 3. ...

  7. [转帖]VMware Converter (P2V迁移)问题汇总

    https://www.dinghui.org/vmware-converter-p2v.html VMware vCenter Converter Standalone,是一种用于将虚拟机和物理机转 ...

  8. [转帖]DISK BUSY的理解误区

    前几天有个客户的系统存在性能问题,从AWR报告上我们看到是CPU使用率过高,同时GLOBAL CACHE方面的争用比较严重.系统中的烂SQL很多,数据库中很多几十GB的大表也没有分区,总之问题很多.不 ...

  9. [转帖]@nginx多server及使用优化(php)

    文章目录 ​ ​一.nginx多server优先级​​ ​ ​二.禁止IP访问页面​​ ​ ​三.nginx的包含include​​ ​ ​四.nginx 路径的alias和root​​ ​ ​1.配 ...

  10. 一次OOM事故的学习过程

    事故过程 周二下午得到消息, 希望帮忙分析dump文件. 告知dump大小为42G大小. 一般机器没这么大的内存进行处理. 建议现场上传到百度云盘, 然后我这边进行下载. 时间进度为: 11.57创建 ...