介绍
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: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (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 ago
TriggeredBy: ● 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