当前位置: 首页> 科技> 互联网 > 软件开发工程师访谈报告_杭州市建设工程管理集团有限公司_一句吸引人的广告语_世界比分榜

软件开发工程师访谈报告_杭州市建设工程管理集团有限公司_一句吸引人的广告语_世界比分榜

时间:2025/9/12 17:47:49来源:https://blog.csdn.net/rubys007/article/details/143496562 浏览次数:0次
软件开发工程师访谈报告_杭州市建设工程管理集团有限公司_一句吸引人的广告语_世界比分榜

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

介绍

Docker Registry 是一个管理存储和传递 Docker 容器镜像的应用程序。注册表集中了容器镜像,并减少了开发人员的构建时间。Docker 镜像通过虚拟化保证了相同的运行环境,但构建镜像可能需要相当大的时间投入。例如,开发人员可以从注册表中下载一个包含所有必要组件的压缩镜像,而不是单独安装依赖和软件包来使用 Docker。此外,开发人员可以使用持续集成工具(如 TravisCI)自动将镜像推送到注册表,以便在生产和开发过程中无缝更新镜像。

Docker 还有一个免费的公共注册表 Docker Hub,可以托管您的自定义 Docker 镜像,但有些情况下您可能不希望您的镜像公开可用。镜像通常包含运行应用程序所需的所有代码,因此在使用专有软件时,使用私有注册表更为可取。

在本教程中,您将设置和保护自己的私有 Docker 注册表。您将使用 Docker Compose 定义配置来运行您的 Docker 应用程序,并使用 Nginx 将服务器流量从 HTTPS 转发到运行中的 Docker 容器。完成本教程后,您将能够将自定义 Docker 镜像推送到您的私有注册表,并从远程服务器安全地拉取镜像。

先决条件

在开始本指南之前,您需要以下内容:

  • 通过遵循 Ubuntu 18.04 初始服务器设置指南 设置的两台 Ubuntu 18.04 服务器,包括一个 sudo 非根用户和一个防火墙。一台服务器将托管您的私有 Docker 注册表,另一台将作为您的客户端服务器。
  • 通过遵循在 Ubuntu 18.04 上安装 Docker-Compose 教程 安装在两台服务器上安装 Docker 和 Docker-Compose。您只需要完成该教程的第一步来安装 Docker Compose。该教程解释了如何在先决条件中安装 Docker。
  • 在您的私有 Docker 注册表服务器上安装了 Nginx,方法是遵循在 Ubuntu 18.04 上安装 Nginx 教程。
  • 使用 Let’s Encrypt 为私有 Docker 注册表服务器上的 Nginx 进行了安全设置,方法是遵循如何使用 Let’s Encrypt 安全设置 Nginx。确保在第 4 步中将所有流量从 HTTP 重定向到 HTTPS。
  • 一个解析到您用于私有 Docker 注册表的服务器的域名。您将在 Let’s Encrypt 先决条件的一部分中设置这个。

步骤 1 — 安装和配置 Docker 注册表

Docker 命令行工具对于启动和管理一个或两个 Docker 容器非常有用,但是,大多数在 Docker 容器内运行的应用程序需要其他组件并行运行。例如,许多 Web 应用程序由一个 Web 服务器(如 Nginx)组成,用于提供应用程序的代码,一个解释性脚本语言(如 PHP),以及一个像 MySQL 这样的数据库服务器。

使用 Docker Compose,您可以编写一个 .yml 文件来设置每个容器的配置和容器之间通信所需的信息。然后,您可以使用 docker-compose 命令行工具来向组成您的应用程序的所有组件发出命令。

Docker 注册表本身就是一个具有多个组件的应用程序,因此您将使用 Docker Compose 来管理您的配置。要启动注册表的一个实例,您将设置一个 docker-compose.yml 文件来定义注册表将存储其数据的位置。

在您创建用于托管私有 Docker 注册表的服务器上,您可以使用以下命令创建一个 docker-registry 目录,进入该目录,然后创建一个带有以下命令的 data 子文件夹:

mkdir ~/docker-registry && cd $_
mkdir data

使用您的文本编辑器创建 docker-compose.yml 配置文件:

nano docker-compose.yml

将以下内容添加到文件中,该内容描述了 Docker 注册表的基本配置:


version: '3'services:registry:image: registry:2ports:- "5000:5000"environment:REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /datavolumes:- ./data:/data

environment 部分在 Docker 注册表容器中设置了一个环境变量,其路径为 /data。Docker 注册表应用程序在启动时检查此环境变量,因此开始将其数据保存到 /data 文件夹中。

然而,由于您包含了 volumes: - ./data:/data 行,Docker 将开始将该容器中的 /data 目录映射到注册表服务器上的 /data。最终结果是 Docker 注册表的所有数据都存储在注册表服务器上的 ~/docker-registry/data 中。

ports 部分,配置为 5000:5000,告诉 Docker 将服务器上的端口 5000 映射到运行中的容器中的端口 5000。这允许您向服务器上的端口 5000 发送请求,并将请求转发到注册表应用程序。

您现在可以启动 Docker Compose 来检查设置:

docker-compose up

您将在输出中看到下载条,显示 Docker 从其自己的注册表中下载 Docker 注册表镜像。一两分钟内,您将看到类似以下内容的输出(版本可能有所不同):

[secondary_label Output of docker-compose up]
Starting docker-registry_registry_1 ... done
Attaching to docker-registry_registry_1
registry_1  | time="2018-11-06T18:43:09Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="redis not configured" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="Starting upload purge in 20m0s" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="listening on [::]:5000" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2

您稍后将解决 No HTTP secret provided 警告消息。输出显示容器正在启动。输出的最后一行显示它已成功开始监听端口 5000

默认情况下,Docker Compose 将保持等待您的输入,因此按下 CTRL+C 关闭您的 Docker 注册表容器。

您已经设置了一个完整的 Docker 注册表,监听端口 5000。此时,注册表不会自动启动,除非您手动启动它。此外,Docker 注册表没有任何内置的身份验证机制,因此目前是不安全的,并且完全向公众开放。在接下来的步骤中,您将解决这些安全问题。

步骤 2 —— 设置 Nginx 端口转发

您已经在 Docker Registry 服务器上使用 Nginx 设置了 HTTPS,这意味着您现在可以设置从 Nginx 到端口 5000 的端口转发。完成此步骤后,您可以直接在 example.com 上访问您的注册表。

作为使用 Let’s Encrypt 安全 Nginx 的先决条件的一部分,您已经设置了包含服务器配置的 /etc/nginx/sites-available/example.com 文件。

使用文本编辑器打开此文件:

sudo nano /etc/nginx/sites-available/example.com

找到现有的 location 行。它看起来像这样:

...
location / {...
}
...

您需要将流量转发到端口 5000,您的注册表将在该端口上运行。您还希望在请求到达注册表时附加标头,这些标头会为每个请求和响应提供来自服务器的附加信息。删除 location 部分的内容,并将以下内容添加到该部分:

...
location / {# 不允许来自 docker 1.5 及更早版本的连接# docker 1.6.0 之前的版本未正确设置 ping 的用户代理,捕获 "Go *" 用户代理if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {return 404;}proxy_pass                          http://localhost:5000;proxy_set_header  Host              $http_host;   # docker 客户端所需proxy_set_header  X-Real-IP         $remote_addr; # 传递真实客户端 IPproxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;proxy_set_header  X-Forwarded-Proto $scheme;proxy_read_timeout                  900;
}
...

$http_user_agent 部分验证客户端的 Docker 版本是否高于 1.5,并确保 UserAgent 不是 Go 应用程序。由于您使用的是注册表的 2.0 版本,不支持旧客户端。有关更多信息,您可以在 Docker 的注册表 Nginx 指南中找到 nginx 标头配置。

保存并退出文件。通过重新启动 Nginx 应用更改:

sudo service nginx restart

您可以通过运行注册表来确认 Nginx 是否将流量转发到端口 5000

cd ~/docker-registry
docker-compose up

在浏览器窗口中,打开以下网址:

https://example.com/v2

您将看到一个空的 JSON 对象,或者:

{}

在您的终端中,您将看到类似以下的输出:

[secondary_label Output of docker-compose up]
registry_1  | time="2018-11-07T17:57:42Z" level=info msg="response completed" go.version=go1.7.6 http.request.host=cornellappdev.com http.request.id=a8f5984e-15e3-4946-9c40-d71f8557652f http.request.method=GET http.request.remoteaddr=128.84.125.58 http.request.uri="/v2/" http.request.useragent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7" http.response.contenttype="application/json; charset=utf-8" http.response.duration=2.125995ms http.response.status=200 http.response.written=2 instance.id=3093e5ab-5715-42bc-808e-73f310848860 version=v2.6.2
registry_1  | 172.18.0.1 - - [07/Nov/2018:17:57:42 +0000] "GET /v2/ HTTP/1.0" 200 2 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7"

您可以从最后一行看到对 /v2/GET 请求,这是您从浏览器发送请求的端点。容器收到了您通过端口转发发送的请求,并返回了一个 {} 的响应。输出的最后一行中的代码 200 表示容器成功处理了请求。

现在您已经设置了端口转发,可以继续改进注册表的安全性。

步骤 3 —— 设置认证

通过 Nginx 正确代理请求后,您现在可以使用 HTTP 认证来保护您的 Docker Registry,以便管理谁可以访问。为了实现这一点,您将使用 htpasswd 创建一个认证文件,并向其中添加用户。HTTP 认证可以快速设置,并且在 HTTPS 连接下非常安全,这也是注册表将要使用的连接方式。

您可以通过运行以下命令来安装 htpasswd 软件包:

sudo apt install apache2-utils

现在,您将创建一个目录来存储认证凭据,并切换到该目录。$_ 展开为上一个命令的最后一个参数,即 ~/docker-registry/auth

mkdir ~/docker-registry/auth && cd $_

接下来,您将创建第一个用户,如下所示,将 username 替换为您想要使用的用户名。-B 标志指定 bcrypt 加密,这比默认加密更安全。在提示时输入密码:

htpasswd -Bc registry.password username

接下来,您将编辑 docker-compose.yml 文件,告诉 Docker 使用您创建的文件来认证用户。

cd ~/docker-registry
nano docker-compose.yml

您可以通过编辑 docker-compose.yml 文件,向其中添加环境变量和 auth/ 目录的卷,告诉 Docker 您希望如何认证用户。向文件添加以下突出显示的内容:

version: '3'services:registry:image: registry:2ports:- "5000:5000"environment:REGISTRY_AUTH: htpasswdREGISTRY_AUTH_HTPASSWD_REALM: RegistryREGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwordREGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /datavolumes:- ./auth:/auth- ./data:/data

对于 REGISTRY_AUTH,您已经指定了 htpasswd,这是您正在使用的认证方案,并将 REGISTRY_AUTH_HTPASSWD_PATH 设置为认证文件的路径。最后,REGISTRY_AUTH_HTPASSWD_REALM 表示 htpasswd 领域的名称。

您现在可以通过运行注册表并检查它是否提示用户输入用户名和密码来验证您的认证是否正确。

docker-compose up

在浏览器窗口中打开 https://example.com/v2

在输入 username 和相应密码后,您将再次看到 {}。您已确认了基本认证设置:只有在输入正确的用户名和密码后,注册表才会返回结果。您现在已经保护了您的注册表,并可以继续使用它。

步骤 4 —— 将 Docker Registry 设置为服务启动

您希望确保注册表在系统启动时启动。如果发生任何意外的系统崩溃,您希望确保注册表在服务器重新启动时重新启动。打开 docker-compose.yml

nano docker-compose.yml

registry: 下添加以下行内容:

...registry:restart: always
...

您可以将注册表作为后台进程启动,这将允许您退出 ssh 会话并保持进程:

docker-compose up -d

注册表在后台运行后,您现在可以准备 Nginx 进行文件上传。

步骤 5 —— 增加 Nginx 的文件上传大小

在您可以将镜像推送到注册表之前,您需要确保您的注册表能够处理大文件上传。尽管 Docker 将大型镜像上传拆分为单独的层,但有时它们可能超过 1GB。默认情况下,Nginx 对文件上传有 1MB 的限制,因此您需要编辑 nginx 的配置文件,并将最大文件上传大小设置为 2GB

sudo nano /etc/nginx/nginx.conf

找到 http 部分,并添加以下行:

...
http {client_max_body_size 2000M;...
}
...

最后,重新启动 Nginx 以应用配置更改:

sudo service nginx restart

现在,您可以在不出现 Nginx 错误的情况下向您的 Docker Registry 上传大型镜像。

步骤 6 —— 发布到您的私有 Docker Registry

您现在已经准备好将镜像发布到您的私有 Docker Registry,但首先您需要创建一个镜像。在本教程中,您将创建一个基于 Docker Hub 上的 ubuntu 镜像的简单镜像。Docker Hub 是一个公共托管的注册表,有许多预配置的镜像,可以快速地将应用程序 Docker 化。使用 ubuntu 镜像,您将测试向您的注册表推送和拉取。

从您的 客户端 服务器上,创建一个小的空镜像以推送到您的新注册表,-i-t 标志为您提供了对容器的交互式 shell 访问:

[environment second]
docker run -t -i ubuntu /bin/bash

下载完成后,您将进入 Docker 提示符,注意 root@ 后面的容器 ID 将会有所不同。通过在文件系统中创建一个名为 SUCCESS 的文件,快速更改文件系统。在下一步中,您将能够使用此文件来确定发布过程是否成功:

[environment second]
touch /SUCCESS

退出 Docker 容器:

[environment second]
exit

以下命令将基于已运行的镜像创建一个名为 test-image 的新镜像,以及您所做的任何更改。在我们的情况下,/SUCCESS 文件的添加将包含在新镜像中。

提交更改:

[environment second]
docker commit $(docker ps -lq) test-image

此时,该镜像仅存在于本地。现在,您可以将其推送到您创建的新注册表。登录到您的 Docker Registry:

[environment second]
docker login https://example.com

输入之前的 username 和相应密码。接下来,您将使用私有注册表的位置为镜像打标签,以便推送到它:

[environment second]
docker tag test-image example.com/test-image

将新标记的镜像推送到注册表:

[environment second]
docker push example.com/test-image

您的输出将类似于以下内容:


[environment second]
The push refers to a repository [example.com/test-image]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...

您已验证您的注册表处理用户认证,并允许经过身份验证的用户向注册表推送镜像。接下来,您将确认您也能够从注册表中拉取镜像。

步骤 7 — 从私有 Docker Registry 拉取镜像

返回到你的注册服务器,这样你就可以测试从你的 客户端 服务器拉取镜像。也可以从第三台服务器进行测试。

使用之前设置的用户名和密码登录:

docker login https://example.com

现在你已经准备好拉取镜像了。使用你的域名和在上一步中打标签的镜像名称:

docker pull example.com/test-image

Docker 将会下载镜像并返回到提示符。如果你在注册服务器上运行镜像,你会看到之前创建的 SUCCESS 文件:

docker run -it example.com/test-image /bin/bash

在 bash shell 中列出你的文件:

ls

你会看到你为这个镜像创建的 SUCCESS 文件:

SUCCESS  bin  boot  dev  etc  home  lib  lib64  media   mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

你已经完成了设置一个安全的注册表,用户可以推送和拉取自定义镜像。

结论

在本教程中,你设置了自己的私有 Docker Registry,并发布了一个 Docker 镜像。正如在介绍中提到的,你也可以使用 TravisCI 或类似的 CI 工具来自动推送到私有注册表。通过利用 Docker 和注册表到你的工作流程中,你可以确保包含代码的镜像在任何机器上(无论是在生产环境还是开发环境)都会产生相同的行为。关于编写 Docker 文件的更多信息,你可以阅读这篇解释该过程的 Docker 教程。

关键字:软件开发工程师访谈报告_杭州市建设工程管理集团有限公司_一句吸引人的广告语_世界比分榜

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: