docker镜像仓库详解(Docker Registry)

本片文章主要是对docker的镜像仓库进行了详解。其中包含了一些常用了 docker 指令,通过举例进行详解。也详细解释了镜像仓库的工作机制和常见的镜像仓库。也实际拉去和运行了一些镜像。希望本篇文章会对你有所帮助!
文章目录

[一、什么是Docker Registry](#一、什么是Docker Registry)

二、镜像仓库分类

三、镜像仓库工作机制

[3、1 镜像仓库使用流程](#3、1 镜像仓库使用流程)

[3、2 实际研发中镜像仓库如何使用](#3、2 实际研发中镜像仓库如何使用)

[3、3 镜像仓库的拉取机制](#3、3 镜像仓库的拉取机制)

四、常用的镜像仓库

[4、1 Docker hub](#4、1 Docker hub)

[4、2 国内镜像源](#4、2 国内镜像源)

五、镜像仓库命令

[5、1 命令清单](#5、1 命令清单)

[5、2 命令详解](#5、2 命令详解)

六、镜像命令(部分)

七、容器命令(部分)

八、docker镜像仓库实战

[8、1 搭建一个nginx服务](#8、1 搭建一个nginx服务)

[8、1、1 基础知识](#8、1、1 基础知识)

[8、1、2 正向代理与反向代理](#8、1、2 正向代理与反向代理)

[8、1、3 本地安装并启动nginx服务](#8、1、3 本地安装并启动nginx服务)

[8、2 在docker hub 上创建自己的仓库](#8、2 在docker hub 上创建自己的仓库)

[8、2、1 BusyBox](#8、2、1 BusyBox)

[8、2、2 创建账号](#8、2、2 创建账号)


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Docker 👀

💥 标题:docker镜像仓库 💥

❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、什么是Docker Registry

**镜像仓库 (Docker Registry)**负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。在Docker中,镜像仓库是用来存放和共享镜像的地方,类似于代码仓库的作用。

镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。

  • 镜像仓库(Registry):要从哪一个镜像仓库拉取镜像,通常通过 DNS 或 IP 地址来确定一个镜像仓库如 hub.docker.com;一个 Registry 中可以存在多个Repository。Repository 可分为"顶层仓库"和"用户仓库",用户仓库名称格式为"用户名/仓库名"。每个仓库可以包含多个 Tag(标签),每个标签对应一个镜像
  • Repository(仓库):由某特定的 docker 镜像的所有迭代版本组成的镜像仓库。
  • Tag(标签):是对镜像的易记名称引用,可以通过标签来指定要使用的特定版本的镜像。
  • 镜像名称(name) +标签(tag):如 nginx:1.24.0。
  • 认证能力:提供用户注册,登录、登出能力。
  • 索引:提供镜像的索引信息,方便检索。
  • 一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum 这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的 blob 里面,真正占有空间的就是这些 blob。

整体视图如下:

二、镜像仓库分类

Docker Registry按照是否对外开放进行划分,可以分为两种类型:公共仓库和私有仓库。

  1. 公共仓库: Docker官方提供了一个公共的镜像仓库,称为Docker Hub(https://hub.docker.com)。Docker Hub上存储了大量的公共镜像,用户可以通过搜索镜像名称找到自己需要的镜像,并下载到本地使用。使用Docker Hub时,用户需要创建一个Docker Hub账号,在命令行或Docker客户端中使用自己的账号信息进行登录,并可以上传自己的镜像到Docker Hub上供他人使用。

  2. 私有仓库: Docker还支持创建自己的私有镜像仓库,用于存储和共享自定义的镜像。私有仓库可以满足企业或个人对镜像管理的特殊需求,例如安全性、可控性等。常见的私有仓库有Docker官方提供的Docker Registry镜像、Harbor、Nexus等。

按照供应商和面向群里划分(了解):

  • sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用。
  • mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用。
  • vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像Google 和 Redhat 提供了镜像仓库服务。
  • private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用。

三、镜像仓库工作机制

3、1 镜像仓库使用流程

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

3、2 实际研发中镜像仓库如何使用

Docker Registry 中的镜像通常由开发人员制作,而后推送至"公共"或"私有"Registry 上保存,供其他人员使用,例如"部署"到生产环境。

在实际开发中,开发者可以选择从docker hub的共有仓库中拉取镜像。也可选择自己制作镜像进行使用。由于开发需要面临不同的环境,所以可以制作出不同的版本镜像供不同开发阶段的环境进行使用。下面对上图的不同环境进行解释:

  • 开发环境:开发人员使用的一套环境。
  • 测试环境:需求开发完成后,发布到供测试人员进行测试的环境。
  • 预发布环境:版本测试完成后,发布到和生产类似的环境,提前模拟生产发布。
  • 生产环境:真正面向客户的环境。

3、3 镜像仓库的拉取机制

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

四、常用的镜像仓库

4、1 Docker hub

Docker Hub是一个云端的Docker镜像仓库,它(Docker)提供了一个集中存储和发布Docker镜像的平台。在Docker Hub上,开发人员和用户可以上传、下载和管理Docker镜像。这些镜像可以被用来快速创建和部署容器化的应用程序。

Docker Hub具有以下功能:

  1. 个人可以注册私有仓库,能够发布自己的镜像;
  2. 提供镜像检索能力;
  3. 提供海量官方和认证组织的镜像;
  4. 从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub;
  5. 支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL)。

4、2 国内镜像源

国内从 Docker Hub 拉取镜像有时会遇到困难,此时可以配置镜像加速器 。什么是镜像加速器呢?所谓镜像加速器(Image Accelerator)是一种用于加快Docker镜像下载速度的服务。由于Docker Hub服务器在全球各地的访问速度可能不稳定,使用镜像加速器可以帮助提高下载速度,并提供更可靠的镜像访问体验。下面是镜像加速器的工作原理和详细解释:

  1. 镜像缓存:镜像加速器通常会使用分布式缓存系统来存储常用的Docker镜像。当用户请求下载某个镜像时,加速器会先检查本地缓存中是否存在该镜像的副本。如果有,则直接从缓存中获取,而不必从远程镜像库下载,从而提高了下载速度。

  2. 地域节点:镜像加速器通常部署了多个地域节点,以使用户可以选择最接近其位置的节点进行访问。这样,用户可以通过与最近的节点建立连接,从而减少网络延迟并提高镜像下载速度。

  3. 增量传输:为了进一步降低下载所需的时间和流量,一些镜像加速器会使用增量传输技术。当用户需要同一个镜像的多个版本(例如,不同的标签或不同的操作系统架构)时,加速器只会下载所需的差异部分,而不需要下载完整的镜像文件。

  4. 镜像同步:为了确保加速器中缓存的镜像与Docker Hub保持同步,镜像加速器会定期从Docker Hub拉取最新的镜像并更新缓存。这样可以保证用户能够获取到最新版本的镜像。

需要注意的是,镜像加速器是一个第三方服务,不同的厂商可能提供不同的加速器服务。用户可以根据自己的需要选择合适的镜像加速器,并按照提供商提供的指南进行配置。常见的镜像加速器包括阿里云加速器、DaoCloud加速器等。

国内很多云服务商都提供了国内镜像加速器服务,例如:

可以在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)。

cpp 复制代码
{
    # 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
    后确保 json 的格式正确
     "registry-mirrors": [
     "https://hub-mirror.c.163.com",
     "https://mirror.baidubce.com"
 ]
}

具体如下图:

当我们添加成功配置文件后,需要重新加载配置,重启 Docker。指令如下:

bash 复制代码
# 加载配置
sudo systemctl daemon-reload 

# 重启 docker
sudo systemctl restart docker 

#查看 docker 状态
sudo systemctl status docker

我们在通过docker info看一下其详细信息,我们就可以看到多个国内的镜像源就被添加到docker的配置当中去。如下图:

五、镜像仓库命令

5、1 命令清单

命令清单如下:

接下来我们一一来学习一下上图中的命令。

5、2 命令详解

docker login

Docker login是一个用于在Docker registry上进行身份验证的命令。Docker registry是用于存储和分发Docker镜像的镜像仓库。使用Docker login命令,你可以通过提供凭据(用户名和密码)登录到特定的Docker registry。如果未指定镜像仓库地址,默认为官方仓库 Docker
Hub。
要使用Docker login命令,你需要拥有一个有效的账户,该账户允许访问你想要登录的Docker registry。首先,你需要使用以下命令执行登录操作:

docker login [OPTIONS] [SERVER]

其中,[OPTIONS]参数用于提供额外的配置选项,[SERVER]参数用于指定要登录的Docker registry的URL。

以下是一些常用的选项:

  • -u--username:指定要使用的用户名。
  • -p--password:指定要使用的密码。
  • -e--email:指定与用户名关联的电子邮件地址。

例如,如果要登录到Docker Hub(默认的公共Docker registry),你可以执行以下命令:

docker login

docker login -u 用户名

docker login -u 用户名 -p 密码

可在登录的选项中指定用户名和密码,也可选择不指定然后自己输入。一般情况下我们在登陆时都不会指定密码的!

对于私有Docker registry,你需要提供相应的URL,通常在登录时会指定。例如,要登录到私有registry.example.com,您可以执行以下命令:

cpp 复制代码
docker login registry.example.com

docker pull

docker pull是用于从Docker镜像仓库中拉取(下载)镜像的命令。当你运行"docker pull"命令时,Docker引擎会首先连接到指定的Docker Registry(如Docker Hub、私有Registry等),然后从Registry中获取镜像。这个过程类似于从云端下载文件,只不过这里下载的是一个完整的容器镜像。语法如下:

cpp 复制代码
docker pull [OPTIONS] NAME[:TAG|@DIGEST]

说明一下:

  • OPTIONS:用于指定附加选项,例如使用代理服务器、认证等。
  • NAME:指定要拉取的镜像名称,可以是镜像的仓库名(repository)、镜像名或者镜像ID。
  • TAG:指定镜像的标签(版本),如latest、1.0等。如果不指定标签,默认为latest。
  • DIGEST:使用镜像的摘要信息进行拉取。

关键参数:

  • **-a :**拉取所有 tagged 镜像。
  • **--disable-content-trust :**忽略镜像的校验,默认开启。

假如我们想拉去一个nginx镜像,我们可以现在docker hub上搜索一下该镜像。如下:

上图中也展示了拉取镜像的命令。但是没有指定标签,默认为latest。我们现在就想拉去1.25.3版本的镜像,那么具体操作如下图:

"Docker pull"命令的执行过程通常包括以下几个步骤:

  1. 连接到指定的Docker Registry。
  2. 检查本地是否已经有该镜像,如果已存在且与远程库中的版本一致,则跳过下载步骤。如果不一致,那么就更新本地镜像。
  3. 下载镜像的文件系统层(layers)。Docker镜像由多个只读的文件系统层组成,这些层会被逐个下载并组合在一起,形成一个完整的镜像。
  4. 解压和存储镜像。下载完成后,Docker引擎会将下载的镜像解压并存储在本地的镜像仓库中,以便后续使用。
    docker push

docker push命令,用于将本地构建的Docker镜像推送(上传)到远程的Docker镜像仓库中,但是要先登陆到镜像仓库。

docker push的具体使用方法如下:

  1. 首先,确保已经通过docker login命令登录到目标Docker镜像仓库。docker tag myimage:1.0 myrepo/myimage:1.0
  2. 接着,通过docker tag命令给本地构建的Docker镜像打上标签(也就是重命名),标明该镜像要推送到的仓库以及版本号。例如:docker tag myimage:1.0 myrepo/myimage:1.0,其中myimage:1.0为本地镜像的名称和版本号,myrepo为目标镜像仓库的地址和名称。
  3. 最后,运行docker push命令,并指定带有仓库地址和版本号的镜像名称。例如:docker push myrepo/myimage:1.0。Docker将会把本地镜像打包成一个压缩文件,并发送到远程仓库中。

下面我们先来来看一个实际例子来演示一下。首先我们需要有自己的一个仓库(下文会将怎么创建),如下图:

如上图所示,有一个名为mynginx的仓库,当进去如下图:

其中也提示我们推送镜像到该仓库的命令格式,然后我们也能看到Tags中已经有一个镜像(本人之前推送的)。现在我们先对刚刚拉取的镜像nginx:1.25.3打上标签(重命名)。如下图:

说明一下:docker images 是查询本地的镜像,后续会对该指令详解。

接下来我们就可以推送到docker hub上的mynginx仓库上了。具体如下:

我们再次在docker hub上进行查看,如下图:


docker serch

Docker search是用于在Docker Hub或其他Docker镜像仓库中搜索可用的镜像。使用docker search命令,您可以根据关键字来搜索相关的镜像。以下是docker search命令的语法:

cpp 复制代码
docker search [OPTIONS] TERM

其中,OPTIONS是可选的参数,TERM代表要搜索的关键字。

使用docker search命令时,您可以使用一些常用的选项来精确搜索所需的镜像。一些常见的选项包括:

  • --filter:按照特定的条件筛选搜索结果,如限制结果的星级、是否为官方镜像等。
  • --format:指定输出结果的格式。
  • --limit:限制返回结果的数量。

例如,从 Docker Hub 查找所有镜像名包含 nginx,并且 star 数大于 10 的镜像和只显示三个即可。 指令:docker search -f stars=10 --limit nginx。具体如下图:

搜索结果将以表格形式列出,包含镜像名称、描述信息、星级评分等。你可以根据自己的需求,选择相应的镜像进行下载与使用。通过docker pull命令可以将所需的镜像从镜像仓库下载到本地。
docker logout

登出(退出)一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub。该指令较为简单,就不再过多解释。当我们登出一个镜像仓库时,就不可以再次进行推送镜像。

六、镜像命令(部分)

我们先来了解几个镜像命令。注意:镜像仓库命令和镜像命令是有所区别的。镜像仓库命令重点是在仓库,镜像命令重点是在镜像
docker images

使用docker images命令可以列出所有在本地主机上存在的Docker镜像。对于每个镜像,它将显示以下信息:

  • 仓库名(Repository):镜像的名称,通常由仓库名和标签组成。标记(Tag)用于指定镜像的版本或标识。
  • 镜像标签(Tag):每个镜像都有自己的版本,也就是所对应的标签。
  • 镜像ID:每个Docker镜像都有一个唯一的ID。
  • 创建时间(Created):镜像的创建时间。
  • 镜像大小(Size):镜像的磁盘占用大小。

具体如法如下:

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

# 别名
docker image ls, docker image list

OPTIONS:在各个Docker版本中可能有所不同的选项,下面是一些常用选项的解释:

  • -a, --all:显示所有镜像,包括中间层镜像(intermediate layers)。
  • --digests:显示镜像的摘要信息(digests)。
  • --filter:通过指定过滤条件来筛选镜像。可以使用多个过滤条件,条件之间使用逗号分隔。
  • --format:指定输出的格式。
  • -q, --quiet:只显示镜像的ID。

下面我们来看两个实际例子。例出全部的本地镜像:

列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表:


docker image inspect

docker image inspect命令用于获取有关Docker镜像的详细信息。它提供了有关镜像的元数据、配置和历史记录的完整视图。以下是docker image inspect命令的详细解释:

bash 复制代码
docker image inspect [OPTIONS] IMAGE [IMAGE...]
  • OPTIONS:可以指定一些选项来定制输出,例如:

    • --format:指定输出的格式。
    • -s, --size:显示图层(layer)的大小信息。
  • IMAGE:指定要检查的镜像名称或ID。可以同时提供多个镜像参数,以获取其详细信息。

下面是一些示例:

  1. docker image inspect ubuntu:检查名为'ubuntu'的镜像,并打印出其所有详细信息。
  2. docker image inspect --format='{``{ json .Config }}' ubuntu:以JSON格式显示'ubuntu'镜像的相关配置信息。
  3. docker image inspect --format='{``{ .Size }}' ubuntu:只显示'ubuntu'镜像的大小信息。
  4. docker image inspect -s ubuntu:显示'ubuntu'镜像的层大小信息。

docker image inspect命令返回一个包含镜像详细信息的JSON对象。可以使用不同的格式化选项来选择性地提取所需的信息。您可以使用自定义模板语法定义输出的格式并访问镜像的各个属性。
docker tag

在Docker中,docker tag命令用于为一个已存在的镜像创建一个新的标签。它可以为镜像指定一个更友好或更具描述性的名称,也可以用于创建镜像的不同版本。以下是docker tag命令的详细解释:

cpp 复制代码
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • SOURCE_IMAGE:要标记的源镜像的名称或ID。

  • TAG:可选参数,用于指定版本号或标签名称。如果未提供该参数,默认为latest

  • TARGET_IMAGE:标记后的目标镜像的名称或ID。

我们再来结合之前的例子来理解一下,如下图:

七、容器命令(部分)

docker ps

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 :不截断输出。
  • -q :静默模式,只显示容器编号。
  • -s :显示总的文件大小。

示例用法及说明:

  1. docker ps:显示正在运行的容器的详细信息,包括容器ID、镜像名称、启动命令、运行时间等。
  2. docker ps -a:显示所有容器的详细信息,包括正在运行的和已停止的容器。
  3. docker ps -l:仅显示最近创建的容器的详细信息。
  4. docker ps -q:仅显示容器的ID,适用于在脚本或命令中引用容器ID。

下面我们结合例子来进一步理解一下。

docker run

在Docker中,docker run命令用于以容器的形式运行一个镜像。它是最常用的Docker命令之一,可以将容器启动为基于镜像的实例。以下是docker run命令的详细解释:

cpp 复制代码
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

OPTIONS:可选参数,用于配置和控制容器的各种方面。常见的选项包括:

  • -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命令的用法。
docker run nginx:1.25.3是启动nginx服务,如下图:

但是这个服务是运行在我们的前台的,所以导致我们无法输入其他指令。如下图可以看到nginx服务确实启动了。 在前台运行的服务可以通过 ctrl + c 来终止掉服务。如下图:

我们可以通过-d选项让其在后台运行。如下图:

通过上图也能看到,nginx服务启动后确实没有占用我们的前台会话,而是在后台运行!
当我们使用docker run命令时,可以通过使用 -i 选项来指定交互模式。该选项使得我们可以与正在运行的容器进行交互。

通过 -i 选项,我们可以将标准输入(stdin)绑定到正在运行的容器,这样我们就能够向容器发送输入。这通常用于需要与容器进行交互的任务,比如在容器内执行命令、调试容器或者运行一个交互式应用程序。

如下图我们可以看到本地镜像有一个Ubuntu的镜像:

现在我们运行它,并 加上-i 选项来看一下运行现象。如下图:

通过上图可以发现,确实绑定了标准输入,且可以正常输入指令。如果我们只是启动ubuntu镜像,并没有添加任何选项,由于没有指定任何命令或交互模式,容器在启动后立即退出。这是因为默认情况下,Docker容器会执行其默认的启动命令,然后执行完后自动停止。如下图:

我们虽然指定了交互模式,但是看起来并不是很舒服。-i 选项通常与 -t 选项结合着使用,-t 选项可以为容器分配一个伪输入终端,具体如下图:


当你使docker run -p -P用 docker run 命令时,可以通过 -p 或者 -P 参数来指定端口映射,将主机的端口与容器的端口进行关联。可以简单的理解为把给宿主机的某个端口的流量给到了所绑定容器端口。假如不映射端口,我们默认访问的是宿主机的端口,并不是该容器的端口。从而造成无法很好的访问容器的端口。我们看如下例子:

cpp 复制代码
docker run -p 8080:80 nginx:1.25.3

这意味着将主机上的 8080 端口与容器内的 80 端口进行映射。这样,当你访问主机的 8080 端口时,实际上是访问了容器内的 80 端口。这通常用于将容器中的服务暴露给主机以供外部访问。我们可通过dockers ps 进行查看:

-P参数将自动将容器内部的所有已公开(EXPOSE)的端口与主机上的随机端口进行映射。 例如,如果你运行以下命令:

cpp 复制代码
docker run -P nginx:1.25.3

我们在通过docker ps指令观察一下:

八、docker镜像仓库实战

8、1 搭建一个nginx服务

8、1、1 基础知识

我们先来认识一下Web服务器。Web 服务器一般是指"网站服务器",是指驻留于互联网上某种类型计算机的程序。Web 服务器可以向 Web 浏览器等客户端提供文档,也可以放置网站文件,让全世界浏览,更可以放置数据文件,让全世界下载。Web 服务器,也称为"WWW 服务器"( 英文全写: World Wide Web,翻译成中文:万维网或环球信息网 ),主要功能是"提供网上信息浏览服务"。 WWW 是 Internet(互联网)的多媒体信息查询工具,是 Internet(互联网)上发展起来的服务,也是发展最快和目前使用最广泛的服务。正是因为有了 WWW 工具,才使得近十几年来互联网迅速繁荣发展,用户数量飞速飙升。据最新数据显示,目前全球人口数量达到 76.76 亿人,其中全球"网民"(互联网用户)达到惊人的 43.88 亿。例如百度就是一个 web 服务器,提供搜索服务:


Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、 POP3、 SMTP 代理服务器; Nginx 可以作为一个 HTTP 服务器进行网站的发布处理,另外 Nginx 可以作为反向代理进行负载均衡的实现。可以理解 Nginx 是 web 服务器的一种实现。

  • Nginx可以作为反向代理服务器,将客户端的请求转发给后端的服务器进行处理。通过反向代理,Nginx可以实现负载均衡、缓存静态内容、提供SSL终端加密等功能,从而提高系统的稳定性和安全性。
  • Nginx内置有负载均衡机制,可以将请求分发给多个后端服务器,从而提高系统的整体性能和可用性。Nginx支持基于轮询、IP哈希、权重等算法的负载均衡策略,并且支持在运行时动态添加或删除后端服务器。
  • Nginx可以快速高效地提供静态文件的访问服务。它支持对静态文件的高速缓存,可通过配置实现静态文件的压缩、断点续传、目录索引等功能。

8、1、2 正向代理与反向代理

正向代理服务器和反向代理服务器是两种常见的代理服务器类型,它们在网络通信中起到了不同的作用。

正向代理服务器(Forward Proxy Server): 正向代理服务器是位于客户端和目标服务器之间的中间服务器它代表客户端向目标服务器发送请求,并将响应返回给客户端。正向代理服务器隐藏了客户端的真实IP地址,通过转发请求和响应来提供一些功能和优势,如隐私保护、访问控制、缓存以及加速访问等。

由于防火墙的原因,我们并不能直接访问谷歌,那么我们可以借助 VPN 来实现,这就是一个简单的正向代理的例子。这里你能够发现,正向代理"代理"的是客户端,而且客户端是知道目标的,而目标是不知道客户端是通过 VPN 访问的。

正向代理服务器具体功能和优势包括:

  • 隐私保护:客户端的真实IP地址被隐藏,目标服务器只能看到代理服务器的IP地址。
  • 访问控制:代理服务器可以根据策略对客户端的请求进行过滤和限制,从而实现访问控制。
  • 缓存:代理服务器可以缓存目标服务器的响应,当其他客户端发送相同的请求时,可以直接返回缓存的响应,减少网络流量和提高访问速度。
  • 加速访问:代理服务器可以通过压缩数据、优化网络连接等方式提高访问速度。
    VPN,即虚拟私人网络(Virtual Private Network),是一种通过公共网络(如互联网)构建的安全私人网络。它使用加密和隧道协议来提供用户与远程服务器之间的安全连接。

VPN的主要目的是保护用户的隐私和安全。通过VPN连接,用户可以在公共网络上实现私密、加密的通信。以下是VPN的一些主要特点和功能:

  1. 数据加密:VPN使用加密技术将用户的数据传输内容加密,确保传输过程中的数据安全。这样即使攻击者截获了数据包,也无法解密其中的内容。

  2. 匿名性:VPN隐藏了用户的真实IP地址,并提供了一个替代IP地址。这样可以保护用户的身份信息,防止被追踪或监控。

  3. 绕过地理限制:有些网站、服务或应用在特定地区可能被限制访问。通过连接到VPN服务器,用户可以获取该服务器所在地的IP地址,从而绕过地理限制,访问被限制的内容或服务。

  4. Wi-Fi安全:公共Wi-Fi网络存在一定风险,因为攻击者可以截获用户的数据。使用VPN可以在使用公共Wi-Fi时确保通信的安全性。

  5. 保密性:通过在VPN隧道中传输数据,可以保证用户的通信内容不被第三方 ** 。这对于商业机密信息或个人隐私非常重要。

  6. 远程访问:VPN允许用户通过Internet安全地访问公司内部网络资源,如文件、打印机等。这对于远程工作人员和分支机构之间的安全通信至关重要。

VPN提供了一个安全、私密的网络连接,保护了用户的隐私和数据安全,同时还提供了绕过地理限制的功能。无论是保护个人隐私,访问受限网站,还是远程访问公司资源,VPN都是非常有用的工具。
反向代理服务器(Reverse Proxy Server):反向代理服务器是位于目标服务器和客户端之间的中间服务器。它代表目标服务器向客户端发送响应,并将请求转发给目标服务器。反向代理服务器隐藏了目标服务器的真实IP地址,通过负载均衡和缓存等技术来提供一些功能和优势,如负载均衡、安全防护、高可用性以及缓存等。

当我们在外网访问百度的时候,其实会进行一个转发,代理到内网去,这就是所谓的反向代理,即反向代理"代理"的是服务器端,而且这一个过程对于客户端而言是透明的。

具体功能和优势包括:

  • 负载均衡:反向代理服务器可以将客户端的请求分发到多个目标服务器上,从而实现负载均衡,提高系统的性能和可扩展性。
  • 安全防护:反向代理服务器可以作为目标服务器的前置防火墙,对请求进行过滤、检查和处理,提供一定程度的安全保护,如DDoS攻击防御、Web应用防火墙等。
  • 高可用性:反向代理服务器可以通过健康检查、故障转移和自动切换等机制,确保目标服务器的高可用性,即当某个目标服务器不可用时,可以自动切换到其他可用的服务器。
  • 缓存:反向代理服务器可以缓存目标服务器的响应,当有相同的请求时,可以直接返回缓存的响应,减少目标服务器的负载并提高访问速度。

正向代理和反向代理服务器在网络通信中发挥了重要的作用,根据实际需求选择合适的代理服务器类型可以提高网络性能、安全性和可用性。

8、1、3 本地安装并启动nginx服务

安装指令如下:

bash 复制代码
# centos 配置 nginx 源
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginxrelease-centos-7-0.el7.ngx.noarch.rpm

# 安装
yum install -y nginx

启动 nginx 作为一个网站:

如果没有启动,就手动启动:

安装成功后,我们可以其配置文件,默认路径:/etc/nginx/nginx.conf。如下图:

通过上图我们也能够看到,其默认监听端口是80,然后root目录为/usr/share/nginx/html。我们可以看一下该目录下的文件:

当我们不指定明确访问的资源时,默认情况下都是访问根目录下的index.html。我们可以看一下其内容:

我们可以在Web浏览器上访问一下该网页,如下图:

从docker hub 上拉取nginx镜像就不再解释,上文中也讲述到了拉去镜像的指令学习。

8、2 在docker hub 上创建自己的仓库

8、2、1 BusyBox

BusyBox 是一个集成了三百多个最常用 Linux 命令和工具的软件。 BusyBox 包含了一些简单的工具,例如 ls、 cat 和 echo 等等,还包含了一些更大、更复杂的工具,例grep、 find、 mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说 BusyBox 就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Linux 系统的自带的 shell。 busybox 是一个集成了一百多个最常用 linux 命令和工具的软件,他甚至还集成了一个 http 服务器和一个 telnet 服务器,而所有这一切功能却只有区区 1M 左右的大小。因海外带宽较小,我们拉取该镜像推送到自己的仓库。

BusyBox的安装:

bash 复制代码
# Ubuntu 安装
apt install -y busybox

# CentOS 安装
wget https://busybox.net/downloads/binaries/1.28.1-defconfigmultiarch/busybox-x86_64 --no-check-certificate

# 重命名
mv busybox-x86_64 busybox

# 修改权限并执行
chmod +x busybox
./busybox

这里我已经安装好了,就不再给大家演示。具体如下图:

我们可以通过shell进行运行busybox,并执行一些指令。如下:

cpp 复制代码
./busybox ls
./busybox ifconfig
./busybox ifconfig |busybox grep lo

具体如下图:

8、2、2 创建账号

  1. 拉取 busybox 镜像;

  2. 镜像打标签;

    cpp 复制代码
    docker tag busybox:latest maxhou/mybusybox:v0.1
  3. 此时查看我们多了个镜像;

  4. 推送镜像到仓库,报错,因为没有登录;

  5. 登录 docker hub;

  6. 推送镜像成功。

当推送成功后,我们就可以在自己的docker hub仓库中查看!

相关推荐
Stark-C1 分钟前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
Smile丶凉轩28 分钟前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
微信-since8119236 分钟前
[ruby on rails] 安装docker
后端·docker·ruby on rails
pumpkin845142 小时前
GitHub 和 GitLab
gitlab·github
吴半杯2 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
今天我刷leetcode了吗2 小时前
docker 配置同宿主机共同网段的IP 同时通过通网段的另一个电脑实现远程连接docker
tcp/ip·docker·电脑
lwprain3 小时前
常用docker应用部署,wordpress、mysql、tomcat、nginx、redis
mysql·docker·tomcat
会讲英语的码农4 小时前
Git项目管理
gitee·github
Code_Artist5 小时前
使用Portainer来管理并编排Docker容器
docker·云原生·容器
mengao12345 小时前
centos 服务器 docker 使用代理
服务器·docker·centos