将图像作为容器运行

预计阅读时间:9分钟

先决条件

在“构建Java映像”中完成构建Java映像的步骤

概述

在上一个模块中,我们创建了示例应用程序,然后创建了用于构建映像的Dockerfile。我们使用命令创建了图像docker build。现在我们有了一个映像,我们可以运行该映像,并查看我们的应用程序是否正常运行。

容器是正常的操作系统进程,除了此进程是独立的,并且具有与主机分离的其自己的文件系统,其网络和其独立的进程树。

要在容器内运行图像,请使用docker run命令。该docker run命令需要一个参数,即图像的名称。让我们开始映像,并确保其正确运行。在终端中运行以下命令:

$ docker run java-docker

运行此命令后,您会注意到我们没有进入命令提示符。这是因为我们的应用程序是REST服务器,并且在循环中运行以等待传入的请求,而不会将控制权交还给OS,直到我们停止容器为止。

让我们打开一个新终端,然后GET使用curl命令向服务器发送请求。

$ curl --request GET \
--url http://localhost:8080/actuator/health \
--header 'content-type: application/json'
curl: (7) Failed to connect to localhost port 8080: Connection refused

如您所见,我们的curl命令失败,因为与服务器的连接被拒绝。这意味着,我们无法在端口8080上连接到本地主机。这是可以预期的,因为我们的容器是在包含网络的隔离环境中运行的。让我们停止容器,并使用在本地网络上发布的端口8080重新启动。

要停止容器,请按ctrl-c。这将使您返回到终端提示。

要为我们的容器发布端口,我们将在命令上使用--publish flag-p简称)docker run。该--publish命令的格式为[host port]:[container port]。因此,如果我们想将容器内的端口8000暴露给容器外的端口8080,我们将传递8080:8000给该--publish标志。

启动该容器,并将端口8080暴露给主机上的端口8080。

$ docker run --publish 8080:8080 java-docker

现在,让我们从上方重新运行curl命令。

$ curl --request GET \
--url http://localhost:8080/actuator/health \
--header 'content-type: application/json'
{"status":"UP"}

成功!我们能够在端口8080上连接到容器内部运行的应用程序。

现在,按ctrl-c停止容器。

以分离模式运行

到目前为止,这很好,但是我们的示例应用程序是Web服务器,我们不必连接到容器。Docker可以以分离模式或在后台运行您的容器。为此,我们可以使用--detach-d简称。Docker较早地启动了您的容器,但是这次,它将与容器“分离”并返回到终端提示符。

$ docker run -d -p 8080:8080 java-docker
5ff83001608c7b787dbe3885277af018aaac738864d42c4fdf5547369f6ac752

Docker在后台启动了我们的容器,并在终端上打印了容器ID。

再次,让我们确保我们的容器运行正常。从上方运行相同的curl命令。

$ curl --request GET \
--url http://localhost:8080/actuator/health \
--header 'content-type: application/json'
{"status":"UP"}

列出容器

当我们在后台运行容器时,如何知道我们的容器是否正在运行,或者我们的计算机上正在运行其他哪些容器?好了,我们可以运行docker ps命令了。就像我们ps在Linux中运行docker ps命令以查看计算机上的进程列表一样,我们可以运行命令以查看计算机上运行的容器列表。

$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED              STATUS              PORTS                    NAMES
5ff83001608c   java-docker      "./mvnw spring-boot:…"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   trusting_beaver

docker ps命令提供了有关我们正在运行的容器的大量信息。我们可以看到容器ID,在容器内部运行的图像,用于启动容器的命令,创建时的状态,状态,暴露的端口以及容器的名称。

您可能想知道我们容器的名称来自何处。由于启动时我们没有为容器提供名称,因此Docker生成了一个随机名称。我们将在一分钟内解决此问题,但首先我们需要停止该容器。要停止容器,请运行执行该docker stop命令的命令,即停止容器。我们需要传递容器的名称,也可以使用容器ID。

$ docker stop trusting_beaver
trusting_beaver

现在,重新运行docker ps命令以查看正在运行的容器的列表。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

停止,启动和命名容器

您可以启动,停止和重新启动Docker容器。当我们停止容器时,不会将其删除,但是状态将更改为已停止,并且容器内的过程也将停止。当我们docker ps在上一个模块中运行命令时,默认输出仅显示正在运行的容器。当我们通过--all-a简称时,无论机器的启动或停止状态如何,我们都会看到机器上的所有容器。

$ docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS                        PORTS                    NAMES
5ff83001608c   java-docker         "./mvnw spring-boot:…"   5 minutes ago    Exited (143) 18 seconds ago                            trusting_beaver
630f2872ddf5   java-docker         "./mvnw spring-boot:…"   11 minutes ago   Exited (1) 8 minutes ago                               modest_khayyam
a28f9d587d95   java-docker         "./mvnw spring-boot:…"   17 minutes ago   Exited (1) 11 minutes ago                              lucid_greider

现在,您应该看到列出了几个容器。这些是我们启动和停止但尚未删除的容器。

让我们重新启动刚刚停止的容器。找到我们刚刚停止的容器的名称,并使用以下restart命令替换下面的容器的名称。

$ docker restart trusting_beaver

现在,使用docker ps命令再次列出所有容器。

$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS                      PORTS                    NAMES
5ff83001608c   java-docker   "./mvnw spring-boot:…"   10 minutes ago   Up 2 seconds                0.0.0.0:8080->8080/tcp   trusting_beaver
630f2872ddf5   java-docker   "./mvnw spring-boot:…"   16 minutes ago   Exited (1) 13 minutes ago                            modest_khayyam
a28f9d587d95   java-docker   "./mvnw spring-boot:…"   22 minutes ago   Exited (1) 16 minutes ago                            lucid_greider

请注意,我们刚刚重新启动的容器已以分离模式启动,并且端口8080已暴露。另外,观察容器的状态为“ Up X seconds”。重新启动容器时,它以与最初启动时相同的标志或命令开头。

现在,让我们停止并删除所有容器,看看如何解决随机命名问题。查找正在运行的容器的名称,然后将以下命令中的名称替换为系统上容器的名称。

$ docker stop trusting_beaver
trusting_beaver

现在我们的容器已停止,让我们将其删除。删除容器时,该容器内部的进程将停止,并且该容器的元数据也将被删除。

要删除容器,只需运行docker rm传递容器名称的命令即可。您可以使用单个命令将多个容器名称传递给该命令。同样,将以下命令中的容器名称替换为系统中的容器名称。

$ docker rm trusting_beaver modest_khayyam lucid_greider
trusting_beaver
modest_khayyam
lucid_greider

docker ps --all再次运行命令以查看所有容器都已删除。

现在,让我们解决随机命名问题。标准做法是为容器命名,原因很简单,因为它易于识别容器中正在运行的内容以及与之关联的应用程序或服务。

要命名容器,我们只需要将--name标志传递给docker run命令即可。

$ docker run --rm -d -p 8080:8080 --name springboot-server java-docker
2e907c68d1c98be37d2b2c2ac6b16f353c85b3757e549254de68746a94a8a8d3
$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                    NAMES
2e907c68d1c9   java-docker   "./mvnw spring-boot:…"   8 seconds ago   Up 8 seconds   0.0.0.0:8080->8080/tcp   springboot-server

那更好!现在,我们可以根据名称轻松识别容器。

下一步

在本模块中,我们研究了运行容器,发布端口以及以分离模式运行容器。我们还介绍了如何通过启动,停止和重新启动容器来管理容器。我们还研究了命名容器的方式,以便更容易识别它们。

在下一个模块中,我们将学习如何在容器中运行数据库并将其连接到我们的应用程序。看:

使用容器进行开发

反馈

通过提供您的反馈帮助我们改善此主题。通过在Docker Docs GitHub存储库中创建问题,让我们知道您的想法。或者,创建PR以建议更新。


Java运行图像容器