Docker全方位攻略与主动化运维Docker全方位攻略与自动化运维  第1张

介绍

Docker Registry(Docker注册中心)是一个办理Docker容器镜像存储和交付的应用法式。注册中心集中容器镜像并削减开发人员的构建时间。Docker镜像通过虚拟化包管不异的运行情况,但是构建镜像需要大量的时间投入。例如,开发人员能够从包罗所有需要组件的注册中心下载压缩镜像,而不是零丁安拆依赖项和包来利用Docker。此外,开发人员能够利用持续集成东西,例如:Buddy主动将镜像推送到注册中心,以在消费和开发过程中无缝更新镜像。

Docker Hub是一个免费公共的注册中心,能够托管您的自定义Docker镜像,但在某些情况下您不希望您的镜像公开利用。镜像凡是包罗运行应用法式所需的所有代码,因而在利用专有软件时更好利用私有的注册中心。

通过本文您将学到以下的大致内容:

Ubuntu 22.04初始办事器设置指南若何在Ubuntu 22.04上安拆和利用Docker若何在Ubuntu 22.04上安拆和利用Docker Compose若何在Ubuntu 22.04上安拆Nginx若何在Ubuntu 22.04上利用Let's Encrypt平安地利用Nginx若何在Ubuntu 22.04上设置私有Docker注册中心DevOps开发运维一体化与Docker完美连系初始办事器设置

初次新建Ubuntu 22.04办事器时,您应该施行一些重要的设置装备摆设步调做为初始设置的一部门。那些步调将进步办事器的平安性和可用性,并为您的后续操做打下坚实的根底。

登录为root​

要登录到您的办事器,您需要晓得办事器的公网IP地址。您还需要root用户帐户密码或密钥(若是您安拆了用于身份验证的SSH密钥)。

若是当前未毗连到您的办事器,请利用以下号令以root用户身份登录。将号令中您的_公网_IP部门替代为您办事器的公网IP地址:

ssh root@您的_公网_IP

承受有关主机显示的提醒(若是呈现)。若是您的办事器利用密码身份验证,请供给您的root密码以登录。若是您利用受密码庇护的SSH密钥,您可能需要在每次会话初次利用该密钥时输入密码若是那是您第一次利用密码登录办事器,您可能还需要更改root密码。 若是收到提醒,请根据申明更改密码即可。

关于root

root用户是Linux情况中具有提拔权限的办理用户。因为root帐户具有更高的权限,因而不鼓舞您经常利用root。root帐户能够做出十分具有毁坏性的更改,即便是不测的操做也可能带来很大的毁坏。

下一步是设置一个新的用户帐户,降低日常利用的权限。稍后,我们将向您展现若何在您需要时临时获得更高的权限。

新建用户​

以root身份登录后,您将可以添加新的用户帐户。 未来,我们将利用那个新帐户而不是root登录。

此示例创建一个名为edal的新用户,但您应该将其替代为您喜好的用户名:

adduser edal

您将被要求答复一些问题,起首是帐户密码。

输入一个强悍的密码,若是需要的话,填写任何附加信息。那些信息不是必须的,您能够在任何您想跳过的字段中按回车键。

授予办理员权限​

如今您拥有一个具有通俗帐户权限的新用户帐户。然而,您有时需要以root用户身份施行办理使命。

为了制止登记您的常规用户并从头登录root帐户,您能够为用户的常规帐户设置所谓的超等用户roo权限。那些权限将允许您的通俗用户在号令前加上sudo以利用办理权限运行号令。

要将那些权限添加到您的新用户中,您需要将用户添加到sudo系统组中。在Ubuntu 22.04上,默认情况部属于sudo组的用户能够利用sudo号令。

以root身份运行此号令将您的新用户添加到sudo组中:

usermod -aG sudo edal

您如今能够在号令前键入sudo,以在以通俗用户身份登录时以超等用户权限运行。

设置防火墙​

Ubuntu 22.04办事器能够利用UFW防火墙来确保只允许毗连到某些办事。 您能够利用此应用法式设置根本防火墙。

应用法式能够在安拆时向UFW注册它们的设置装备摆设文件。那些设置装备摆设文件允许UFW按名称办理那些应用法式。OPEnSSH,允许您毗连到您的办事器的办事,有一个在UFW注册的设置装备摆设文件。

您能够通过键入以下内容来查抄已安拆的UFW设置装备摆设文件列表:

ufw app list输出信息Available applications: OpenSSH

您需要确保防火墙允许SSH毗连,以便您下次能够登录到您的办事器。通过键入以下内容允许那些毗连:

ufw allow OpenSSH

然后输入以下号令启用防火墙

ufw enable

输入y并按回车键继续。您能够通过键入以下内容看到仍然允许SSH毗连:

ufw status输出信息Status: activeTo Action From-- ------ ----OpenSSH ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)

防火墙当前阻遏除SSH之外的所有毗连。若是您安拆和设置装备摆设附加办事,您将需要调整防火墙设置以允许新流量进入您的办事器。

为通俗用户启用外部拜候​

如今您已经有了日常利用的通俗用户,您需要确保能够通过SSH间接毗连到该帐户。

为新用户设置装备摆设SSH拜候取决于您办事器的根帐户是利用密码仍是SSH密钥停止身份验证。

若是root账户利用密码认证

若是您利用密码登录到您的root帐户,则会为SSH启用密码身份验证。您能够通过翻开一个新的末端会话并利用SSH和您的新用户名连SSH到您的新用户帐户:

sudo command_to_run

若是root账户利用SSH密钥认证

若是您利用SSH密钥登录到您的根帐户,则SSH的密码身份验证将被禁用。要利用SSH密钥以通俗用户身份登录,您必需将当地公钥的副本添加到新用户的 ~/.ssh/authorized_keys 文件中。

因为您的公钥已经在办事器上根帐户的 ~/.ssh/authorized_keys 文件中,您能够利用当前会话将该文件和目次构造复造到新用户帐户。

复造具有准确所有权和权限的文件的最简双方法是利用rsync号令。此号令将复造root用户的.ssh目次、保留权限并修改文件所有者,所有那些都在一个号令中完成。确保更改相关号令以婚配您的常规用户名:

rsync号令处置以斜杠结尾与没有斜杠差别鄙人面利用rsync时,请确保源目次(~/.ssh)不包罗尾部斜杠(查抄以确保您没有利用 ~/.ssh/)。

若是您不小心在号令中添加斜杠结尾,rsync会将root帐户的 ~/.ssh 目次的内容复造到sudo用户的主目次,而不是复造整个 ~/.ssh 目次构造。 若如斯文件将位于错误的位置,SSH将无法找到和利用。

rsync --archive --chown=edal:edal ~/.ssh /home/edal

如今,在你的当地机器上翻开一个新的末端会话,并使对新用户名利用SSH:

ssh edal@YOUr_server_ip

您就能利用新用户帐户毗连到办事器而无需利用密码。 请记住,若是您需要以办理权限运行号令,请在号令前键入sudo,如下所示:

sudo 加上号令

每次会话初次利用sudo时(之后会按期提醒),系统城市提醒您输入通俗用户的密码。

安拆和利用Docker​安拆Docker​

官方Ubuntu存储仓中供给的Docker安拆包可能不是最新版本。为确保获得最新版本,我们将从官方Docker存储仓安拆Docker。为此,我们将添加一个新的包源,添加来自Docker的GPG密钥以确保下载有效,然后安拆软件包。

起首,更新您现有的软件包列表:

sudo apt update

接下来,安拆一些先决前提包,让apt通过HTTPS利用软件包:

sudo apt install apt-transport-https ca-certificates curl software-PRoperties-common

然后将官方Docker存储仓的GPG密钥添加到您的系统中:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

将Docker存储仓添加到APT源:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

再次更新您现有的软件包列表,以便识别添加内容:

sudo apt update

确保您要从Docker存储仓而不是默认的Ubuntu存储仓停止安拆:

apt-cache policy docker-ce

你会看到类似的输出,Docker的版本号可能差别:

docker-ce: Installed: 5:23.0.1-1~ubuntu.22.04~jammy Candidate: 5:23.0.1-1~ubuntu.22.04~jammy Version table: *** 5:23.0.1-1~ubuntu.22.04~jammy 500 500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages 100 /var/lib/dpkg/status 5:23.0.0-1~ubuntu.22.04~jammy 500 500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages 5:20.10.23~3-0~ubuntu-jammy 500 500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

请留意,docker-ce未安拆,但安拆候选来自Ubuntu 22.04(jammy)的Docker存储仓。

最初,安拆Docker:

sudo apt install docker-ce

如今安拆Docker,启动守护历程,并启用启动时启动的历程。查抄它能否正在运行:

sudo systemctl status docker

输出类似于以下内容,表白该办事处于启用形态并正在运行:

● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-02-20 15:53:30 CST; 3min 29s agoTriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 1088 (dockerd) Tasks: 23 Memory: 125.2M CPU: 3.375s CGroup: /system.slice/docker.service └─1088 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

如今安拆Docker不只能够供给Docker办事(守护历程),还能够供给docker号令行适用法式或Docker客户端。我们将在本教程后面切磋若何利用docker号令。

无Sudo施行Docker号令(选修)​

默认情况下,docker号令只能由root用户或docker用户组运行,docker用户组是在Docker安拆过程中主动创建。若是您测验考试在不利用sudo前缀或不在docker用户组中的情况下运行docker号令,您将获得如下输出:

docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.See 'docker run --help'.

若是您想在运行docker号令时制止键入sudo,请将您的用户名添加到docker用户组:

sudo usermod -aG docker ${USER}

要应用新的组员级别,请退出办事器并从头登录,或键入以下内容:

su - ${USER}

系统将提醒您输入用户密码以继续。

通过键入以下内容确认您的用户如今已添加到docker用户组:

groups输出edal sudo docker

若是您需要将用户添加到您未登录的docker用户组,请声明该用户名:

sudo usermod -aG docker 用户名

本文的其余部门以docker用户组中的用户身份运行docker号令为示例。若是您不想如许做,请在号令前加上sudo。

接下来让我们来理论docker号令。

Docker号令的运用​

利用docker包罗向其传递一系列选项和号令,然后是参数。语法接纳以下形式:

docker [选项] [号令] [参数]

要查看所有可用的子号令,请键入:

docker

Docker版本23.0.1可用子号令的完好列表如下:

Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server export Export a container's filesystem as a tar archive history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes

要查看特定数令可用的选项,请键入:

docker docker-subcommand --help

要查看有关Docker的系统范畴信息,请利用:

docker info

让我们摸索此中的一些号令。我们将从处置镜像起头。

利用Docker镜像​

Docker容器通过Docker镜像构建。默认情况下,Docker从Docker Hub中提取那些镜像,那是一个由Docker项目公司办理的Docker注册中心,任何人都能够在Docker Hub上托管他们的Docker镜像,因而您需要的大大都应用法式和Linux发行版都在那里有托管的镜像。

要查抄您能否能够从Docker Hub拜候和下载镜像,请键入:

docker run hello-world

输出将显示Docker一般工做:

Unable to find image 'hello-world:latest' locallylatest: Pulling from library/hello-world2db29710123e: Pull completeDigest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefbStatus: Downloaded newer image for hello-world:latestHello from Docker!This message shows that your installation appears to be working correctly....

Docker初始无法在当地找到hello-world镜像,因而它从默认存储仓Docker Hub下载该镜像。下载镜像后,Docker从镜像创建一个容器并在容器内施行应用法式同时显示动静。

您能够利用带有search子号令的docker号令来搜刮Docker Hub上可用的镜像。 例如,要搜刮Ubuntu镜像,请键入:

docker search ubuntu

该脚本将抓取Docker Hub并返回名称与搜刮字符串婚配的所有镜像列表。在那种情况下,输出将类似于以下信息:

NAME DESCRIPTION STARS OFFICIAL AUTOMATEDubuntu Ubuntu is a Debian-based Linux operating sys… 15619 [OK]websphere-liberty WebSphere Liberty multi-architecture images … 291 [OK]open-liberty Open Liberty multi-architecture images based… 57 [OK]neurodebian NeuroDebian provides neuroscience research s… 98 [OK]ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 50 [OK]...

在OFFICIAL栏中,OK暗示由项目背后的公司构建和撑持的镜像。 确定要利用的镜像后,您能够利用pull子号令将其下载到您的计算机上。

施行以下号令将官方ubuntu镜像下载到您的计算机:

docker pull ubuntu

您将看到所显示的信息如下:

Using default tag: latestlatest: Pulling from library/ubuntuDigest: sha256:9a0bdde4188b896a372804be2384015e90e3f84906b750c1a53539b585fbbe7fStatus: Image is up to date for ubuntu:latestdocker.io/library/ubuntu:latest

下载镜像后,您能够通过下载的镜像利用run子号令运行容器。正如您在hello-world示例中看到的那样,若是在利用run子号令施行docker时髦未下载镜像,则Docker客户端将先下载镜像,然后利用它运行容器。

要查看已下载到您的计算机的图像,请键入:

docker images

您将看到所显示的信息如下:

hello-world latest feb5d9fea6a5 17 months ago 13.3kBubuntu 20.04 e40cf56b4be3 2 weeks ago 72.8MBubuntu 22.04 58db3edaf2be 3 weeks ago 77.8MBubuntu latest 58db3edaf2be 3 weeks ago 77.8MB

如您将在本文后面看到的那样,您能够修改用于运行容器的镜像并用于生成新镜像,然后能够将那些镜像上传/推送(推送是手艺术语)到Docker Hub或其他Docker注册中心。

下面,让我们更详细地领会若何运行容器。

运行Docker容器​

您在以上运行的hello-world容器是在发出测试动静后运行和退出的容器示例。容器可不单单有如许的功用,且容器能够停止交互利用。究竟结果,它们类似于虚拟机,只是对资本运用更为友好。

例如,让我们利用最新的Ubuntu镜像运行一个容器。-i和-t组合使您能够通过交互式shell拜候容器:

docker run -it ubuntu

您的号令提醒应该更改以反映您如今在容器内工做的情况,且如下所示:

输出信息root@c1c84b562c09:/#

请留意号令提醒中的容器ID。在此示例中为c1c84b562c09。稍后您将需要该容器ID以在您想要删除它时识别该容器。

如今您能够在容器内运行任何号令。例如,让我们更新容器内的包数据库。您不需要在任何号令前加上sudo前缀,因为您是以root用户身份在容器内操做:

root@eb0d0364eb18:/# apt update

然后能够在此中安拆任何应用法式,让我们安拆Node.js看看:

root@6327df395f88:/# apt install nodejs

那会将Node.js安拆在来自官方Ubuntu存储仓的容器中。 安拆完成后,验证能否安拆了Node.js:

root@eb0d0364eb18:/# node -v

您会在末端中看到版本号:

输出信息v12.22.9

您在容器内所做的任何更改仅适用于该容器。

要退出容器,请在提醒符处键入exit。

接下来让我们办理系统上的容器。

Docker容器办理​

利用Docker一段时间后,您的计算机上将有许多启用(运行)和非启用容器。要查看启用容器,请利用:

docker ps

您将看到所显示的信息如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

本文中,您启动了两个容器;一个来自hello-world镜像,另一个来自ubuntu镜像。两个容器都不再运行,但它们仍然存在于您的系统中。

要查看所有容器——启用或非启用,利用-a运行docker ps:

docker ps -a

您将看到所显示的信息如下:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6327df395f88 ubuntu "/bin/bash" 36 minutes ago Exited (129) 27 minutes ago flamboyant_darwineb0d0364eb18 ubuntu "/bin/bash" 56 minutes ago Exited (129) 50 minutes ago eloquent_poincarec1c84b562c09 ubuntu "/bin/bash" About an hour ago Exited (129) 57 minutes ago competent_stonebrakerd5741949647c hello-world "/hello" 2 hours ago Exited (0) 2 hours ago optimistic_nobel

要查看您创建的最新容器,就利用 -l :

docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6327df395f88 ubuntu "/bin/bash" 54 minutes ago Exited (129) 45 minutes ago flamboyant_darwin

要启动已停行的容器,请利用 docker start,后跟容器ID或容器名称。让我们启动ID为6327df395f88的基于Ubuntu的容器:

docker start 6327df395f88

容器将启动,您能够利用 docker ps 查看其形态:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES6327df395f88 ubuntu "/bin/bash" 59 minutes ago Up 22 seconds flamboyant_darwin

要停行正在运行的容器,请利用 docker stop,后跟容器ID或名称。那一次,我们将利用Docker分配给容器的名称,即flamboyant_darwin:

docker stop flamboyant_darwin

一旦你决定不再需要一个容器,利用 docker rm 号令删除它,再次利用容器ID或名称。利用 docker ps -a 号令查找与hello-world镜像联系关系的容器ID或名称并将其删除。

docker rm flamboyant_darwin

您能够启动一个新容器并利用 --name 为其定名。您还能够利用 --rm 创建一个在停行时自行删除的容器。有关那些选项和其他选项的更多信息,请参阅 docker run help 号令。

容器能够酿成镜像,你能够用它来构建新的容器。让我们看看若何实现。

将容器更改提交至Docker镜像​

启动Docker镜像时,您能够像利用虚拟机一样创建、修改和删除文件。您所做的更改将仅可用于该容器。您能够启动和停行它,但一旦您利用 docker rm 号令销毁,所做的更改将永久丧失。

在此向您展现若何将容器的形态保留为新的Docker镜像。

在Ubuntu容器中安拆Node.js后,您如今有一个运行镜像的容器,但该容器与您用来创建它的镜像差别。但是您以后可能想基于那个Node.js容器造做新镜像。

然后利用以下号令将更改提交到新的Docker镜像实例。

docker commit -m "您的提交注解" -a "做者名称" container_id repository/new_image_name

-m 用于提交信息注解,可帮忙您和其别人领会您所做的更改,而 -a 用于指定做者。container_id是您在本文前面起头交互式Docker会话时记下的阿谁。 除非您在Docker Hub上创建了额外的存储仓,不然存储仓repository凡是是您的Docker Hub用户名。

例如,关于容器ID为c1c84b562c09的用户edal,号令为:

docker commit -m "添加Node.js" -a "edal" c1c84b562c09 edal/ubuntu-nodejs

当您提交镜像时,新镜像会保留在您当地的计算机上。 在本文的后面,您将进修若何将镜像推送到Docker Hub等Docker注册中心,以便其别人能够拜候或利用。

再次列出Docker镜像将显示新镜像,以及它派生自的旧镜像:

docker images

您将看到所显示的信息如下:

REPOSITORY TAG IMAGE ID CREATED SIZEedal/ubuntu-nodejs latest e68a2e992e29 12 seconds ago 77.8MB...

在此示例中,ubuntu-nodejs是新镜像,它派生自Docker Hub中现有的ubuntu镜像。大小差别反映了所做的更改。在那个例子中,变革是安拆了NodeJS。因而,下次您需要利用预安拆了NodeJS的Ubuntu运行容器时,您只需利用新镜像即可。

您还能够通过Dockerfile构建镜像,如许您就能够在新镜像中主动安拆软件。但那超出了本文要分享的内容范畴。

如今让我们与其别人共享新镜像,以便其别人能够从中创建容器。

将镜像推送到Docker存储仓​

从现有镜像创建新镜像后的下一个符合逻辑的步调是在Docker Hub或您有权拜候的其他Docker注册中心上与您的几个伴侣、整个世界共享。要将镜像推送到Docker Hub或任何其他Docker注册中心,您必需在那里拥有一个帐户。

要推送您的图像,请先登录Docker Hub。

docker login -u 用户名

系统将提醒您利用Docker Hub密码停止身份验证,若是您指定了准确的密码,则身份验证就会胜利。

若是您的Docker注册中心用户名与您用于创建映像的当地用户名差别,您将必需利用您的注册中心用户名标识表记标帜您的镜像。关于最初一步中给出的示例,您将键入:

docker tag edal/ubuntu-nodejs docker用户名/ubuntu-nodejs

然后你能够利用以下体例推送你本身的镜像:

docker push docker用户名/镜像名称

要将ubuntu-nodejs镜像推送到edal存储仓,号令为:

docker push edal/ubuntu-nodejs

该过程在上传镜像时可能需要一些时间才气完成,但完成后,输出将如下所示:

The push refers to a repository [docker.io/edal/ubuntu-nodejs]a3fbbfb44187: Pusheddf70bf19a086: Pushed43b5c90a4eba: Pushed7f18c442962b: Pushedgce512daaf98: Pushed6aae4313b42d: Pushed

将镜像推送到注册中心后,它应该列在您帐户的仪表板上,如下图所示。

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

若是推送测验考试招致此类错误,那么您可能没有登录:

The push refers to a repository [docker.io/edal/ubuntu-nodejs]a3fbbfb44187: Preparingdf70bf19a086: Preparing43b5c90a4eba: Preparing7f18c442962b: Preparinggce512daaf98: Preparing6aae4313b42d: Waitingunauthorized: authentication required

利用 docker login 登录并反复推送测验考试。 然后验证能否存在于您的Docker Hub存储仓页面上。

您如今能够利用 docker pull edal/ubuntu-nodejs 将镜像拉取到新机器并利用它来运行新容器。

安拆Docker Compose​

为确保您获得最新的Docker Compose不变版本,您将从其官方Github存储仓下载该软件。

起首,确认其发布页面中可用的最新版本。在撰写本文时,最新的不变版本是2.16.0。

利用以下号令下载:

mkdir -p ~/.docker/cli-plugins/curl -SL https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

接下来,设置准确的权限,以便 docker compose 号令可施行:

chmod +x ~/.docker/cli-plugins/docker-compose

欲验证安拆能否胜利,您能够运行:

docker compose version

您将看到所显示的信息如下:

Docker Compose version v2.16.0

Docker Compose现已胜利安拆在您的系统上。接下来,我们将领会若何设置 docker-compose.yml 文件并利用此东西启动和运行容器化情况。

设置docker-compose.yml​

为演示若何设置docker-compose.yml文件并利用Docker Compose,您将利用来自Docker Hub(公共Docker注册中心)的官方Nginx镜像创建一个Web办事器情况。此容器化情况将供给单个静态HTML文件。

起首在您的主文件夹中新建一个目次,然后转到此中:

mkdir ~/compose-democd ~/compose-demo

在此目次中,设置一个应用法式文件夹做为Nginx情况的文档根目次:

mkdir app

利用您喜好的文本编纂器,在 app 文件夹中新建一个index.html文件:

vim app/index.html

然后,在文件中输入以下代码

~/compose-demo/app/index.html

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Docker Compose 示例</title></head><body> <h1>那是一个Docker Compose示例页面</h1> <p>此内容由Nginx容器办事显示</p> </body></html>

接下来,创建 docker-compose.yml 文件:

vim docker-compose.yml

在您的docker-compose.yml文件中插入以下内容:

~/compose-demo/docker-compose.yml

version: '3.8'services: web: image: nginx:alpine ports: - "8000:80" volumes: - ./app:/usr/share/nginx/html

docker-compose.yml文件凡是以版本定义开头,告诉Docker Compose您正在利用哪个设置装备摆设版本。

然后您有办事模块,您能够在此中设置属于此情况的办事。在本例中,您有一个名为web的办事。此办事利用nginx:alpine镜像并利用ports指令设置端口重定向。主机(运行 Docker Compose的系统)端口8000上的所有恳求都将重定向到端口80上的Web容器,Nginx将在此中运行。

volumes指令将在主机和容器之间创建一个共享卷。那将与容器共享当地应用法式文件夹,卷将位于容器内的/usr/share/nginx/html,然后将笼盖Nginx的默认文档根目次。

您已经设置了一个演示页面和一个docker-compose.yml文件来创建一个容器化的Web办事器情况为其供给办事。鄙人一步中,我们将利用Docker Compose启动此情况。

运行Docker Compose​

有了docker-compose.yml 文件,您如今能够施行Docker Compose来启动您的情况。以下号令将下载需要的Docker镜像,为Web办事创建容器,并在后台形式下运行容器化情况:

docker compose up -d

Docker Compose将先在您的当地系统上查找定义的镜像,若是找不到该镜像,将主动从Docker Hub下载。

您的情况现已启动并在后台运行。要验证容器能否处于启用形态,您能够运行:

docker compose ps

此号令将向您显示有关正在运行的容器及其形态的信息,以及当前存在的任何端口重定向:

NAME IMAGE COMMAND SERVICE CREATED STATUS PORTScompose-demo-web-1 nginx:alpine "/docker-entrypoint.…" web 31 seconds ago Up 27 seconds 0.0.0.0:8000->80/tcp, :::8000->80/tcp

您如今能够通过将阅读器指向localhost:8000(当地机器上运行此演示)或您的域名或办事器IP:8000(长途办事器上运行此演示)来拜候演示应用法式。

你会看到类似如下页面:

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

Docker Compose号令​

您已领会若何设置docker-compose.yml文件并利用docker compose启动您的情况。下面,我们来领会若何利用Docker Compose号令来办理容器化情况并与之交互。

要查抄Nginx容器生成的日记,能够利用 logs 号令:

docker compose logs

您将看到所显示的信息如下:

edal@buddy:~/compose-demo$ docker compose logscompose-demo-web-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configurationcompose-demo-web-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/compose-demo-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.shcompose-demo-web-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.confcompose-demo-web-1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.confcompose-demo-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.shcompose-demo-web-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.shcompose-demo-web-1 | /docker-entrypoint.sh: Configuration complete; ready for start upcompose-demo-web-1 | 2023/02/21 08:20:53 [notice] 1#1: using the "epoll" event methoDCompose-demo-web-1 | 2023/02/21 08:20:53 [notice] 1#1: nginx/1.23.3...

若是您想在不更改容器当前形态的情况下暂停情况施行,您能够利用:

docker compose pause

发出暂停后恢复运行:

docker compose unpause

stop号令将末行容器施行,但它不会毁坏与容器联系关系的任何数据:

docker compose stop

若是要删除与此容器化情况联系关系的容器、收集和卷,请利用down号令:

docker compose down

注:那不会删除Docker Compose用来启动您的情况的根底镜像(本示例中为nginx:alpine)。每当您利用 docker compose up 再次启动您的情况时,因为镜像已经在您的系统上,因而该过程会很快。

若是您还想从系统中删除根本映像,能够利用:

docker image rm nginx:alpine

您将看到所显示的信息如下:

Untagged: nginx:alpineUntagged: nginx@sha256:6f94b7f4208b5d5391246c83a96246ca204f15eaf7e636cefda4e6348c8f6101Deleted: sha256:2bc7edbc3cf2fce630a95d0586c48cd248e5df37df5b1244728a5c8c91becfe0Deleted: sha256:9ca6be4cd63171f17f0a5e2ea28d5361a299672f41bd65223e7eac7d3d57e76dDeleted: sha256:f7aa4d1226879fb1018ed05617572994840f4c75e5d04df2fffe04980cef11b9Deleted: sha256:f83cdd3286b839bef51f1ae0f1f6164b16e1059a0e131035bfa0bb8bb0021357Deleted: sha256:61b0680052fcdb48f47c8d68687c0b5bbb279b6e3740701885b39ea22ef7b008Deleted: sha256:9045770a1273553bb8bd7ccd2d490ecb56ce762ac993ad74698d14186e39bda6Deleted: sha256:60d9493158e562e8510cd4cabbd7460c03ad39fe2250bbd43bdcd1e75f64ba6fDeleted: sha256:7cd52847ad775a5ddc4b58326cf884beee34544296402c6292ed76474c686d39

您已经领会了若何安拆Docker Compose并基于Nginx Web办事器镜像设置容器化情况。同时,您还领会了若何利用Compose号令办理情况。

下面,我们来为设置私有的Docker注册中心做好筹办:

安拆Nginx​

Nginx是世界上更流行的Web办事器之一,负责托管互联网上一些更大和更高流量的网站。它是一个轻量级的选择,能够用做Web办事器或反向代办署理。

因为Nginx在Ubuntu的默认存储仓中可用,所以能够利用apt打包系统从存储库安拆。

运行以下号令快速安拆Nginx:

sudo apt updatesudo apt install nginx

当提醒确认安拆时按Y。若是系统提醒您从头启动任何办事,请按回车键承受默认值并继续。apt将安拆Nginx和任何必须的依赖项到您的办事器。

调整防火墙​

在测试Nginx之前,需要设置装备摆设防火墙软件以允许拜候该办事。Nginx在安拆时将本身注册为ufw的办事,从而能够间接允许Nginx拜候。

通过键入以下内容列出ufw晓得若何利用的应用法式设置装备摆设:

sudo ufw app list

您将看到所显示的信息如下:

Available applications: Nginx Full Nginx HTTP Nginx HTTPS OpenSSH

如输出所示,Nginx 能够利用三个设置装备摆设文件:

Nginx Full:此设置装备摆设文件同时翻开端口80(一般、未加密的Web拜候)和端口 443(TLS/SSL加密拜候)Nginx HTTP:此设置装备摆设文件仅翻开端口80(一般、未加密的收集拜候)Nginx HTTPS:此设置装备摆设文件仅翻开端口443(TLS/SSL加密拜候)

建议您启用限造最严酷的设置装备摆设文件,该设置装备摆设文件仍将允许您设置装备摆设的流量。如今,我们只需要允许端口80上的拜候。

您能够通过键入以下内容启用此功用:

sudo ufw allow 'Nginx HTTP'

您能够通过键入以下内容来验证更改:

sudo ufw status

您将看到所显示的信息如下:

Status: activeTo Action From-- ----------- ---------OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)查看您的Web办事器​

在安拆过程完毕时,Ubuntu 22.04启动Nginx。Web办事器应该已经启动并正在运行。

我们能够通过键入以下号令查抄systemd初始化系统以确保办事正在运行:

systemctl status nginx● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2023-02-20 22:53:14 CST; 1min 30s ago Docs: man:nginx(8) Process: 19990 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Process: 19991 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS) Main PID: 20091 (nginx) Tasks: 13 (limit: 18902) Memory: 11.3M CPU: 210ms CGroup: /system.slice/nginx.service ├─20091 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;" ├─20094 "nginx: worker process

由此确认,该办事已胜利启动。然而,更好的测试办法是现实从Nginx恳求一个页面。

您能够拜候默认的Nginx页面,通过导航到您办事器的IP地址来确认软件能否一般运行。若是您不晓得办事器的IP地址,能够利用icanhazip.com东西找到,该东西将为您供给从互联网上其他位置收到的公共IP地址:

curl -4 icanhazip.com

获得办事器的IP地址后,将其输入阅读器的地址栏:

http://您的IP地址

您应该会收到默认的Nginx拜候页面:

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

Nginx历程办理​

如今您已经启动并运行了Web办事器,让我们回忆一些根本的办理号令。

欲停行您的Web办事器,请键入:

sudo systemctl stop nginx

启动Web办事器:

sudo systemctl start nginx

重启Web办事器:

sudo systemctl restart nginx

若是您只是停止设置装备摆设更改,Nginx凡是能够在不竭开毗连的情况下从头加载。为此,请键入:

sudo systemctl reload nginx

默认情况下,Nginx设置装备摆设为在办事器启动时主动启动。若是您不想如斯,能够通过键入以下内容来停用此体例:

sudo systemctl disable nginx

欲从头启用该办事以在引导时启动,您能够键入:

sudo systemctl enable nginx

您如今已经进修了根本的办理号令,而且应该筹办好设置装备摆设站点以托管多个域名。

设置办事器模块(保举)​

利用Nginx收集办事器时,办事器模块(类似于Apache中的虚拟主机)可用于封拆设置装备摆设详细信息并从一台办事器托管多个域名。我们将设置一个名为your_domain的域名,现实情况下您需要将其替代为您本身的域名。

Ubuntu 22.04上的Nginx默认启用一个办事器模块,该办事器模块设置装备摆设为从/var/www/html目次中供给文档。固然那适用于单个站点,但若是您托管多个站点,可能会变得鸠拙。我们不修改/var/www/html,而是在/var/www中为我们的your_domain站点创建一个目次构造,将/var/www/html保留为默认目次,以便在客户端恳求不婚配时供给办事其他网站。

如下所示为your_domain创建目次,利用-p标记创建任何需要的上级目次:

sudo mkdir -p /var/www/your_domain/html

接下来,利用 $USER 情况变量分配目次的所有权:

sudo chown -R $USER:$USER /var/www/your_domain/html

若是您没有修改设置默认文件权限的umask值,您的Web根目次的权限应该是准确的。为确保您的权限准确并允许所有者读取、写入和施行文件,同时授予组和其他仅读取和施行权限,您能够输入以下号令:

sudo chmod -R 755 /var/www/your_domain

接下来,利用vim或您喜好的编纂器创建一个示例index.html页面:

sudo vim /var/www/your_domain/html/index.html

在以上文件里添加以下HTML代码示例:

文件途径:/var/www/your_domain/html/index.html

<html> <head> <title>your_domain 欢送您!</title> </head> <body> <h1>搞定! your_domain办事器模块运行一般!</h1> </body></html>

为了让Nginx内容供给办事,有需要利用准确的指令创建一个办事器模块。我们不间接修改默认设置装备摆设文件,而是在/etc/nginx/sites-available/your_domain新建一个:

sudo vim /etc/nginx/sites-available/your_domain

粘贴以下设置装备摆设模块,它与默认设置装备摆设类似,但针对我们的新目次和域名停止了更新:

文件途径:/etc/nginx/sites-available/your_domain

server { listen 80; listen [::]:80; root /var/www/your_domain/html; index index.html index.htm index.nginx-debian.html; server_name your_domain www.your_domain; location / { try_files $uri $uri/ =404; }}

请留意,我们已将root设置装备摆设更新为我们的新目次,并将 server_name 更新为我们的域名。

接下来,让我们通过创建一个到sites-enabled目次的链接来启用该文件,Nginx在启动期间从中读取:

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

Nginx利用一种称为symbolic链接或symlinks符号链接的常见做法来跟踪启用的办事器模块。创建一个符号链接就像在磁盘上创建一个快速链接的体例,如许您能够稍后从启用站点的目次中删除该快速体例,同时若是您想要启用,则将办事器模块保留在sites-available中。

为制止因添加额外的办事器名称而可能呈现的哈希桶内存问题,有需要调整 /etc/nginx/nginx.conf 文件中的单个值。 翻开文件:

sudo vim /etc/nginx/nginx.conf

找到 server_names_hash_bucket_size 指令并删除 # 符号以打消正文该行。

文件途径:/etc/nginx/nginx.conf

...http { ... server_names_hash_bucket_size 64; ...}...

接下来,测试以确保您的Nginx文件中没有任何语法错误:

sudo nginx -t

若是没有任何问题,请从头启动Nginx以启用您的更改:

sudo systemctl restart nginx

Nginx如今应该为您的域名供给办事。您能够通过阅读器拜候http://your_domain 来停止测试,您会在页面上看到如下内容:

搞定! your_domain办事器模块运行一般!熟悉Nginx重要文件与目次​

如今您晓得若何办理Nginx办事自己,您应该花几分钟时间熟悉一些重要的目次和文件。

内容部门

/var/www/html:为Web内容,默认情况下仅包罗您之前看到的默认Nginx页面,由/var/www/html目次供给。那能够通过更改Nginx设置装备摆设文件来更改。

办事器设置装备摆设

/etc/nginx:Nginx设置装备摆设目次,所有Nginx设置装备摆设文件都驻留在此处。/etc/nginx/nginx.conf:次要Nginx设置装备摆设文件,能够修改以变动Nginx全局设置装备摆设。/etc/nginx/sites-available/:能够存储每个站点办事器模块的目次。Nginx不会利用在此目次中找到的设置装备摆设文件,除非将其链接到sites-enabled目次。凡是,所有办事器模块设置装备摆设都在此目次中完成,然后通过链接到其他目次来启用。/etc/nginx/sites-enabled/:存储启用每站点办事器模块的目次。凡是是通过链接到sites-available目次中的设置装备摆设文件来停止创建。/etc/nginx/snippets:该目次含有设置装备摆设片段,可包罗在Nginx设置装备摆设的其他处所。躲藏可反复的设置装备摆设片段是重构为片段的备用者。

办事器日记

/var/log/nginx/access.log:除非Nginx设置装备摆设为其他体例,不然对Web办事器的每个恳求城市记录在此日记文件中。/var/log/nginx/error.log:任何Nginx错误都将记录在此日记中。安拆Let's Encrypt SSL证书​安拆Certbot​

Certbot建议利用他们的snap包停止安拆。Snap包适用于几乎所有Linux发行版,但它们要求您先安拆snapd才气办理snap包。Ubuntu 22.04撑持开箱即用的 snap,因而您能够先确保您的snapd核心为最新更新:

sudo snap install core; sudo snap refresh core

若是您安拆了旧版本certbot在办事器上,则应在继续之前将其删除:

sudo apt remove certbot

之后,您就能够安拆certbot包啦:

sudo snap install --classic certbot

最初,您能够将certbot号令从snap安拆目次链接到您的途径,如许您就能够通过键入certbot来运行。并不是所有包都需要如许做,但默认情况下snap的侵入性较低,因而它们不会不测地与任何其他系统包发作抵触:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

如今我们已经安拆了Certbot,下面运行它来获取SSL证书。

获取SSL证书​

Certbot供给了多种通过插件获取SSL证书的体例,插件将负责从头设置装备摆设Nginx并在需要时从头加载设置装备摆设。要利用此插件,请键入以下内容:

sudo certbot --nginx -d your_domain -d www.your_domain

以上号令利用 --nginx 插件运行certbot,利用 -d 指定我们希望证书有效的域名。

运行号令时,系统会提醒您输入电子邮件地址并同意办事条目。施行此操做后,您应该会看到如下相关证书存储位置的一条动静:

Successfully received certificate.Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pemKey is saved at: /etc/letsencrypt/live/your_domain/privkey.pemThis certificate expires on 2023-05-21.These files will be updated when the certificate renews.Certbot has set up a scheduled task to automatically renew this certificate in the background.Deploying certificateSuccessfully deployed certificate for your_domain to /etc/nginx/sites-enabled/your_domainSuccessfully deployed certificate for www.your_domain to /etc/nginx/sites-enabled/your_domainCongratulations! You have successfully enabled HTTPS on https://your_domain and https://www.your_domain- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -If you like Certbot, please consider supporting our work by: * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate * Donating to EFF: https://eff.org/donate-le- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

您的证书已下载、安拆和加载,您的Nginx设置装备摆设如今将主动将所有Web恳求重定向到https://。试着从头加载您的网站并留意阅读器的平安指示器。它应该表白该站点已得到妥帖庇护,凡是带有锁图标。

Certbot主动更新​

Let's Encrypt的证书有效期只要九十天。我们安拆的certbot包通过添加一个每天运行两次的systemd计时器来为我们处理那个问题,并主动更新任安在三十天内到期的证书。

您能够利用systemctl查询按时器的形态:

sudo systemctl status snap.certbot.renew.service

您将看到所显示的信息如下:

○ snap.certbot.renew.service - Service for snap application certbot.renew Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static) Active: inactive (dead)TriggeredBy: ● snap.certbot.renew.timer

欲测试更新续订过程,您能够利用certbot停止试运行:

sudo certbot renew --dry-run

若是您没有看到任何错误,则一切停当。需要时,Certbot将更新您的证书并从头加载Nginx以获取更改。若是主动续订过程失败,Let's Encrypt将向您指定的电子邮件发送一条动静,在您的证书即将过时时通知您。

设置私有Docker注册中心​安拆与设置装备摆设Docker注册中心​

在启动和测试容器时,号令行上运行Docker很有用,但关于涉及并行运行多个容器的更大摆设,可能会变得鸠拙。

利用Docker Compose,您能够编写一个 .yml 文件来设置每个容器的设置装备摆设和容器彼此通信所需信息。您能够利用 docker compose 东西向构成应用法式的所有组件发出号令,并将它们做为一个组停止控造。

Docker Registry(Docker注册中心) 自己是一个包罗多个组件的应用法式,因而您可利用Docker Compose来停止办理。要启动注册中心实例,您需设置一个 docker-compose.yml文件来定义以及注册中心将在磁盘上存储其数据的位置。

在此,我们将设置装备摆设存储在主机办事器上名为 docker-registry 的目次中。通过运行以下号令创建:

mkdir ~/docker-registry

转向改目次:

cd ~/docker-registry

在目次下再创建一个名为data的子目次:

mkdir data

通过运行以下号令创建并翻开名为 docker-compose.yml 的文件:

vim docker-compose.yml

添加以代码将其定义Docker注册中心的根本实例:

~/docker-registry/docker-compose.yml

version: '3.8'services: registry: image: registry:latest ports: - "5000:5000" environment: REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - ./data:/data

以上文件,您定名第一个办事 registry ,利用 registry 镜像并将其设置到最新版本。然后,在端口下,将主机上的端口 5000 映射到容器的端口 5000 ,那将允许您向办事器上的端口 5000 发送恳求并将恳求转发到注册中心。

在 environment 部门,设置 REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY 变量至 /data ,指定应在哪个卷中存储其数据。然后,在 volumes 部门,将主机文件系统上的 /data 目次映射到容器中的 /data 通行利用。数据现实上将存储在主机的文件系统中。

保留并退出文件编纂页面

您如今能够通过运行以下号令起头设置装备摆设:

docker compose up

注册中心容器及其依赖项将被下载并启动。

[+] Running 6/6 ⠿ registry Pulled 7.7s ⠿ ef5531b6e74e Pull complete 2.7s ⠿ a52704366974 Pull complete 2.8s ⠿ dda5a8ba6f46 Pull complete 2.9s ⠿ eb9a2e8a8f76 Pull complete 3.3s ⠿ 25bb6825962e Pull complete 3.9s[+] Running 2/1 ⠿ Network docker-registry_default Created 0.1s ⠿ Container docker-registry-registry-1 Created 0.0sAttaching to docker-registry-registry-1docker-registry-registry-1 | time="2023-02-21T19:08:16.67735615Z" 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.16.15 instance.id=9bd45996-08d9-4812-898f-43378f81ef5f service=registry version="v2.8.1+unknown"docker-registry-registry-1 | time="2023-02-21T19:08:16.677440318Z" level=info msg="redis not configured" go.version=go1.16.15 instance.id=9bd45996-08d9-4812-898f-43378f81ef5f service=registry version="v2.8.1+unknown"docker-registry-registry-1 | time="2023-02-21T19:08:16.677708003Z" level=info msg="Starting upload purge in 0s" go.version=go1.16.15 instance.id=9bd45996-08d9-4812-898f-43378f81ef5f service=registry version="v2.8.1+unknown"docker-registry-registry-1 | time="2023-02-21T19:08:16.677753999Z" level=info msg="PurgeUploads starting: olderThan=2023-02-14 19:08:16.67772287 +0000 UTC m=-604799.990567511, actuallyDelete=true"...设置Nginx端口转向​

您已经设置了/etc/nginx/sites-available/your_domain文件,此中包罗您的办事器设置装备摆设。通过运行翻开它停止编纂:

sudo vim /etc/nginx/sites-available/your_domain

找到现有的location模块:

/etc/nginx/sites-available/your_domain

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

您需要将拜候转发到端口5000,您的注册中心将在此处侦听拜候。您还希望将标头附加转发到注册中心的恳求,它供给来自办事器的关于恳求自己的附加信息。用以下代码替代location模块的现有内容:

/etc/nginx/sites-available/your_domain

...location / { # Do not allow connections from docker 1.5 and earlier # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents 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; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900;}...

if模块查抄恳求的用户代办署理并验证Docker客户端的版本能否高于1.5,而且它不是测验考试拜候的Go应用法式。有关那方面的更多解释,您能够在Docker注册中心Nginx指南中找到nginx标头设置装备摆设。

完成后保留并退出文件编纂页面。通过从头启动Nginx来应用更改:

sudo systemctl restart nginx

若是您收到出错动静,请认真查抄您添加的设置装备摆设。

欲确认Nginx准确地将拜候转发到端口 5000 上的注册表容器,请运行:

docker compose up

然后,在阅读器中,拜候您的域名并利用v2端点,如下所示:

https://your_domain/v2

阅读器将加载一个空的JSON对象:

{}设置身份验证​

Nginx能够让您为其办理的站点设置HTTP身份验证,您能够利用它来限造对Docker注册中心的拜候。为此,您将利用 htpasswd 创建一个身份验证文件,并向此中添加将被承认的用户名和密码组合。该过程将启用对您的注册中心的身份验证。

您能够通过安拆 apache2-utils 软件包来获取 htpasswd 适用法式。运行以下号令:

sudo apt install apache2-utils -y

将带有根据的身份验证文件存储在 ~/docker-registry/auth 下。运行以下号令:

mkdir ~/docker-registry/auth

转向该目次:

cd ~/docker-registry/auth

创建第一个用户,将用户名替代为您要利用的用户名。-B 标记号令利用Docker要求的bcrypt算法:

htpasswd -Bc registry.password 用户名

呈现提醒时输入密码。根据的组合将附加到registry.password。

提醒

要添加更多用户,请在不带 -c 的情况下从头运行之前的号令:

htpasswd -B registry.password 用户名

-c 为创建一个新文件,若是利用它会更新现有文件。

如今已创建根据列表,我们需要编纂 docker-compose.yml 以号令Docker利用您创建的文件对用户停止身份验证。翻开它停止编纂:

vim ~/docker-registry/docker-compose.yml

添加高亮代码部门:

~/docker-registry/docker-compose.yml

version: '3.8'services: registry: image: registry:latest ports: - "5000:5000" environment: REGISTRY_AUTH: htpasswd (注:此行为高亮代码) REGISTRY_AUTH_HTPASSWD_REALM: Registry (注:次行为高亮代码) REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password (注:此行为高亮代码) REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - ./auth:/auth (注:此行为高亮代码) - ./data:/data

如今,您已添加了指定利用HTTP身份验证并供给 htpasswd 创建文件途径的情况变量。关于 REGISTRY_AUTH,将 htpasswd 指定为其值,并将 REGISTRY_AUTH_HTPASSWD_PATH 设置为身份验证文件的途径。REGISTRY_AUTH_HTPASSWD_REALM 暗示 htpasswd 范畴的名称。

您还挂载了 ./auth 目次以使该文件在注册中心容器内可用。保留并退出编纂文件页面。

如今能够验证您的身份验证能否一般工做。先转到到主目次:

cd ~/docker-registry

然后运行:

docker compose up

在您的阅读器中,刷新域名页面。系统会要求您供给用户名和密码。

供给有效的根据组合后,您将拜候带有空JSON对象的页面:

{}

您已胜利通过身份验证并获得了对注册中心的拜候权限。在末端中按CTRL+C退出运行。

您的注册中心现已有平安保障,只要在身份验证后才气拜候。接下来,我们将设置装备摆设它做为后台历程运行,同时通过主动启动来利用从头启动。

启动Docker注册中心即办事​

您能够通过指示Docker Compose始末连结运行来确保注册中心容器在每次系统启动或瓦解后连结重启运行。

翻开 docker-compose.yml 停止编纂:

vim docker-compose.yml

将以下高亮代码添加到registry模块中:

~/docker-registry/docker-compose.yml

... registry: restart: always...

您如今能够通过 -d 标记将注册中心做为后台历程启动:

docker compose up -d

当你的注册中心在后台运行时,你能够随意封闭那个SSH号令行界面,末端和注册中心不会遭到影响。

因为Docker镜像的占用空间可能十分大,接下来我们将设置Nginx可以承受上传的更大文件尺寸限造。

Nginx文件上传大小设置​

在将镜像推送到注册中心之前,您需要确保您的注册中心可以处置大文件上传。Nginx默认上传文件大小限造为1m,那关于Docker镜像来说远远不敷。 接下来,我们将对其设置停止修改,编纂位于 /etc/nginx/nginx.conf 的Nginx设置装备摆设文件。

翻开文件停止编纂:

sudo vim /etc/nginx/nginx.conf

在http部门添加以下高亮代码内容:

/etc/nginx/nginx.conf

...http { client_max_body_size 8192m; ...}...

client_max_body_size 参数现设置为8192m,使更大上传大小为8GB。

保留并退出编纂文件页面。

从头启动Nginx以应用设置装备摆设更改:

sudo systemctl restart nginx发布至私有Docker注册中心​

如今您设置好的Docker注册中心办事器正在运行并承受大文件8GB的上传,我们来试着将镜像推送到那个私有的Docker注册中心。因为您没有现成可用的气象,我们将利用来自 Docker Hub的ubuntu镜像停止测试。

在客户端办事器的新末端会话中,运行以下号令来下载ubuntu镜像,运行并拜候其shell:

docker run -t -i ubuntu /bin/bash

进入后,通过运行以下号令创建一个名为 SUCCESS 的文件:

root@44ea1c653b1d:/# touch /SUCCESS

通过创建此文件,您已经自定义了您的容器。稍后将利用它来查抄您能否利用完全不异的容器。

运行以下号令退出容器shell:

root@44ea1c653b1d:/# exit

如今从您刚刚自定义的容器新建一个镜像:

docker commit $(docker ps -lq) test-image

新镜像如今在当地已可用,您能够将其推送到您的容器注册中心。起首,您必需登录:

docker login https://your_domain

弹出登岸框时,输入相关在之前所创建的登岸信息即可。

一旦登岸之后,就能够重定名所创建的镜像:

docker tag test-image your_domain/test-image

最初,将新标识表记标帜的镜像推送到您的注册中心:

docker push your_domain/test-image拉取镜像无私有Docker注册中心​

登岸私有Docker注册中心:

docker login https://your_domain

拉取test-image镜像:

docker pull your_domain/test-image

Docker将下载镜像。利用以下号令运行容器:

docker run -it your_domain/test-image /bin/bash

搞定!私有Docker注册中心已停当!

DevOps与Docker完美连系​

通过上面一系列的操做,我们已将相关Docker的情况全数停当。之后就是我们即将面临的目的,开发一些属于我们本身的项目,并发布以至将我们开发的产物停止商用,产物化我们的项目,最末达至盈利的目标。但在开发与运维的过程中我们将碰到各类各样的问题:测试、调试、修复Bugs、维护办事器、产物版本发布、SEO优化、代码量量提拔、团队协做开发,以至团队办理等等。因而,DevOps的概念给我们带来了很好的处理计划!什么是DevOps? 那问题我们就不在此详细讨论,您能够通过互联网搜刮得到所要的谜底。而在此部门,我们将利用Buddy做为DevOps开发运维示例。

什么是Buddy?

Buddy是一个DevOps主动化平台:一个闪开发人员可以以简单可靠的体例构建、测试和发布软件的平台(撑持云办事、当地摆设与自托管摆设)。它基于持续集成的原则,对代码的每次更改城市主动测错并为摆设做好筹办。摆设也是主动化,那消弭了报酬错误风险并显著缩短操做时间。因而,您能够更快地搜集客户的反应并停止更改,而不会有白白浪费数月工做的风险。Buddy的利用有免费与收费两种帐户类型,在此,我们能够免费注册并利用它做为主动化运维Docker项目,让我们只需要专注开发即可,其余的代码提交,构建镜像、推送镜像、拉取镜像、摆设项目等等一切均可由Buddy来完成。

起首进入此网免费注册一个Buddy帐户 >>> buddy.red

完成注册Buddy帐户之后,登岸进入帐户。接下来,开启我们的DevOps开发运维一体化之路!

创建项目、流水线与添加操做​

登岸Buddy帐户之后,点击新建项目按钮进入项目创建第一步:

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

选择系统自带Git托管做为项目存储仓,输入项目名称并点击新建项目按钮停止项目创建:

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

在此,我们将利用一个开源项目做为演示,此为基于Rust语言、利用Angular做为前端、PostgreSQL数据库的一个项目。请点击此处从GitHub下载Repo并提交推送至刚刚创建的项目存储仓之中:

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

点击流水线并新建一条流水线,触发器选择事务,也就是主动触发,当我们提交并推送代码至此项目存储仓时,将会主动触发并运行流水线上的操做:

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

在流水线上添加操做,进入流水线点击操做标签页,然后点击 + 加号按钮进一步添加操做:

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

我们将添加两个操做;一个是用于构建镜像,另一个用于推送镜像至私有Docker注册中心:

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

而在项目存储仓中有四个镜像可供我们构建:data目次下的数据库、services目次下相关后端API、www目次之下的Angular前端以及调试利用Swagger。下面,除了Swagger,我们将逐个通过构建与推送镜像操做将其余三个构建并推送至以上创建的私有注册中心之中。

数据库镜像

点击 + 加号按钮添加构建镜像,并选择如下图data目次下的Dockerfile文件,同时选择与至婚配的相联系关系情况,也就是data目次。然后点击蓝色按钮添加此操做:

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

点击 + 加号按钮添加推送镜像:

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

触类旁通,同上添加剩余的两个操做,我们就能够看到如下图在流水线上添加了总共六个操做。操做别离为构建与推送镜像:数据库、API与前端:

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

至此,我们的主动化运维规划已停当!下面我们来运行那条流水线。

运行流水线构建和推送镜像​

目前,在此项目中,我们能够通过两种体例运行流水线:第一种间接手动点击流水线上的运行按钮施行运行:

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

第二种是通过在项目中提交并推送代码至存储仓主动触发流水线施行运行。

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

流水线运行之后,翻开阅读器并输入https://your-domain/v2/_catalog并在弹出的登岸框输入帐户信息,我们就能够在私有Docker注册中心看到如下图的相关镜像信息:

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

请留意改换 your-domain 为您本身的域名名称!

此时,我们的Docker项目就可以完美地与主动化运维相连系。您能够随意推送、拉取镜像来进一步开发您的项目!

总结​

总结就留给您本身写吧!当您认实阅读那篇文章时,我相信您已经对Docker有了更深的认识与若何更纯熟地运用。若是到那里还手足无措,那么请根据本文内容一步步停止现实操做。