Docker容器调试技巧
Docker 允许您在容器内运行软件服务、程序和应用程序环境,而不是在一台机器上构建应用程序,并且必须在另一台机器上模仿该环境,特别是如果它是不同的操作系统。 Docker 完全摆脱了这些进程,因为您可以简单地在容器中运行它。

Docker 允许您在容器内运行软件服务、程序和应用程序环境。您可以在与您的操作系统和整个本地机器环境分开的容器中运行 Nginx、Apache、MySQL 或 MongoDB 等 Web 服务器,而不是在一台机器上构建应用程序,并且必须在另一台机器上模仿该环境,特别是如果它是不同的操作系统。 Docker 完全摆脱了这些进程,因为您可以简单地在容器中运行它,并且无论您在哪台机器(Mac、Linux、Windows)上运行它,它都是一样的。
VM vs Docker

在虚拟机 (VM) 中,您拥有运行多个虚拟机的主机或服务器。虚拟机有自己成熟的操作系统和内核,您可以在这些操作系统之上运行您的应用程序。但是,使用 Docker,我们的服务器或主机具有一个操作系统(Windows、Mac 或 Linux),并且您拥有这些运行的微型容器,它们只不过是在您的机器上运行的进程,它们都共享一个内核,甚至尽管容器有迷你 Linux 发行版,如 Debian 或 Alpine。
以下是使用 Docker 而不是虚拟机的一些好处:
- 工作开销要少得多,很容易移植到其他机器上
- 快速部署
- Docker 容器占用的空间更少
- 它们具有更好的性能,因为它们托管在单个 Docker 引擎中
- 容器易于扩展且效率高
- 数据卷可以在多个容器之间共享和重用
用于故障排除的 Docker 命令非常重要且有用,尤其是当您的容器出现问题时。如果有任何问题,您可能希望查看容器的日志,或者您希望真正进入容器内部以查看终端并在其中执行一些命令。
Docker Image 是容器运行时的一部分。容器是镜像的运行环境。运行应用程序的应用程序映像可能是 Postgres、Redis 或其他需要文件系统的应用程序,它可以保存您的日志文件或存储一些配置文件。它还需要一些环境配置,例如环境变量。您的所有环境配置都由容器提供,并且容器还有一个绑定到它的端口,这使得与在容器内运行的应用程序通信成为可能。您可以在主机上同时运行多个容器,主机可以是笔记本电脑或台式机。
步骤
- 让我们从 docker hub 拉取一个 Redis 镜像到我们的本地机器。拉取图像时,需要几分钟才能拉取。

2. 下载完成后,您可以使用 docker images 命令检查计算机上的所有现有图像。

你可以看到我这里有十多个带有标签、图像 ID、创建时间和大小的图像。图像有标签和版本。
例如,如果您回到 docker hub,您在 docker hub 中查找的每个图像都会有多个版本。当您不指定版本时,最新版本始终是您获得的版本。

3. 接下来,运行Redis。您需要运行 Redis,以便您的应用程序可以连接到它。您必须创建一个 Redis 映像容器,以便连接到您的 Redis 应用程序。使用 docker run redis 命令在容器中启动镜像。
前面我们说过,容器是一个镜像的运行环境。 docker run redis 命令将在终端中以附加模式启动 Redis 容器。

4. 打开一个新选项卡并输入 docker ps 你将看到所有正在运行的 docker 容器的状态。因此,您可以看到容器 Redis 正在使用基于 Redis 映像和端口 6379 的容器运行。

5. 接下来,使用 docker run -d redis 以分离模式运行您的容器,您将看到并获取容器的 ID 作为输出,容器将开始运行。

再次检查以确认您的容器是否正在使用 docker ps 运行,您将看到容器 ID 与您在分离模式下运行时相同。

6. 如果你想重启你的容器,因为它崩溃或发生了一些错误,你需要你的容器ID。发生错误后,您可以使用 docker stop 命令 docker stop <container_id> 停止容器

成功停止它后,您现在可以使用 docker start 命令 docker start <container_id> 再次启动它

7. 您可以通过在终端中键入 docker ps -a 命令并使用 docker startcontainer_id 启动容器来获取所有正在运行或未运行的容器的列表

8. 如果您有两个并行应用程序都使用 Redis 但版本不同,您将需要两个具有不同映像版本的 Redis 容器在不同时间或同时在您的笔记本电脑上运行。
让我们获得一个新的 Redis 镜像 4.0。要拉取新的 Redis 镜像,请使用 docker run redis:4.0,这将拉取镜像并立即启动容器。它在一个命令中执行两个命令(docker pull 和 docker start)。您将看到一些图层已下载,并且容器正在立即启动。

如果您在终端中输入 docker ps,您应该会看到两个 Redis 容器正在运行。

9. 在输出部分,您还将看到端口部分,它指定容器正在侦听传入请求的端口。两个容器都打开镜像中指定的相同端口。您的本地计算机有某些端口可供您为不同的应用程序打开。要使用这两个映像,您需要将容器端口绑定到主机上的两个不同端口。主机和容器之间的端口绑定完成后,您可以使用主机的端口连接到正在运行的容器。
- 在使用 run 命令指定绑定之前,您需要使用 docker stop 命令停止所有容器。
- 使用主机和容器端口之间的绑定启动容器。 您有两个不同的 Redis 容器,因此您需要使用将它们绑定到本地计算机上的两个不同端口:docker run -p <port_of_the_host>:<container_port>
- 确认查看哪些进程正在运行。在端口部分,您将看到绑定您的本地机器端口 6000 绑定到容器 6379
- 以分离模式启动有界容器。
- 如果您尝试使用相同的端口运行第二个 Redis 容器,您将收到一条错误消息,告诉您该端口已分配。
- 更改您的主机端口,然后重试。
- 接下来,检查您的容器进程。您将看到不同的 Redis 版本正在运行,它们都绑定到我笔记本电脑上的不同端口,并且容器本身在同一端口上侦听请求。
Docker exec and Docker logs
如果您的容器中发生了某些事情并且您的应用程序无法连接到 Redis,您可能希望查看 Redis 生成的日志。要查看容器中的日志,请使用 docker logs 命令 docker logs <container_id>

- 您还可以使用容器名称获取日志。
- 创建容器时,会为其分配一个随机名称。您可以根据需要使用 docker run 重命名容器,如果您不想使用容器 ID,并且只想记住容器的名称,如果您只想区分容器,这有时会非常有用。
- 为此,请使用 docker run -d -p6001:6379 --name redis-older redis:4.0 使用不同的名称从 Redis 4.0 创建一个新容器。这将创建一个新容器,因为我们正在运行 docker run 命令。
- 确认进程后,可以看到已经创建好了,名字是redis older。
- 对第二个 Redis 容器重复相同的过程。
- 使用 docker ps 确认您的容器是否正在运行您将看到刚刚创建的最新和旧容器。
- 如果旧版本有问题,可以使用 docker logs redis-older 检索日志。
另一个非常有用的调试命令是 docker exec,使用 docker exec 我们可以得到我们正在运行的容器的终端。
例如,如果 redis latest 容器有问题,并且您想获取该容器的终端,导航容器内的目录,检查日志文件,获取配置文件或打印出您的环境变量,您需要使用 docker exec 命令。
- 要执行此过程,请在终端中键入 docker exec -it <container_id> 或 <name_of_container> /bin/bash 这会将您作为 root 用户进入容器。它代表交互式终端。
- 接下来,您可以打印出您正在使用的目录 pwd 转到您的主目录,查看您的主目录中的文件夹和文件。您还可以在容器中看到您的虚拟文件系统
- 打印出你的环境变量,看看你的所有参数当前是否使用 env 设置
如果您有一个具有一些复杂配置的容器,或者如果您在具有复合设置的容器中运行自己的应用程序并且您想要验证所有设置是否正确,则 Docker exec 命令非常有用。
- 如果你想退出你的终端,在你的终端中输入exit,你就会退出。
- 由于大多数容器镜像都基于一些轻量级 Linux 发行版,因此您不会安装很多 Linux 命令或应用程序,例如; curl 但您可以使用 docker 命令执行许多命令和调试。