运行 Docker 容器
这篇文章列出了关于运行Docker容器的5个最常见的问题。 Docker是目前文档最丰富的服务之一,但总是很难找到你要找的确切问题。 如果你曾经遇到过下面这样的问题,这个列表应该可以帮助你。
1. 运行Docker容器的命令(运行镜像)
运行Docker容器的命令是docker container run
。
该命令与docker run
命令的功能相同,是Docker现代化命令结构中的一个新成员。
我发现docker container run
更直观,更容易区分,即使与我们后面要看的其他命令一起使用、
我推荐使用这个命令。
基本的docker container run
命令看起来像这样
$ docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] ] ]
[OPTIONS]
: 用于运行容器的可选参数。 例如,-d
在后台运行容器,-p
设置主机和容器之间的端口映射,-v
用于装载卷。IMAGE
: 这是运行容器的Docker镜像,必须被指定。 这可以是一个本地镜像,也可以是远程注册表中的镜像,如Docker Hub。COMMAND
: 容器启动时要运行的命令。作为一个可选的参数、 如果指定,指定的命令将在IMAGE
部分指定的Docker镜像的Docker文件中执行,而不是CMD
指令。[ARG]
: 传递给[COMMAND]
的参数,这是一个可选参数。
下面是一个例子
$ docker container run -d -p 8080:80 --name my_container nginx
为了解释我们在这里使用的选项,它们是
-d
: 在后台运行容器(分离模式)。-p 8080:80
:将主机上的8080
端口映射到容器上的80
端口。--name my_container
: 设置容器的名称为my_container
。--nginx
: 基于最新版本的官方nginx
Docker镜像来运行容器。 如果你的本地环境中没有这个版本的nginx
镜像,它将从Docker Hub下载。
换句话说,上面的命令在nginx镜像的基础上创建了一个名为my_container
的容器,并将主机上的8080
端口分配给端口
到容器的80
端口,并在后台运行该容器。
2. 排除不运行的容器的故障
正如我们在第1节中所看到的,当你的容器在使用"docker container run
"命令后仍然无法正常运行时,你可能会有一种令人沮丧的经历。
Docker容器可能无法运行的原因有很多,但以下是一些比较常见的原因及其解决办法。
2.1. 镜像不存在
为了运行一个Docker容器,该容器的镜像必须存在于你的本地系统中,或者可以从远程位置(如Docker Hub)下载。
如果镜像不存在且下载失败,请检查你的网络情况,并尝试使用 docker image pull
命令手动下载镜像,然后运行该容器。
2.2. Docker服务没有运行
如果docker服务没有运行,你将无法运行该容器。
在这种情况下,在Linux上运行systemctl start docker
或在MacOS和Windows上运行Docker Desktop,并检查托盘图标,看Docker是否正常工作。
2.3. 容器的资源不足
容器使用大量的CPU或内存,如果你的系统没有足够的资源,它们可能无法运行。 在这种情况下,你需要终止不必要的应用程序或容器以释放所需的资源,然后再运行容器。
2.4. 容器配置错误
如果 dockerfile
或 docker container run
"命令包含不正确的设置,容器可能无法运行。
在这种情况下,你必须检查设置,修复问题,然后再次运行容器。
请再次阅读第1节并尝试运行它。
2.5. 容器立即终止
如果一个容器的可执行命令迅速终止(例如,一个输出 "Hello, World!)
容器可能会在执行后立即退出,并且看起来没有在运行。
在这种情况下,你应该修改命令以保持容器运行,或者使用docker container logs
命令来查看容器的输出。
如果你在排除这些问题后仍然有问题,使用docker container logs [container_id]
命令来查看容器的日志、
你可以在docker container run
命令中添加-it
选项,在交互式模式下运行容器,自己看看问题。
这部分内容请参见第5节。
3. 如何保持容器自动运行钩子的运行
有几种方法可以自动启动Docker容器。 最常见的方法是使用Docker重启策略或使用Docker Compose。
3.1. Docker重启策略
Docker提供了一个重启策略,当容器失败或Docker守护进程(在后台管理所有Docker进程的程序)启动时,它会自动重新启动容器。 你可以用它来自动运行容器。
要指定一个重启策略,你可以通过在docker container run
命令中添加--restart
选项来设置它。
重启策略有直观的选项,如no
, on-failure
, always
和unless-stopped
。
例如,下面的命令指示容器在停止时总是重新启动:
docker run -d --restart always my-container
3,2. Docker Compose
Docker Compose是一个允许你定义和管理多个容器的工具。 你可以使用这些Docker合成物来自动启动容器。
Docker Compose使用YAML文件格式来定义服务。
在这个文件中,你可以设置一个重启策略来自动启动一个容器。
例如,这里有一个docker-compose.yml
文件的例子:
version: "3"
services:
web:
image: my-web-app
restart: always
...
有了这个设置,my-web-app
服务将总是自动启动。
你也可以使用容器协调工具,如Docker Swarm和Kubernetes,来自动启动和管理容器。 这些工具对于集群内的容器的调度、扩展和恢复非常有用。
4.如何按id运行容器
我们在问题1中看到的docker container run
命令创建并运行一个新的容器。
如果你想再次运行一个已经创建的容器,你需要遵循容器ID运行的方法。
需要两个命令。
首先,为了获得停止的容器的ID,键入以下命令
$ docker container ls --all
复制你找到的容器ID的部分,并使用以下命令运行它
docker container start [container-id].
5. 如何运行容器sh[#5]。
要在Docker容器内运行一个shell(sh)脚本,你可以使用docker container exec
命令。
这允许你在运行中的容器内启动一个新进程。
以下是在Docker容器内运行shell的命令
docker container exec -it [container_id] /bin/sh
其中[container_id]
是运行中的Docker容器的ID。
-it
选项启动一个与容器的交互式终端会话,/bin/sh
是要执行的命令。
如果你的容器不支持/bin/sh
,而只支持/bin/bash
,你可以输入这样的内容
$ docker container exec -it [container_id] /bin/bash
这将在容器内启动一个shell会话,允许你直接输入命令来操作文件、运行进程等。
6. Final thoughts
In this post, we have learned how to run Docker containers, how to troubleshoot failures, how to automatically run or keep running containers, how to run by container ID, and how to run shells, including sh, inside containers. I hope you find this post helpful in creating and running new containers with Docker.
