专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

Docker全方位攻略与自动化运维

  Docker全方位攻略与自动化运维
  介绍
  DockerRegistry(Docker注册中心)是一个管理Docker容器镜像存储和交付的应用程序。注册中心集中容器镜像并减少开发人员的构建时间。Docker镜像通过虚拟化保证相同的运行环境,但是构建镜像需要大量的时间投入。例如,开发人员可以从包含所有必要组件的注册中心下载压缩镜像,而不是单独安装依赖项和包来使用Docker。此外,开发人员可以使用持续集成工具,例如:Buddy自动将镜像推送到注册中心,以在生产和开发过程中无缝更新镜像。
  DockerHub是一个免费公共的注册中心,可以托管您的自定义Docker镜像,但在某些情况下您不希望您的镜像公开使用。镜像通常包含运行应用程序所需的所有代码,因此在使用专有软件时最好使用私有的注册中心。
  通过本文您将学到以下的大致内容:Ubuntu22。04初始服务器设置指南如何在Ubuntu22。04上安装和使用Docker如何在Ubuntu22。04上安装和使用DockerCompose如何在Ubuntu22。04上安装Nginx如何在Ubuntu22。04上使用LetsEncrypt安全地使用Nginx如何在Ubuntu22。04上设置私有Docker注册中心DevOps开发运维一体化与Docker完美结合初始服务器设置
  首次新建Ubuntu22。04服务器时,您应该执行一些重要的配置步骤作为初始设置的一部分。这些步骤将提高服务器的安全性和可用性,并为您的后续操作打下坚实的基础。登录为root
  要登录到您的服务器,您需要知道服务器的公网IP地址。您还需要root用户帐户密码或密钥(如果您安装了用于身份验证的SSH密钥)。
  如果当前未连接到您的服务器,请使用以下命令以root用户身份登录。将命令中您的公网IP部分替换为您服务器的公网IP地址:sshroot您的公网IP
  接受有关主机显示的提示(如果出现)。如果您的服务器使用密码身份验证,请提供您的root密码以登录。如果您使用受密码保护的SSH密钥,您可能需要在每次会话首次使用该密钥时输入密码如果这是您第一次使用密码登录服务器,您可能还需要更改root密码。如果收到提示,请按照说明更改密码即可。
  关于root
  root用户是Linux环境中具有提升权限的管理用户。由于root帐户具有更高的权限,因此不鼓励您经常使用root。root帐户可以做出非常具有破坏性的更改,即使是意外的操作也可能带来很大的破坏。
  下一步是设置一个新的用户帐户,降低日常使用的权限。稍后,我们将向您展示如何在您需要时临时获得更高的权限。新建用户
  以root身份登录后,您将能够添加新的用户帐户。将来,我们将使用这个新帐户而不是root登录。
  此示例创建一个名为edal的新用户,但您应该将其替换为您喜欢的用户名:adduseredal
  您将被要求回答一些问题,首先是帐户密码。
  输入一个强悍的密码,如果需要的话,填写任何附加信息。这些信息不是必需的,您可以在任何您想跳过的字段中按回车键。授予管理员权限
  现在您拥有一个具有普通帐户权限的新用户帐户。然而,您有时需要以root用户身份执行管理任务。
  为了避免注销您的常规用户并重新登录root帐户,您可以为用户的常规帐户设置所谓的超级用户roo权限。这些权限将允许您的普通用户在命令前加上sudo以使用管理权限运行命令。
  要将这些权限添加到您的新用户中,您需要将用户添加到sudo系统组中。在Ubuntu22。04上,默认情况下属于sudo组的用户可以使用sudo命令。
  以root身份运行此命令将您的新用户添加到sudo组中:usermodaGsudoedal
  您现在可以在命令前键入sudo,以在以普通用户身份登录时以超级用户权限运行。设置防火墙
  Ubuntu22。04服务器可以使用UFW防火墙来确保只允许连接到某些服务。您可以使用此应用程序设置基本防火墙。
  应用程序可以在安装时向UFW注册它们的配置文件。这些配置文件允许UFW按名称管理这些应用程序。OpenSSH,允许您连接到您的服务器的服务,有一个在UFW注册的配置文件。
  您可以通过键入以下内容来检查已安装的UFW配置文件列表:ufwapplist输出信息Availableapplications:OpenSSH
  您需要确保防火墙允许SSH连接,以便您下次可以登录到您的服务器。通过键入以下内容允许这些连接:ufwallowOpenSSH
  然后输入以下命令启用防火墙ufwenable
  输入y并按回车键继续。您可以通过键入以下内容看到仍然允许SSH连接:ufwstatus输出信息Status:activeToActionFromOpenSSHALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)
  防火墙当前阻止除SSH之外的所有连接。如果您安装和配置附加服务,您将需要调整防火墙设置以允许新流量进入您的服务器。为普通用户启用外部访问
  现在您已经有了日常使用的普通用户,您需要确保可以通过SSH直接连接到该帐户。
  为新用户配置SSH访问取决于您服务器的根帐户是使用密码还是SSH密钥进行身份验证。
  如果root账户使用密码认证
  如果您使用密码登录到您的root帐户,则会为SSH启用密码身份验证。您可以通过打开一个新的终端会话并使用SSH和您的新用户名连SSH到您的新用户帐户:sudocommandtorun
  如果root账户使用SSH密钥认证
  如果您使用SSH密钥登录到您的根帐户,则SSH的密码身份验证将被禁用。要使用SSH密钥以普通用户身份登录,您必须将本地公钥的副本添加到新用户的。sshauthorizedkeys文件中。
  由于您的公钥已经在服务器上根帐户的。sshauthorizedkeys文件中,您可以使用当前会话将该文件和目录结构复制到新用户帐户。
  复制具有正确所有权和权限的文件的最简单方法是使用rsync命令。此命令将复制root用户的。ssh目录、保留权限并修改文件所有者,所有这些都在一个命令中完成。确保更改相关命令以匹配您的常规用户名:注
  rsync命令处理以斜杠结尾与没有斜杠不同在下面使用rsync时,请确保源目录(。ssh)不包含尾部斜杠(检查以确保您没有使用。ssh)。
  如果您不小心在命令中添加斜杠结尾,rsync会将root帐户的。ssh目录的内容复制到sudo用户的主目录,而不是复制整个。ssh目录结构。若如此文件将位于错误的位置,SSH将无法找到和使用。
  rsyncarchivechownedal:edal。sshhomeedal
  现在,在你的本地机器上打开一个新的终端会话,并使对新用户名使用SSH:sshedalyourserverip
  您就能使用新用户帐户连接到服务器而无需使用密码。请记住,如果您需要以管理权限运行命令,请在命令前键入sudo,如下所示:sudo加上命令
  每次会话首次使用sudo时(之后会定期提示),系统都会提示您输入普通用户的密码。安装和使用Docker安装Docker
  官方Ubuntu存储仓中提供的Docker安装包可能不是最新版本。为确保获得最新版本,我们将从官方Docker存储仓安装Docker。为此,我们将添加一个新的包源,添加来自Docker的GPG密钥以确保下载有效,然后安装软件包。
  首先,更新您现有的软件包列表:sudoaptupdate
  接下来,安装一些先决条件包,让apt通过HTTPS使用软件包:sudoaptinstallapttransporthttpscacertificatescurlsoftwarepropertiescommon
  然后将官方Docker存储仓的GPG密钥添加到您的系统中:curlfsSLhttps:download。docker。comlinuxubuntugpgsudogpgdearmorousrsharekeyringsdockerarchivekeyring。gpg
  将Docker存储仓添加到APT源:echodeb〔arch(dpkgprintarchitecture)signedbyusrsharekeyringsdockerarchivekeyring。gpg〕https:download。docker。comlinuxubuntu(lsbreleasecs)stablesudoteeetcaptsources。list。ddocker。listdevnull
  再次更新您现有的软件包列表,以便识别添加内容:sudoaptupdate
  确保您要从Docker存储仓而不是默认的Ubuntu存储仓进行安装:aptcachepolicydockerce
  你会看到类似的输出,Docker的版本号可能不同:dockerce:Installed:5:23。0。11ubuntu。22。04jammyCandidate:5:23。0。11ubuntu。22。04jammyVersiontable:5:23。0。11ubuntu。22。04jammy500500https:download。docker。comlinuxubuntujammystableamd64Packages100varlibdpkgstatus5:23。0。01ubuntu。22。04jammy500500https:download。docker。comlinuxubuntujammystableamd64Packages5:20。10。2330ubuntujammy500500https:download。docker。comlinuxubuntujammystableamd64Packages
  请注意,dockerce未安装,但安装候选来自Ubuntu22。04(jammy)的Docker存储仓。
  最后,安装Docker:sudoaptinstalldockerce
  现在安装Docker,启动守护进程,并启用启动时启动的进程。检查它是否正在运行:sudosystemctlstatusdocker
  输出类似于以下内容,表明该服务处于启用状态并正在运行:docker。serviceDockerApplicationContainerEngineLoaded:loaded(libsystemdsystemdocker。service;enabled;vendorpreset:enabled)Active:active(running)sinceMon2023022015:53:30CST;3min29sagoTriggeredBy:docker。socketDocs:https:docs。docker。comMainPID:1088(dockerd)Tasks:23Memory:125。2MCPU:3。375sCGroup:system。slicedocker。service1088usrbindockerdHfd:containerdruncontainerdcontainerd。sock
  现在安装Docker不仅可以提供Docker服务(守护进程),还可以提供docker命令行实用程序或Docker客户端。我们将在本教程后面探讨如何使用docker命令。无Sudo执行Docker命令(选修)
  默认情况下,docker命令只能由root用户或docker用户组运行,docker用户组是在Docker安装过程中自动创建。如果您尝试在不使用sudo前缀或不在docker用户组中的情况下运行docker命令,您将获得如下输出:docker:CannotconnecttotheDockerdaemon。Isthedockerdaemonrunningonthishost?。Seedockerrunhelp。
  如果您想在运行docker命令时避免键入sudo,请将您的用户名添加到docker用户组:sudousermodaGdocker{USER}
  要应用新的组员级别,请退出服务器并重新登录,或键入以下内容:su{USER}
  系统将提示您输入用户密码以继续。
  通过键入以下内容确认您的用户现在已添加到docker用户组:groups输出edalsudodocker
  如果您需要将用户添加到您未登录的docker用户组,请声明该用户名:sudousermodaGdocker用户名
  本文的其余部分以docker用户组中的用户身份运行docker命令为示例。如果您不想这样做,请在命令前加上sudo。
  接下来让我们来实践docker命令。Docker命令的运用
  使用docker包括向其传递一系列选项和命令,然后是参数。语法采用以下形式:docker〔选项〕〔命令〕〔参数〕
  要查看所有可用的子命令,请键入:docker
  Docker版本23。0。1可用子命令的完整列表如下:Commands:attachAttachlocalstandardinput,output,anderrorstreamstoarunningcontainercommitCreateanewimagefromacontainerschangescpCopyfilesfoldersbetweenacontainerandthelocalfilesystemcreateCreateanewcontainerdiffInspectchangestofilesordirectoriesonacontainersfilesystemeventsGetrealtimeeventsfromtheserverexportExportacontainersfilesystemasatararchivehistoryShowthehistoryofanimageimportImportthecontentsfromatarballtocreateafilesystemimageinspectReturnlowlevelinformationonDockerobjectskillKilloneormorerunningcontainersloadLoadanimagefromatararchiveorSTDINlogsFetchthelogsofacontainerpausePauseallprocesseswithinoneormorecontainersportListportmappingsoraspecificmappingforthecontainerrenameRenameacontainerrestartRestartoneormorecontainersrmRemoveoneormorecontainersrmiRemoveoneormoreimagessaveSaveoneormoreimagestoatararchive(streamedtoSTDOUTbydefault)startStartoneormorestoppedcontainersstatsDisplayalivestreamofcontainer(s)resourceusagestatisticsstopStoponeormorerunningcontainerstagCreateatagTARGETIMAGEthatreferstoSOURCEIMAGEtopDisplaytherunningprocessesofacontainerunpauseUnpauseallprocesseswithinoneormorecontainersupdateUpdateconfigurationofoneormorecontainerswaitBlockuntiloneormorecontainersstop,thenprinttheirexitcodes
  要查看特定命令可用的选项,请键入:dockerdockersubcommandhelp
  要查看有关Docker的系统范围信息,请使用:dockerinfo
  让我们探索其中的一些命令。我们将从处理镜像开始。使用Docker镜像
  Docker容器通过Docker镜像构建。默认情况下,Docker从DockerHub中提取这些镜像,这是一个由Docker项目公司管理的Docker注册中心,任何人都可以在DockerHub上托管他们的Docker镜像,因此您需要的大多数应用程序和Linux发行版都在那里有托管的镜像。
  要检查您是否可以从DockerHub访问和下载镜像,请键入:dockerrunhelloworld
  输出将显示Docker正常工作:Unabletofindimagehelloworld:latestlocallylatest:Pullingfromlibraryhelloworld2db29710123e:PullcompleteDigest:sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefbStatus:Downloadednewerimageforhelloworld:latestHellofromDocker!Thismessageshowsthatyourinstallationappearstobeworkingcorrectly。。。。
  Docker初始无法在本地找到helloworld镜像,因此它从默认存储仓DockerHub下载该镜像。下载镜像后,Docker从镜像创建一个容器并在容器内执行应用程序同时显示消息。
  您可以使用带有search子命令的docker命令来搜索DockerHub上可用的镜像。例如,要搜索Ubuntu镜像,请键入:dockersearchubuntu
  该脚本将抓取DockerHub并返回名称与搜索字符串匹配的所有镜像列表。在这种情况下,输出将类似于以下信息:NAMEDESCRIPTIONSTARSOFFICIALAUTOMATEDubuntuUbuntuisaDebianbasedLinuxoperatingsys15619〔OK〕webspherelibertyWebSphereLibertymultiarchitectureimages291〔OK〕openlibertyOpenLibertymultiarchitectureimagesbased57〔OK〕neurodebianNeuroDebianprovidesneuroscienceresearchs98〔OK〕ubuntudebootstrapDEPRECATED;useubuntuinstead50〔OK〕。。。
  在OFFICIAL栏中,OK表示由项目背后的公司构建和支持的镜像。确定要使用的镜像后,您可以使用pull子命令将其下载到您的计算机上。
  执行以下命令将官方ubuntu镜像下载到您的计算机:dockerpullubuntu
  您将看到所显示的信息如下:Usingdefaulttag:latestlatest:PullingfromlibraryubuntuDigest:sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7fStatus:Imageisuptodateforubuntu:latestdocker。iolibraryubuntu:latest
  下载镜像后,您可以通过下载的镜像使用run子命令运行容器。正如您在helloworld示例中看到的那样,如果在使用run子命令执行docker时尚未下载镜像,则Docker客户端将先下载镜像,然后使用它运行容器。
  要查看已下载到您的计算机的图像,请键入:dockerimages
  您将看到所显示的信息如下:helloworldlatestfeb5d9fea6a517monthsago13。3kBubuntu20。04e40cf56b4be32weeksago72。8MBubuntu22。0458db3edaf2be3weeksago77。8MBubuntulatest58db3edaf2be3weeksago77。8MB
  如您将在本文后面看到的那样,您可以修改用于运行容器的镜像并用于生成新镜像,然后可以将这些镜像上传推送(推送是技术术语)到DockerHub或其他Docker注册中心。
  下面,让我们更详细地了解如何运行容器。运行Docker容器
  您在以上运行的helloworld容器是在发出测试消息后运行和退出的容器示例。容器可不仅仅有这样的功能,且容器可以进行交互使用。毕竟,它们类似于虚拟机,只是对资源运用更为友好。
  例如,让我们使用最新的Ubuntu镜像运行一个容器。i和t组合使您可以通过交互式shell访问容器:dockerrunitubuntu
  您的命令提示应该更改以反映您现在在容器内工作的情况,且如下所示:输出信息rootc1c84b562c09:
  请注意命令提示中的容器ID。在此示例中为c1c84b562c09。稍后您将需要该容器ID以在您想要删除它时识别该容器。
  现在您可以在容器内运行任何命令。例如,让我们更新容器内的包数据库。您不需要在任何命令前加上sudo前缀,因为您是以root用户身份在容器内操作:rooteb0d0364eb18:aptupdate
  然后可以在其中安装任何应用程序,让我们安装Node。js看看:root6327df395f88:aptinstallnodejs
  这会将Node。js安装在来自官方Ubuntu存储仓的容器中。安装完成后,验证是否安装了Node。js:rooteb0d0364eb18:nodev
  您会在终端中看到版本号:输出信息v12。22。9
  您在容器内所做的任何更改仅适用于该容器。
  要退出容器,请在提示符处键入exit。
  接下来让我们管理系统上的容器。Docker容器管理
  使用Docker一段时间后,您的计算机上将有许多启用(运行)和非启用容器。要查看启用容器,请使用:dockerps
  您将看到所显示的信息如下:CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
  本文中,您启动了两个容器;一个来自helloworld镜像,另一个来自ubuntu镜像。两个容器都不再运行,但它们仍然存在于您的系统中。
  要查看所有容器启用或非启用,使用a运行dockerps:dockerpsa
  您将看到所显示的信息如下:CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES6327df395f88ubuntubinbash36minutesagoExited(129)27minutesagoflamboyantdarwineb0d0364eb18ubuntubinbash56minutesagoExited(129)50minutesagoeloquentpoincarec1c84b562c09ubuntubinbashAboutanhouragoExited(129)57minutesagocompetentstonebrakerd5741949647chelloworldhello2hoursagoExited(0)2hoursagooptimisticnobel
  要查看您创建的最新容器,就使用l:dockerpslCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES6327df395f88ubuntubinbash54minutesagoExited(129)45minutesagoflamboyantdarwin
  要启动已停止的容器,请使用dockerstart,后跟容器ID或容器名称。让我们启动ID为6327df395f88的基于Ubuntu的容器:dockerstart6327df395f88
  容器将启动,您可以使用dockerps查看其状态:CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES6327df395f88ubuntubinbash59minutesagoUp22secondsflamboyantdarwin
  要停止正在运行的容器,请使用dockerstop,后跟容器ID或名称。这一次,我们将使用Docker分配给容器的名称,即flamboyantdarwin:dockerstopflamboyantdarwin
  一旦你决定不再需要一个容器,使用dockerrm命令删除它,再次使用容器ID或名称。使用dockerpsa命令查找与helloworld镜像关联的容器ID或名称并将其删除。dockerrmflamboyantdarwin
  您可以启动一个新容器并使用name为其命名。您还可以使用rm创建一个在停止时自行删除的容器。有关这些选项和其他选项的更多信息,请参阅dockerrunhelp命令。
  容器可以变成镜像,你可以用它来构建新的容器。让我们看看如何实现。将容器更改提交至Docker镜像
  启动Docker镜像时,您可以像使用虚拟机一样创建、修改和删除文件。您所做的更改将仅可用于该容器。您可以启动和停止它,但一旦您使用dockerrm命令销毁,所做的更改将永远丢失。
  在此向您展示如何将容器的状态保存为新的Docker镜像。
  在Ubuntu容器中安装Node。js后,您现在有一个运行镜像的容器,但该容器与您用来创建它的镜像不同。但是您以后可能想基于这个Node。js容器制作新镜像。
  然后使用以下命令将更改提交到新的Docker镜像实例。dockercommitm您的提交注解a作者名称containeridrepositorynewimagename
  m用于提交信息注解,可帮助您和其他人了解您所做的更改,而a用于指定作者。containerid是您在本文前面开始交互式Docker会话时记下的那个。除非您在DockerHub上创建了额外的存储仓,否则存储仓repository通常是您的DockerHub用户名。
  例如,对于容器ID为c1c84b562c09的用户edal,命令为:dockercommitm添加Node。jsaedalc1c84b562c09edalubuntunodejs
  当您提交镜像时,新镜像会保存在您本地的计算机上。在本文的后面,您将学习如何将镜像推送到DockerHub等Docker注册中心,以便其他人可以访问或使用。
  再次列出Docker镜像将显示新镜像,以及它派生自的旧镜像:dockerimages
  您将看到所显示的信息如下:REPOSITORYTAGIMAGEIDCREATEDSIZEedalubuntunodejslateste68a2e992e2912secondsago77。8MB。。。
  在此示例中,ubuntunodejs是新镜像,它派生自DockerHub中现有的ubuntu镜像。大小差异反映了所做的更改。在这个例子中,变化是安装了NodeJS。因此,下次您需要使用预安装了NodeJS的Ubuntu运行容器时,您只需使用新镜像即可。
  您还可以通过Dockerfile构建镜像,这样您就可以在新镜像中自动安装软件。但这超出了本文要分享的内容范围。
  现在让我们与其他人共享新镜像,以便其他人可以从中创建容器。将镜像推送到Docker存储仓
  从现有镜像创建新镜像后的下一个合乎逻辑的步骤是在DockerHub或您有权访问的其他Docker注册中心上与您的几个朋友、整个世界共享。要将镜像推送到DockerHub或任何其他Docker注册中心,您必须在那里拥有一个帐户。
  要推送您的图像,请先登录DockerHub。dockerloginu用户名
  系统将提示您使用DockerHub密码进行身份验证,如果您指定了正确的密码,则身份验证就会成功。注
  如果您的Docker注册中心用户名与您用于创建映像的本地用户名不同,您将必须使用您的注册中心用户名标记您的镜像。对于最后一步中给出的示例,您将键入:
  dockertagedalubuntunodejsdocker用户名ubuntunodejs
  然后你可以使用以下方式推送你自己的镜像:dockerpushdocker用户名镜像名称
  要将ubuntunodejs镜像推送到edal存储仓,命令为:dockerpushedalubuntunodejs
  该过程在上传镜像时可能需要一些时间才能完成,但完成后,输出将如下所示:Thepushreferstoarepository〔docker。ioedalubuntunodejs〕a3fbbfb44187:Pusheddf70bf19a086:Pushed43b5c90a4eba:Pushed7f18c442962b:Pushedgce512daaf98:Pushed6aae4313b42d:Pushed
  将镜像推送到注册中心后,它应该列在您帐户的仪表板上,如下图所示。
  如果推送尝试导致此类错误,那么您可能没有登录:Thepushreferstoarepository〔docker。ioedalubuntunodejs〕a3fbbfb44187:Preparingdf70bf19a086:Preparing43b5c90a4eba:Preparing7f18c442962b:Preparinggce512daaf98:Preparing6aae4313b42d:Waitingunauthorized:authenticationrequired
  使用dockerlogin登录并重复推送尝试。然后验证是否存在于您的DockerHub存储仓页面上。
  您现在可以使用dockerpulledalubuntunodejs将镜像拉取到新机器并使用它来运行新容器。安装DockerCompose
  为确保您获得最新的DockerCompose稳定版本,您将从其官方Github存储仓下载该软件。
  首先,确认其发布页面中可用的最新版本。在撰写本文时,最新的稳定版本是2。16。0。
  使用以下命令下载:mkdirp。dockerclipluginscurlSLhttps:github。comdockercomposereleasesdownloadv2。16。0dockercomposelinuxx8664o。dockerclipluginsdockercompose
  接下来,设置正确的权限,以便dockercompose命令可执行:chmodx。dockerclipluginsdockercompose
  欲验证安装是否成功,您可以运行:dockercomposeversion
  您将看到所显示的信息如下:DockerComposeversionv2。16。0
  DockerCompose现已成功安装在您的系统上。接下来,我们将了解如何设置dockercompose。yml文件并使用此工具启动和运行容器化环境。设置dockercompose。yml
  为演示如何设置dockercompose。yml文件并使用DockerCompose,您将使用来自DockerHub(公共Docker注册中心)的官方Nginx镜像创建一个Web服务器环境。此容器化环境将提供单个静态HTML文件。
  首先在您的主文件夹中新建一个目录,然后转到其中:mkdircomposedemocdcomposedemo
  在此目录中,设置一个应用程序文件夹作为Nginx环境的文档根目录:mkdirapp
  使用您喜欢的文本编辑器,在app文件夹中新建一个index。html文件:vimappindex。html
  然后,在文件中输入以下代码
  composedemoappindex。html!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titleDockerCompose示例titleheadbodyh1这是一个DockerCompose示例页面h1p此内容由Nginx容器服务显示bodyhtml
  接下来,创建dockercompose。yml文件:vimdockercompose。yml
  在您的dockercompose。yml文件中插入以下内容:
  composedemodockercompose。ymlversion:3。8services:web:image:nginx:alpineports:8000:80volumes:。app:usrsharenginxhtml
  dockercompose。yml文件通常以版本定义开头,告诉DockerCompose您正在使用哪个配置版本。
  然后您有服务模块,您可以在其中设置属于此环境的服务。在本例中,您有一个名为web的服务。此服务使用nginx:alpine镜像并使用ports指令设置端口重定向。主机(运行DockerCompose的系统)端口8000上的所有请求都将重定向到端口80上的Web容器,Nginx将在其中运行。
  volumes指令将在主机和容器之间创建一个共享卷。这将与容器共享本地应用程序文件夹,卷将位于容器内的usrsharenginxhtml,然后将覆盖Nginx的默认文档根目录。
  您已经设置了一个演示页面和一个dockercompose。yml文件来创建一个容器化的Web服务器环境为其提供服务。在下一步中,我们将使用DockerCompose启动此环境。运行DockerCompose
  有了dockercompose。yml文件,您现在可以执行DockerCompose来启动您的环境。以下命令将下载必要的Docker镜像,为Web服务创建容器,并在后台模式下运行容器化环境:dockercomposeupd
  DockerCompose将先在您的本地系统上查找定义的镜像,如果找不到该镜像,将自动从DockerHub下载。
  您的环境现已启动并在后台运行。要验证容器是否处于启用状态,您可以运行:dockercomposeps
  此命令将向您显示有关正在运行的容器及其状态的信息,以及当前存在的任何端口重定向:NAMEIMAGECOMMANDSERVICECREATEDSTATUSPORTScomposedemoweb1nginx:alpinedockerentrypoint。web31secondsagoUp27seconds0。0。0。0:800080tcp,:::800080tcp
  您现在可以通过将浏览器指向localhost:8000(本地机器上运行此演示)或您的域名或服务器IP:8000(远程服务器上运行此演示)来访问演示应用程序。
  你会看到类似如下页面:
  DockerCompose命令
  您已了解如何设置dockercompose。yml文件并使用dockercompose启动您的环境。下面,我们来了解如何使用DockerCompose命令来管理容器化环境并与之交互。
  要检查Nginx容器生成的日志,可以使用logs命令:dockercomposelogs
  您将看到所显示的信息如下:edalbuddy:composedemodockercomposelogscomposedemoweb1dockerentrypoint。sh:dockerentrypoint。disnotempty,willattempttoperformconfigurationcomposedemoweb1dockerentrypoint。sh:Lookingforshellscriptsindockerentrypoint。dcomposedemoweb1dockerentrypoint。sh:Launchingdockerentrypoint。d10listenonipv6bydefault。shcomposedemoweb110listenonipv6bydefault。sh:info:Gettingthechecksumofetcnginxconf。ddefault。confcomposedemoweb110listenonipv6bydefault。sh:info:EnabledlistenonIPv6inetcnginxconf。ddefault。confcomposedemoweb1dockerentrypoint。sh:Launchingdockerentrypoint。d20envsubstontemplates。shcomposedemoweb1dockerentrypoint。sh:Launchingdockerentrypoint。d30tuneworkerprocesses。shcomposedemoweb1dockerentrypoint。sh:Configurationcomplete;readyforstartupcomposedemoweb12023022108:20:53〔notice〕11:usingtheepolleventmethodcomposedemoweb12023022108:20:53〔notice〕11:nginx1。23。3。。。
  如果您想在不更改容器当前状态的情况下暂停环境执行,您可以使用:dockercomposepause
  发出暂停后恢复运行:dockercomposeunpause
  stop命令将终止容器执行,但它不会破坏与容器关联的任何数据:dockercomposestop
  如果要删除与此容器化环境关联的容器、网络和卷,请使用down命令:dockercomposedown
  注:这不会删除DockerCompose用来启动您的环境的基础镜像(本示例中为nginx:alpine)。每当您使用dockercomposeup再次启动您的环境时,由于镜像已经在您的系统上,因此该过程会很快。
  如果您还想从系统中删除基本映像,可以使用:dockerimagermnginx:alpine
  您将看到所显示的信息如下:Untagged:nginx:alpineUntagged:nginxsha256:6f94b7f4208b5d5391246c83a96246ca204f15eaf7e636cefda4e6348c8f6101Deleted:sha256:2bc7edbc3cf2fce630a95d0586c48cd248e5df37df5b1244728a5c8c91becfe0Deleted:sha256:9ca6be4cd63171f17f0a5e2ea28d5361a299672f41bd65223e7eac7d3d57e76dDeleted:sha256:f7aa4d1226879fb1018ed05617572994840f4c75e5d04df2fffe04980cef11b9Deleted:sha256:f83cdd3286b839bef51f1ae0f1f6164b16e1059a0e131035bfa0bb8bb0021357Deleted:sha256:61b0680052fcdb48f47c8d68687c0b5bbb279b6e3740701885b39ea22ef7b008Deleted:sha256:9045770a1273553bb8bd7ccd2d490ecb56ce762ac993ad74698d14186e39bda6Deleted:sha256:60d9493158e562e8510cd4cabbd7460c03ad39fe2250bbd43bdcd1e75f64ba6fDeleted:sha256:7cd52847ad775a5ddc4b58326cf884beee34544296402c6292ed76474c686d39
  您已经了解了如何安装DockerCompose并基于NginxWeb服务器镜像设置容器化环境。同时,您还了解了如何使用Compose命令管理环境。
  下面,我们来为设置私有的Docker注册中心做好准备:安装Nginx
  Nginx是世界上最流行的Web服务器之一,负责托管互联网上一些最大和最高流量的网站。它是一个轻量级的选择,可以用作Web服务器或反向代理。
  因为Nginx在Ubuntu的默认存储仓中可用,所以可以使用apt打包系统从存储库安装。
  运行以下命令快速安装Nginx:sudoaptupdatesudoaptinstallnginx
  当提示确认安装时按Y。如果系统提示您重新启动任何服务,请按回车键接受默认值并继续。apt将安装Nginx和任何必需的依赖项到您的服务器。调整防火墙
  在测试Nginx之前,需要配置防火墙软件以允许访问该服务。Nginx在安装时将自己注册为ufw的服务,从而可以直接允许Nginx访问。
  通过键入以下内容列出ufw知道如何使用的应用程序配置:sudoufwapplist
  您将看到所显示的信息如下:Availableapplications:NginxFullNginxHTTPNginxHTTPSOpenSSH
  如输出所示,Nginx可以使用三个配置文件:NginxFull:此配置文件同时打开端口80(正常、未加密的Web访问)和端口443(TLSSSL加密访问)NginxHTTP:此配置文件仅打开端口80(正常、未加密的网络访问)NginxHTTPS:此配置文件仅打开端口443(TLSSSL加密访问)
  建议您启用限制最严格的配置文件,该配置文件仍将允许您配置的流量。现在,我们只需要允许端口80上的访问。
  您可以通过键入以下内容启用此功能:sudoufwallowNginxHTTP
  您可以通过键入以下内容来验证更改:sudoufwstatus
  您将看到所显示的信息如下:Status:activeToActionFromOpenSSHALLOWAnywhereNginxHTTPALLOWAnywhereOpenSSH(v6)ALLOWAnywhere(v6)NginxHTTP(v6)ALLOWAnywhere(v6)查看您的Web服务器
  在安装过程结束时,Ubuntu22。04启动Nginx。Web服务器应该已经启动并正在运行。
  我们可以通过键入以下命令检查systemd初始化系统以确保服务正在运行:systemctlstatusnginxnginx。serviceAhighperformancewebserverandareverseproxyserverLoaded:loaded(libsystemdsystemnginx。service;enabled;vendorpreset:enabled)Active:active(running)sinceMon2023022022:53:14CST;1min30sagoDocs:man:nginx(8)Process:19990ExecStartPreusrsbinnginxtqgdaemonon;masterprocesson;(codeexited,status0SUCCESS)Process:19991ExecStartusrsbinnginxgdaemonon;masterprocesson;(codeexited,status0SUCCESS)MainPID:20091(nginx)Tasks:13(limit:18902)Memory:11。3MCPU:210msCGroup:system。slicenginx。service20091nginx:masterprocessusrsbinnginxgdaemonon;masterprocesson;20094nginx:workerprocess
  由此确认,该服务已成功启动。然而,最好的测试方法是实际从Nginx请求一个页面。
  您可以访问默认的Nginx页面,通过导航到您服务器的IP地址来确认软件是否正常运行。如果您不知道服务器的IP地址,可以使用icanhazip。com工具找到,该工具将为您提供从互联网上其他位置收到的公共IP地址:curl4icanhazip。com
  获得服务器的IP地址后,将其输入浏览器的地址栏:http:您的IP地址
  您应该会收到默认的Nginx访问页面:
  Nginx进程管理
  现在您已经启动并运行了Web服务器,让我们回顾一些基本的管理命令。
  欲停止您的Web服务器,请键入:sudosystemctlstopnginx
  启动Web服务器:sudosystemctlstartnginx
  重启Web服务器:sudosystemctlrestartnginx
  如果您只是进行配置更改,Nginx通常可以在不断开连接的情况下重新加载。为此,请键入:sudosystemctlreloadnginx
  默认情况下,Nginx配置为在服务器启动时自动启动。如果您不想如此,可以通过键入以下内容来停用此方式:sudosystemctldisablenginx
  欲重新启用该服务以在引导时启动,您可以键入:sudosystemctlenablenginx
  您现在已经学习了基本的管理命令,并且应该准备好配置站点以托管多个域名。设置服务器模块(推荐)
  使用Nginx网络服务器时,服务器模块(类似于Apache中的虚拟主机)可用于封装配置具体信息并从一台服务器托管多个域名。我们将设置一个名为yourdomain的域名,实际情况下您需要将其替换为您自己的域名。
  Ubuntu22。04上的Nginx默认启用一个服务器模块,该服务器模块配置为从varwwwhtml目录中提供文档。虽然这适用于单个站点,但如果您托管多个站点,可能会变得笨拙。我们不修改varwwwhtml,而是在varwww中为我们的yourdomain站点创建一个目录结构,将varwwwhtml保留为默认目录,以便在客户端请求不匹配时提供服务其他网站。
  如下所示为yourdomain创建目录,使用p标志创建任何必要的上级目录:sudomkdirpvarwwwyourdomainhtml
  接下来,使用USER环境变量分配目录的所有权:sudochownRUSER:USERvarwwwyourdomainhtml
  如果您没有修改设置默认文件权限的umask值,您的Web根目录的权限应该是正确的。为确保您的权限正确并允许所有者读取、写入和执行文件,同时授予组和其他仅读取和执行权限,您可以输入以下命令:sudochmodR755varwwwyourdomain
  接下来,使用vim或您喜欢的编辑器创建一个示例index。html页面:sudovimvarwwwyourdomainhtmlindex。html
  在以上文件里添加以下HTML代码示例:
  文件路径:varwwwyourdomainhtmlindex。htmlhtmlheadtitleyourdomain欢迎您!titleheadbodyh1搞定!yourdomain服务器模块运行正常!h1bodyhtml
  为了让Nginx内容提供服务,有必要使用正确的指令创建一个服务器模块。我们不直接修改默认配置文件,而是在etcnginxsitesavailableyourdomain新建一个:sudovimetcnginxsitesavailableyourdomain
  粘贴以下配置模块,它与默认配置类似,但针对我们的新目录和域名进行了更新:
  文件路径:etcnginxsitesavailableyourdomainserver{listen80;listen〔::〕:80;rootvarwwwyourdomainhtml;indexindex。htmlindex。htmindex。nginxdebian。html;servernameyourdomainwww。yourdomain;location{tryfilesuriuri404;}}
  请注意,我们已将root配置更新为我们的新目录,并将servername更新为我们的域名。
  接下来,让我们通过创建一个到sitesenabled目录的链接来启用该文件,Nginx在启动期间从中读取:sudolnsetcnginxsitesavailableyourdomainetcnginxsitesenabled注
  Nginx使用一种称为symbolic链接或symlinks符号链接的常见做法来跟踪启用的服务器模块。创建一个符号链接就像在磁盘上创建一个快捷链接的方式,这样您可以稍后从启用站点的目录中删除该快捷方式,同时如果您想要启用,则将服务器模块保留在sitesavailable中。
  为避免因添加额外的服务器名称而可能出现的哈希桶内存问题,有必要调整etcnginxnginx。conf文件中的单个值。打开文件:sudovimetcnginxnginx。conf
  找到servernameshashbucketsize指令并删除符号以取消注释该行。
  文件路径:etcnginxnginx。conf。。。http{。。。servernameshashbucketsize64;。。。}。。。
  接下来,测试以确保您的Nginx文件中没有任何语法错误:sudonginxt
  如果没有任何问题,请重新启动Nginx以启用您的更改:sudosystemctlrestartnginx
  Nginx现在应该为您的域名提供服务。您可以通过浏览器访问http:yourdomain来进行测试,您会在页面上看到如下内容:搞定!yourdomain服务器模块运行正常!熟悉Nginx重要文件与目录
  现在您知道如何管理Nginx服务本身,您应该花几分钟时间熟悉一些重要的目录和文件。
  内容部分varwwwhtml:为Web内容,默认情况下仅包含您之前看到的默认Nginx页面,由varwwwhtml目录提供。这可以通过更改Nginx配置文件来更改。
  服务器配置etcnginx:Nginx配置目录,所有Nginx配置文件都驻留在此处。etcnginxnginx。conf:主要Nginx配置文件,可以修改以变更Nginx全局配置。etcnginxsitesavailable:可以存储每个站点服务器模块的目录。Nginx不会使用在此目录中找到的配置文件,除非将其链接到sitesenabled目录。通常,所有服务器模块配置都在此目录中完成,然后通过链接到其他目录来启用。etcnginxsitesenabled:存储启用每站点服务器模块的目录。通常是通过链接到sitesavailable目录中的配置文件来进行创建。etcnginxsnippets:该目录含有配置片段,可包含在Nginx配置的其他地方。潜藏可重复的配置片段是重构为片段的备用者。
  服务器日志varlognginxaccess。log:除非Nginx配置为其他方式,否则对Web服务器的每个请求都会记录在此日志文件中。varlognginxerror。log:任何Nginx错误都将记录在此日志中。安装LetsEncryptSSL证书安装Certbot
  Certbot建议使用他们的snap包进行安装。Snap包适用于几乎所有Linux发行版,但它们要求您先安装snapd才能管理snap包。Ubuntu22。04支持开箱即用的snap,因此您可以先确保您的snapd核心为最新更新:sudosnapinstallcore;sudosnaprefreshcore
  如果您安装了旧版本certbot在服务器上,则应在继续之前将其删除:sudoaptremovecertbot
  之后,您就可以安装certbot包啦:sudosnapinstallclassiccertbot
  最后,您可以将certbot命令从snap安装目录链接到您的路径,这样您就可以通过键入certbot来运行。并非所有包都需要这样做,但默认情况下snap的侵入性较低,因此它们不会意外地与任何其他系统包发生冲突:sudolnssnapbincertbotusrbincertbot
  现在我们已经安装了Certbot,下面运行它来获取SSL证书。获取SSL证书
  Certbot提供了多种通过插件获取SSL证书的方式,插件将负责重新配置Nginx并在必要时重新加载配置。要使用此插件,请键入以下内容:sudocertbotnginxdyourdomaindwww。yourdomain
  以上命令使用nginx插件运行certbot,使用d指定我们希望证书有效的域名。
  运行命令时,系统会提示您输入电子邮件地址并同意服务条款。执行此操作后,您应该会看到如下相关证书存储位置的一条消息:Successfullyreceivedcertificate。Certificateissavedat:etcletsencryptliveyourdomainfullchain。pemKeyissavedat:etcletsencryptliveyourdomainprivkey。pemThiscertificateexpireson20230521。Thesefileswillbeupdatedwhenthecertificaterenews。Certbothassetupascheduledtasktoautomaticallyrenewthiscertificateinthebackground。DeployingcertificateSuccessfullydeployedcertificateforyourdomaintoetcnginxsitesenabledyourdomainSuccessfullydeployedcertificateforwww。yourdomaintoetcnginxsitesenabledyourdomainCongratulations!YouhavesuccessfullyenabledHTTPSonhttps:yourdomainandhttps:www。yourdomainIfyoulikeCertbot,pleaseconsidersupportingourworkby:DonatingtoISRGLetsEncrypt:https:letsencrypt。orgdonateDonatingtoEFF:https:eff。orgdonatele
  您的证书已下载、安装和加载,您的Nginx配置现在将自动将所有Web请求重定向到https:。试着重新加载您的网站并注意浏览器的安全指示器。它应该表明该站点已得到妥善保护,通常带有锁图标。Certbot自动更新
  LetsEncrypt的证书有效期只有九十天。我们安装的certbot包通过添加一个每天运行两次的systemd计时器来为我们解决这个问题,并自动更新任何在三十天内到期的证书。
  您可以使用systemctl查询定时器的状态:sudosystemctlstatussnap。certbot。renew。service
  您将看到所显示的信息如下:snap。certbot。renew。serviceServiceforsnapapplicationcertbot。renewLoaded:loaded(etcsystemdsystemsnap。certbot。renew。service;static)Active:inactive(dead)TriggeredBy:snap。certbot。renew。timer
  欲测试更新续订过程,您可以使用certbot进行试运行:sudocertbotrenewdryrun
  如果您没有看到任何错误,则一切就绪。必要时,Certbot将更新您的证书并重新加载Nginx以获取更改。如果自动续订过程失败,LetsEncrypt将向您指定的电子邮件发送一条消息,在您的证书即将过期时通知您。设置私有Docker注册中心安装与配置Docker注册中心
  在启动和测试容器时,命令行上运行Docker很有用,但对于涉及并行运行多个容器的更大部署,可能会变得笨拙。
  使用DockerCompose,您可以编写一个。yml文件来设置每个容器的配置和容器相互通信所需信息。您可以使用dockercompose工具向组成应用程序的所有组件发出命令,并将它们作为一个组进行控制。
  DockerRegistry(Docker注册中心)本身是一个包含多个组件的应用程序,因此您可使用DockerCompose来进行管理。要启动注册中心实例,您需设置一个dockercompose。yml文件来定义以及注册中心将在磁盘上存储其数据的位置。
  在此,我们将配置存储在主机服务器上名为dockerregistry的目录中。通过运行以下命令创建:mkdirdockerregistry
  转向改目录:cddockerregistry
  在目录下再创建一个名为data的子目录:mkdirdata
  通过运行以下命令创建并打开名为dockercompose。yml的文件:vimdockercompose。yml
  添加以代码将其定义Docker注册中心的基本实例:
  dockerregistrydockercompose。ymlversion:3。8services:registry:image:registry:latestports:5000:5000environment:REGISTRYSTORAGEFILESYSTEMROOTDIRECTORY:datavolumes:。data:data
  以上文件,您命名第一个服务registry,使用registry镜像并将其设置到最新版本。然后,在端口下,将主机上的端口5000映射到容器的端口5000,这将允许您向服务器上的端口5000发送请求并将请求转发到注册中心。
  在environment部分,设置REGISTRYSTORAGEFILESYSTEMROOTDIRECTORY变量至data,指定应在哪个卷中存储其数据。然后,在volumes部分,将主机文件系统上的data目录映射到容器中的data通行使用。数据实际上将存储在主机的文件系统中。
  保存并退出文件编辑页面
  您现在可以通过运行以下命令开始配置:dockercomposeup
  注册中心容器及其依赖项将被下载并启动。〔〕Running66registryPulled7。7sef5531b6e74ePullcomplete2。7sa52704366974Pullcomplete2。8sdda5a8ba6f46Pullcomplete2。9seb9a2e8a8f76Pullcomplete3。3s25bb6825962ePullcomplete3。9s〔〕Running21NetworkdockerregistrydefaultCreated0。1sContainerdockerregistryregistry1Created0。0sAttachingtodockerregistryregistry1dockerregistryregistry1time20230221T19:08:16。67735615ZlevelwarningmsgNoHTTPsecretprovidedgeneratedrandomsecret。Thismaycauseproblemswithuploadsifmultipleregistriesarebehindaloadbalancer。Toprovideasharedsecret,fillinhttp。secretintheconfigurationfileorsettheREGISTRYHTTPSECRETenvironmentvariable。go。versiongo1。16。15instance。id9bd4599608d94812898f43378f81ef5fserviceregistryversionv2。8。1unknowndockerregistryregistry1time20230221T19:08:16。677440318Zlevelinfomsgredisnotconfiguredgo。versiongo1。16。15instance。id9bd4599608d94812898f43378f81ef5fserviceregistryversionv2。8。1unknowndockerregistryregistry1time20230221T19:08:16。677708003ZlevelinfomsgStartinguploadpurgein0sgo。versiongo1。16。15instance。id9bd4599608d94812898f43378f81ef5fserviceregistryversionv2。8。1unknowndockerregistryregistry1time20230221T19:08:16。677753999ZlevelinfomsgPurgeUploadsstarting:olderThan2023021419:08:16。677722870000UTCm604799。990567511,actuallyDeletetrue。。。设置Nginx端口转向
  您已经设置了etcnginxsitesavailableyourdomain文件,其中包含您的服务器配置。通过运行打开它进行编辑:sudovimetcnginxsitesavailableyourdomain
  找到现有的location模块:
  etcnginxsitesavailableyourdomain。。。location{。。。}。。。
  您需要将访问转发到端口5000,您的注册中心将在此处侦听访问。您还希望将标头附加转发到注册中心的请求,它提供来自服务器的关于请求本身的附加信息。用以下代码替换location模块的现有内容:
  etcnginxsitesavailableyourdomain。。。location{Donotallowconnectionsfromdocker1。5andearlierdockerpre1。6。0didnotproperlysettheuseragentonping,catchGouseragentsif(httpuseragent(docker1。(345(?!。〔09〕dev))Go)。34;){return404;}proxypasshttp:localhost:5000;proxysetheaderHosthttphost;requiredfordockerclientssakeproxysetheaderXRealIPremoteaddr;passonrealclientsIPproxysetheaderXForwardedForproxyaddxforwardedfor;proxysetheaderXForwardedProtoscheme;proxyreadtimeout900;}。。。
  if模块检查请求的用户代理并验证Docker客户端的版本是否高于1。5,并且它不是尝试访问的Go应用程序。有关这方面的更多解释,您可以在Docker注册中心Nginx指南中找到nginx标头配置。
  完成后保存并退出文件编辑页面。通过重新启动Nginx来应用更改:sudosystemctlrestartnginx
  如果您收到出错消息,请仔细检查您添加的配置。
  欲确认Nginx正确地将访问转发到端口5000上的注册表容器,请运行:dockercomposeup
  然后,在浏览器中,访问您的域名并使用v2端点,如下所示:https:yourdomainv2
  浏览器将加载一个空的JSON对象:{}设置身份验证
  Nginx可以让您为其管理的站点设置HTTP身份验证,您可以使用它来限制对Docker注册中心的访问。为此,您将使用htpasswd创建一个身份验证文件,并向其中添加将被认可的用户名和密码组合。该过程将启用对您的注册中心的身份验证。
  您可以通过安装apache2utils软件包来获取htpasswd实用程序。运行以下命令:sudoaptinstallapache2utilsy
  将带有凭据的身份验证文件存储在dockerregistryauth下。运行以下命令:mkdirdockerregistryauth
  转向该目录:cddockerregistryauth
  创建第一个用户,将用户名替换为您要使用的用户名。B标志命令使用Docker要求的bcrypt算法:htpasswdBcregistry。password用户名
  出现提示时输入密码。凭据的组合将附加到registry。password。提示
  要添加更多用户,请在不带c的情况下重新运行之前的命令:
  htpasswdBregistry。password用户名
  c为创建一个新文件,如果使用它会更新现有文件。
  现在已创建凭据列表,我们需要编辑dockercompose。yml以命令Docker使用您创建的文件对用户进行身份验证。打开它进行编辑:vimdockerregistrydockercompose。yml
  添加高亮代码部分:
  dockerregistrydockercompose。ymlversion:3。8services:registry:image:registry:latestports:5000:5000environment:REGISTRYAUTH:htpasswd(注:此行为高亮代码)REGISTRYAUTHHTPASSWDREALM:Registry(注:次行为高亮代码)REGISTRYAUTHHTPASSWDPATH:authregistry。password(注:此行为高亮代码)REGISTRYSTORAGEFILESYSTEMROOTDIRECTORY:datavolumes:。auth:auth(注:此行为高亮代码)。data:data
  现在,您已添加了指定使用HTTP身份验证并提供htpasswd创建文件路径的环境变量。对于REGISTRYAUTH,将htpasswd指定为其值,并将REGISTRYAUTHHTPASSWDPATH设置为身份验证文件的路径。REGISTRYAUTHHTPASSWDREALM表示htpasswd领域的名称。
  您还挂载了。auth目录以使该文件在注册中心容器内可用。保存并退出编辑文件页面。
  现在可以验证您的身份验证是否正常工作。先转到到主目录:cddockerregistry
  然后运行:dockercomposeup
  在您的浏览器中,刷新域名页面。系统会要求您提供用户名和密码。
  提供有效的凭据组合后,您将访问带有空JSON对象的页面:{}
  您已成功通过身份验证并获得了对注册中心的访问权限。在终端中按CTRLC退出运行。
  您的注册中心现已有安全保障,只有在身份验证后才能访问。接下来,我们将配置它作为后台进程运行,同时通过自动启动来使用重新启动。启动Docker注册中心即服务
  您可以通过指示DockerCompose始终保持运行来确保注册中心容器在每次系统启动或崩溃后保持重启运行。
  打开dockercompose。yml进行编辑:vimdockercompose。yml
  将以下高亮代码添加到registry模块中:
  dockerregistrydockercompose。yml。。。registry:restart:always。。。
  您现在可以通过d标志将注册中心作为后台进程启动:dockercomposeupd
  当你的注册中心在后台运行时,你可以随意关闭这个SSH命令行界面,终端和注册中心不会受到影响。
  由于Docker镜像的占用空间可能非常大,接下来我们将设置Nginx能够接受上传的最大文件尺寸限制。Nginx文件上传大小设置
  在将镜像推送到注册中心之前,您需要确保您的注册中心能够处理大文件上传。Nginx默认上传文件大小限制为1m,这对于Docker镜像来说远远不够。接下来,我们将对其设置进行修改,编辑位于etcnginxnginx。conf的Nginx配置文件。
  打开文件进行编辑:sudovimetcnginxnginx。conf
  在http部分添加以下高亮代码内容:
  etcnginxnginx。conf。。。http{clientmaxbodysize8192m;。。。}。。。
  clientmaxbodysize参数现设置为8192m,使最大上传大小为8GB。
  保存并退出编辑文件页面。
  重新启动Nginx以应用配置更改:sudosystemctlrestartnginx发布至私有Docker注册中心
  现在您设置好的Docker注册中心服务器正在运行并接受大文件8GB的上传,我们来试着将镜像推送到这个私有的Docker注册中心。由于您没有现成可用的景象,我们将使用来自DockerHub的ubuntu镜像进行测试。
  在客户端服务器的新终端会话中,运行以下命令来下载ubuntu镜像,运行并访问其shell:dockerruntiubuntubinbash
  进入后,通过运行以下命令创建一个名为SUCCESS的文件:root44ea1c653b1d:touchSUCCESS
  通过创建此文件,您已经自定义了您的容器。稍后将使用它来检查您是否使用完全相同的容器。
  运行以下命令退出容器shell:root44ea1c653b1d:exit
  现在从您刚刚自定义的容器新建一个镜像:dockercommit(dockerpslq)testimage
  新镜像现在在本地已可用,您可以将其推送到您的容器注册中心。首先,您必须登录:dockerloginhttps:yourdomain
  弹出登陆框时,输入相关在之前所创建的登陆信息即可。
  一旦登陆之后,就可以重命名所创建的镜像:dockertagtestimageyourdomaintestimage
  最后,将新标记的镜像推送到您的注册中心:dockerpushyourdomaintestimage拉取镜像自私有Docker注册中心
  登陆私有Docker注册中心:dockerloginhttps:yourdomain
  拉取testimage镜像:dockerpullyourdomaintestimage
  Docker将下载镜像。使用以下命令运行容器:dockerrunityourdomaintestimagebinbash
  搞定!私有Docker注册中心已就绪!DevOps与Docker完美结合
  通过上面一系列的操作,我们已将相关Docker的环境全部就绪。之后就是我们即将面对的目标,开发一些属于我们自己的项目,并发布甚至将我们开发的产品进行商用,产品化我们的项目,最终达至盈利的目的。但在开发与运维的过程中我们将遇到各种各样的问题:测试、调试、修复Bugs、维护服务器、产品版本发布、SEO优化、代码质量提升、团队协作开发,甚至团队管理等等。因此,DevOps的概念给我们带来了很好的解决方案!什么是DevOps?这问题我们就不在此详细讨论,您可以通过互联网搜索得到所要的答案。而在此部分,我们将使用Buddy做为DevOps开发运维示例。
  什么是Buddy?
  Buddy是一个DevOps自动化平台:一个让开发人员能够以简单可靠的方式构建、测试和发布软件的平台(支持云服务、本地部署与自托管部署)。它基于持续集成的原则,对代码的每次更改都会自动测错并为部署做好准备。部署也是自动化,这消除了人为错误风险并显著缩短操作时间。因此,您可以更快地收集客户的反馈并进行更改,而不会有白白浪费数月工作的风险。Buddy的使用有免费与收费两种帐户类型,在此,我们可以免费注册并使用它作为自动化运维Docker项目,让我们只需要专注开发即可,其余的代码提交,构建镜像、推送镜像、拉取镜像、部署项目等等一切均可由Buddy来完成。
  首先进入此网免费注册一个Buddy帐户buddy。red
  完成注册Buddy帐户之后,登陆进入帐户。接下来,开启我们的DevOps开发运维一体化之路!创建项目、流水线与添加操作
  登陆Buddy帐户之后,点击新建项目按钮进入项目创建第一步:
  选择系统自带Git托管作为项目存储仓,输入项目名称并点击新建项目按钮进行项目创建:
  在此,我们将使用一个开源项目作为演示,此为基于Rust语言、使用Angular作为前端、PostgreSQL数据库的一个项目。请点击此处从GitHub下载Repo并提交推送至刚刚创建的项目存储仓之中:
  点击流水线并新建一条流水线,触发器选择事件,也就是自动触发,当我们提交并推送代码至此项目存储仓时,将会自动触发并运行流水线上的操作:
  在流水线上添加操作,进入流水线点击操作标签页,然后点击加号按钮进一步添加操作:
  我们将添加两个操作;一个是用于构建镜像,另一个用于推送镜像至私有Docker注册中心:
  而在项目存储仓中有四个镜像可供我们构建:data目录下的数据库、services目录下相关后端API、www目录之下的Angular前端以及调试使用Swagger。下面,除了Swagger,我们将逐个通过构建与推送镜像操作将其余三个构建并推送至以上创建的私有注册中心之中。
  数据库镜像
  点击加号按钮添加构建镜像,并选择如下图data目录下的Dockerfile文件,同时选择与至匹配的相关联环境,也就是data目录。然后点击蓝色按钮添加此操作:
  点击加号按钮添加推送镜像:
  举一反三,同上添加剩余的两个操作,我们就可以看到如下图在流水线上添加了总共六个操作。操作分别为构建与推送镜像:数据库、API与前端:
  至此,我们的自动化运维布局已就绪!下面我们来运行这条流水线。运行流水线构建和推送镜像
  目前,在此项目中,我们可以通过两种方式运行流水线:第一种直接手动点击流水线上的运行按钮执行运行:
  第二种是通过在项目中提交并推送代码至存储仓自动触发流水线执行运行。
  流水线运行之后,打开浏览器并输入https:yourdomainv2catalog并在弹出的登陆框输入帐户信息,我们就可以在私有Docker注册中心看到如下图的相关镜像信息:
  注
  请注意更换yourdomain为您自己的域名名称!
  此时,我们的Docker项目就能够完美地与自动化运维相结合。您可以随意推送、拉取镜像来进一步开发您的项目!总结
  总结就留给您自己写吧!当您认真阅读这篇文章时,我相信您已经对Docker有了更深的认识与如何更熟练地运用。如果到这里还不知所措,那么请按照本文内容一步步进行实际操作。

这里秋景别样美快来打卡吧津城金秋,别样美丽。衬着周末,随便走走,一处街边空地,引起我的注意。这片空地不大,超不过五个足球场大小,却像油画铺在地上。枫叶红了,银杏叶黄了,毛茸茸的芦苇花随风摇曳,丰姿绰约,就沈从文和张兆和的婚恋只有相近的灵魂,才能一路温暖1hr当我看到沈从文张兆和书信选,才恍然大悟所谓才子佳人的故事都是所谓的。是风花雪月爱好者们的一厢情愿及妄加粉饰。沈从文必然是倜傥潇洒,才华横溢,温柔敦厚的,当然更是一往情深而忠贞青岛老建筑(1)基督教堂基督教堂位于青岛市老城区江苏路15号,由德国胶澳总督府出资,于1908年4月19日奠基,1910年10月23日落成,依山傍海,是信徒宗教活动及旅游休闲的好去处。1899年德国传教士一片黄叶点亮了秋天的灯走过岁月的河流被夏打磨的树枝涉足时你并不把绿色交给我让我慢慢消瘦下去在寂寞的蝉鸣声中那柔情和温馨的话语总以为我看到了光明和温暖一片黄叶点亮了秋天的灯光亮的前面却用影子一直将我笼罩虫降价降利率的大趋势下,中国房地产市场未来的走势如何?子木昨天跟几个业内老友线上深谈,聊了许多。大家都觉得当下的市场已经被情绪绑架,要想走出来,会非常艰辛。除非有三倍利好暴击,才能勉强把市场行情拉回来。这种情况下,房地产作为支柱型产业年轻人不生孩子的根本原因生还是不生?年轻人不婚不生孩子,社会人口老龄化!生孩子原本是个人问题,可是逐步上升为社会问题。如果要解决这个问题,一定要找到根本原因。先说一下生孩子这个事情本身,生孩子就是人类的物河南老汉收留日本伤兵,坚持供养了47年,归国后他是如何报答的?在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持!1993年6月,日本记者挤满了大阪机场。随着河南老汉和日本老兵互相搀扶着走出来,老干妈,也出事了一hr在东方,有一种非常神秘的力量。它能滴入灵魂,让你感受到灼热的气息,燃烧你的卡路里。它能化腐朽为神奇,让任何难吃的食物变得可以食用。它无处不在,只要有中国人,就会有它。是辣酱界张大千把女儿闺蜜变成了妻子,不料二人的儿子,却成了人间悲剧人们常说上帝为你关上了一扇门之后,就会为你打开另一扇窗。之所以会说这句话,就是因为人们的天赋其实都是大差不差的,如果在某一方面特别出众的话,那么在其他方面或许就会不如旁人了。就像是他曾任河北省委书记,不谋私利,女儿却因生活拮据绝望自尽引言不管是在过去,还是在现在,相信一定有不少人都曾希望能拥有一个当大官的父亲。因为在这些人看来,能拥有一个当大官的父亲,不仅能让自己变得颇有面子,而且还能借父亲之势给自己谋得不少的古代宫女真实的生活现状被人肆意糟蹋蹂躏,与牲畜无异在古代皇宫之中,除了有太监专门为皇室服务之外,还有数量庞大的宫女也同样是担任着为皇室服务的任务,她们每天和太监一起承担着皇宫之中很多繁杂的工作,生活也是十分艰辛,不过很多人通过影视
本田CRV如何防盗?本田CRV容易被盗并不是空穴来风的事情,据权威部门统计在我国的四川省尤其是本田车子的盗窃高发地,其中本田CRV被盗比例遥遥领先。曾经有贼人2分钟盗走一辆本田CRV,容易被盗的原因有如何晚上发面早上蒸?如何晚上发面早晨蒸,对于这个问题我还是比较有发言权的。自从儿子上小学以后,我的生活也被安排得更加紧密,每天的早餐也要按时准点的吃,所以我每天基本都是早晨500就起来准备早餐。我们家什么酒最难喝?前几天,有个安徽朋友过来,带了一瓶古井贡酒,40。6度。晚上我俩干了一瓶,口感相当不错,入口柔,咽下后回味悠长,的确好酒!过几天又吃饭,他问我你喝过X小白没有?我摇摇头,他点了一瓶假设一个人遇上了大型史前动物,依靠子弹能够击杀远古生物吗?朋友,这是子弹。22LR这也是子弹14。5x114毫米高射机枪弹第一张图中的子弹是。22LR(即5。615mmR),根据弹丸的质量不同,其出膛动能只有178259焦耳,这玩意别说打黑洞为什么不吸太阳和月亮还有地球呢?黑洞不是不吸引太阳和月亮,事实恰恰相反,正是由于黑洞对太阳地球月亮等都有吸引,才能形成当前的运动轨迹。只是在考虑这个问题时,我们需要分析天体各自的综合受力情况。黑洞对太阳的吸引我们十二星座哪个星座最聪明,哪个星座最傻?十二星座智商是多少?让我们看一看所有黄道十二宫(按分析智能排序)1。处女座(8月23日至9月22日)处女座可能是最聪明的迹象,因为它们混合了各种不同类型的情报。他们具有分析能力,但如果现在想做个足够取代微信的社交软件,至少需要砸多少亿?无可否认,微信是社交圈的老大。你想要取代它就等同于和整个腾讯帝国开战,一般公司你砸再多钱也做不到。为什么这么说呢?原因主要如下1腾讯四大绝招,让你砸再多钱也没用社交这块肥肉很多人都微信被人骗了2000块,公安能通过对方微信号查到对方在哪里吗?公安机关要找谁的话,没有微信号一样能找到,我们经常讲唯一完美逃避警察追捕的办法就是作案之后找个人迹罕至的地方自杀,当然了,本来就人迹罕至,不自杀也活不了多久。但是通过微信被人骗了2如果一个家庭真的不逼孩子学习,支持他的所有爱好,这个孩子的未来会怎么样?我的一个闺蜜吧(不过已经不来往了),她有俩孩子,大的是个儿子,小的是个闺女。大儿子今年36了,小儿子23。俩孩子都没有学历,大儿子上到初一,暑假过了该开学了,早晨起来不去。问为什么孩子6个月添辅食后每天都喂南瓜,9个月的时候发现手掌脚掌发黄,要抽血验肝功能吗?是什么原因导致的?不怕的是胡罗卜素摄入量过多积聚而引起,一般如孩子各样都很健康正常的话,最近停吃南瓜换吃别的就可以逐渐消退。如仍不放心,现在好办带他去医院抽点血验个肝功能,出结果了疑云散了,到时一天不到30年,全民体温从37度降到36。5度,到底是什么原因?人的身体活动量越多,体温越高身体越健康,体温下降就像休眠,应该多锻炼增加血液循环体温就会升高,体温下降和现在的运动量有关我记得很小的时候医生量体温是让含在嘴里的,37。5度是标准体
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网