Connecting to a Containers

容器被视为不可变的基础设施,因此通常不建议通过 SSH 或在容器内运行自定义命令来修改容器的内容。然而,在某些用例中,例如调试应用程序,进入容器并检查应用程序可能是有益的。

练习:使用 CLI 与容器进行远程 Shell 会话

OpenShift 允许与容器建立远程 shell 会话,而无需在每个容器内运行 SSH 服务。为了在容器内建立交互式会话,您可以使用该oc rsh命令。首先获取可用 Pod 的列表:

oc get pods

您应该得到类似于以下内容的输出:

NAME                        READY   STATUS    RESTARTS   AGE
parksmap-65c4f8b676-fxcrq   1/1     Running   0          52m

现在,您可以使用 pod 名称在 pod 中建立远程 shell 会话:

oc rsh parksmap-65c4f8b676-fxcrq

您将看到以下输出:

sh-4.2$

使用的默认 shelloc rsh是/bin/sh. 如果部署的容器没有安装sh并使用另一个 shell(例如A Shell),则可以在发出的命令中的 pod 名称之后指定 shell 命令。

运行以下命令以列出顶级文件夹中的文件:

ls /
anaconda-post.log  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  parksmap.jar  proc  root  run  sbin  srv  sys  tmp  usr  var

练习:使用 Web 控制台与容器进行远程 Shell 会话

OpenShift Web 控制台还提供了一种便捷的方式来访问容器上的终端会话,而无需使用 CLI。

要通过 Web 控制台访问 Pod 的终端,请转到 开发者视图 Developer Perspective 中的 拓扑 Topology 视图,单击parksmap条目,然后单击Pod。

Pod in Dev Console

查看所选 Pod 的信息后,单击“终端”选项卡以打开 shell 会话。

Pod List

继续执行您在使用 CLI 时执行的相同命令,以查看基于 Web 控制台的终端的行为方式。

在继续之前,请关闭与 Pod 的连接。

exit

练习:在容器中执行命令

除了远程 shell,还可以使用命令在已经运行的容器中远程运行oc exec命令。这不需要安装 shell,只需要所需的命令存在并且在可执行路径中。

为了显示 JAR 文件,请运行以下命令:

oc exec parksmap-65c4f8b676-fxcrq -- ls -l /parksmap.jar

您会看到类似以下内容:

-rw-r--r--. 1 root root 39138901 Apr  1 16:54 /parksmap.jar

oc exec命令后的`--`描述了 exec 选项的结束位置和要执行的实际命令的开始位置。看看oc exec --help更多细节。

您还可以指定直接使用oc rsh命令运行的 shell 命令:

oc rsh parksmap-65c4f8b676-fxcrq whoami

你会看到类似的东西:

1000580000

重要的是要了解,出于安全原因,默认情况下 OpenShift 不会以 Dockerfile 中指定的用户身份运行容器。事实上,当 OpenShift 启动一个容器时,它的用户实际上是随机的。

如果您希望或需要允许 OpenShift 用户部署确实希望以 root(或任何特定用户)身份运行的容器映像,则需要进行一些小的配置更改。在本实验环境(sandbox),您不可以通过oc adm policy add-scc-to-user anyuid -z default -n namespace 来使用root权限。您可以了解有关 OpenShift的容器映像指南的更多信息 。