进入容器
如果仅仅是用-it
,那么容器会在前台运行,如果执行了exit,容器会退出。
使用-d
参数,容器启动后会进入后台。
[root@docker01 ~]# docker run -itd vimubuntu:1.0.0 /bin/bash
73328e58574c68340cb66077a4b9da5e9d8b1394a18b81d8b939ecb15a3d772e
如果需要进入到容器中,则需要使用到attach
命令或者nsenter
工具等。
attach命令
attach命令是docker自带的命令,使用方法:
docker attach [容器名称,即names]
该命令的缺点:
当多个窗口同时进入到一个容器的时候,那么输入命令,所有窗口都会同步显示,当某个窗口因为命令阻塞时,其他窗口也无法执行操作了。
nsenter命令
nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。
nsenter命令可以用于进入Docker容器的命名空间,从而实现对容器的内部环境的访问和操作:
首先,需要找到Docker容器在宿主机上的PID。这可以通过使用docker inspect
命令获取容器的信息,并查找其中的PID字段来实现。
docker inspect -f '{{.State.Pid}}' <container_name_or_id>
将<container_name_or_id>
替换为你要进入的容器的名称或ID。执行这个命令后,你将得到容器的PID。
接下来,使用nsenter命令结合找到的PID进入容器的命名空间。通常,我们需要进入容器的mount、uts、ipc、net和pid命名空间。以下是具体的命令:
nsenter --target <PID> --mount --uts --ipc --net --pid /bin/bash
将<PID>
替换为你在前一步中获取的容器的PID。执行这个命令后,你将进入一个与容器共享命名空间的bash shell,从而可以在容器内部执行命令和操作。
nsenter命令并不是Docker官方推荐的方式来进入容器,更常用的方法是使用docker exec
命令。然而,在某些情况下,例如当Docker的exec驱动不可用时,nsenter命令可以作为一个替代方案。
nsenter命令介绍
nsenter是一个命令行工具,用于进入指定的Linux命名空间(namespace)并执行命令。Linux命名空间是一种隔离机制,用于将进程隔离在不同的环境中,以提高系统安全性和可靠性。
nsenter命令的主要功能包括:
- 进入和管理各种Linux命名空间,如Mount、IPC、PID、Network、User等。这些命名空间分别用于文件系统隔离、进程间通信隔离、进程隔离、网络隔离和用户隔离。
- 执行命令:在指定的命名空间中执行指定的命令,或者启动一个新的shell会话。
nsenter命令的语法结构包括一系列选项和参数,用于配置和控制命令的行为。常用的选项包括:
-t, --target pid
:指定被进入命名空间的目标进程的PID(进程ID)。-m, --mount[=file]
:进入mount命名空间。如果指定了file参数,则进入该文件的命名空间。-i, --ipc[=file]
:进入IPC命名空间。如果指定了file参数,则进入该文件的命名空间。-n, --net[=file]
:进入network命名空间。如果指定了file参数,则进入该文件的命名空间。-p, --pid[=file]
:进入PID命名空间。如果指定了file参数,则进入该文件的命名空间。-U, --user[=file]
:进入user命名空间。如果指定了file参数,则进入该文件的命名空间。
使用nsenter命令,可以方便地管理和调试各种Linux系统资源和服务,如容器管理、网络调试等。例如,通过nsenter命令可以进入容器的网络命名空间,查看和修改容器的网络配置;或者进入进程的PID命名空间,查看该进程中的其他进程等。
docker exec命令
Docker exec命令是Docker的一个强大功能,它允许你在正在运行的容器内部执行额外的命令。这个命令特别有用,因为它允许你在不停止和重新启动容器的情况下与容器进行交互。以下是关于docker exec命令的详细介绍:
基本语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
参数说明:
OPTIONS
:可选参数,用于设置执行选项。CONTAINER
:目标容器的名称或ID。COMMAND
:要在容器内执行的命令。ARG
:传递给命令的参数。
常用选项:
-i
:保持标准输入打开,即使没有附加到容器。-t
:分配一个伪终端,通常与-i
一起使用,以提供交互式shell。-u
或--user
:指定执行命令的用户名或UID。-d
:在后台运行命令,不将命令的输出附加到当前终端。-e
:设置环境变量。-w
或--workdir
:指定工作目录。
使用示例:
-
运行交互式shell:
使用-it
参数,你可以在容器内部启动一个交互式的bash或sh shell。docker exec -it <container_name_or_id> /bin/bash
执行此命令后,你将进入容器的shell环境,并可以在其中执行任意命令。
-
执行单个命令:
你不需要进入交互式shell来执行单个命令。docker exec <container_name_or_id> ls -l /some/directory
这将在容器内执行
ls -l /some/directory
命令,并返回结果。 -
在后台运行命令:
使用-d
选项,你可以在后台运行长时间运行的命令,而不会在终端中看到输出。docker exec -d <container_name_or_id> some_long_running_command
注意事项:
- 你只能在正在运行的容器中使用docker exec命令。对于已经暂停或停止的容器,你需要先启动它们。
- 当使用
-it
选项时,确保你的终端支持伪终端(pseudo-TTY),否则命令可能无法正确执行。 - 在执行命令时,确保命令和参数与你在容器内部预期的环境相匹配,特别是如果容器使用了不同的用户或工作目录。
docker exec命令为管理和调试Docker容器提供了极大的灵活性,允许你在不中断容器运行的情况下执行各种任务。
导出和导入docker容器
导出容器命令
docker export [container_id] > [name.tar]
案例:
[root@docker01 ~]# docker export aed9134658a3 > vimubuntu.tar
[root@docker01 ~]# ls
anaconda-ks.cfg original-ks.cfg vimubuntu.tar
导入容器快照
命令
docker import
也可以通过指定URL的方式来进行导入
docker import http://example.com/exampleimage.tgz example/imagerepo
用户既可以使用 docker load 来导入镜像存储文件到本地镜像库,也可以使用 docker import 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
docker删除容器
命令:
docker rm [container_name]
启动容器
docker启动容器有两种方式,一种是基于镜像新建一个容器并启动,另一个是将在终止状态的容器重新启动。
新建并启动容器
命令:
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
它允许用户在指定的Docker镜像上创建一个新的容器实例,并运行指定的命令。
OPTIONS
:一系列用于配置和控制容器的选项。这些选项可以包括设置容器的运行环境、资源限制、网络配置等。IMAGE
:要使用的Docker镜像的名称或ID。镜像中包含了容器运行所需的文件系统和配置信息。TAG
:镜像的标签,用于指定镜像的特定版本。如果没有指定标签,则默认使用latest标签。COMMAND
:在容器内部要执行的命令。这个命令可以是任何有效的命令行指令,它将替代镜像中默认的命令。ARG
:传递给命令的参数。这些参数可以根据需要进行设置,以满足特定的运行需求。
Docker run命令的执行流程:
- 根据指定的镜像,Docker在本地查找该镜像。如果镜像不存在,Docker会尝试从远程仓库拉取镜像。
- 创建一个新的容器实例。这个容器是基于指定的镜像创建的,并且包含了一个可写的容器层,用于存储容器运行时的修改和变化。
- 使用指定的命令启动容器。容器启动后,将执行指定的命令,并根据需要运行相应的进程。
Docker run命令提供了许多常用的选项,用于配置和控制容器的行为。
-d
:指定容器在后台运行,并返回容器的ID。这样可以使容器在后台以守护进程模式运行,而不会阻塞当前终端。-it
:让容器的标准输入保持打开,并分配一个伪终端。这样可以使容器能够与当前终端进行交互,方便进行调试和查看容器输出。--name
:为容器指定一个名称。这样可以通过名称来引用和管理容器,而不是使用默认的随机生成的名称。-p
:将容器内的端口映射到主机上的端口。这样可以使外部能够访问容器内运行的服务。-v
:将主机上的目录或文件挂载到容器内部的指定路径。这样可以实现容器与主机之间的文件共享和交互。
启动已经终止的容器
可以利用docker start
命令,将一个已经终止的容器启动运行。
Docker start命令的基本语法如下:
docker start [OPTIONS] CONTAINER [CONTAINER...]
在这个语法中:
OPTIONS
:这是一系列可选的参数,用于进一步配置启动容器的行为。这些选项不是必需的,主要用于更精细地控制容器的启动过程。CONTAINER
:这是您希望启动的容器的名称或ID。可以指定一个或多个容器。
Docker start命令的常用选项包括:
-a
:这个选项用于将容器的标准输出附加到当前终端。可以实时查看容器启动过程中的输出信息,便于调试和监控。-i
:以交互模式启动容器。在交互模式下,可以通过终端与容器进行交互,执行命令并查看输出。
如果启动容器的时候是:docker run -it ubuntu /bin/bash
,则执行docker start -i bash
,之后,则会进入容器的交互界面。
如果启动容器的时候是:docker run ubuntu /bin/bash
,则执行docker start -i bash
,之后,则还是会直接退出。
Docker start命令不会创建新的容器实例。它只是重新启动已经存在的容器,并从上次停止时的状态恢复执行。这意味着容器内的数据、配置和状态都将保持不变。
守护态运行docker容器
让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d
参数来实现。
终止docker容器
使用 docker stop 命令(推荐)
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker stop
命令是最直接和最常用的方式来停止一个容器。它会向容器发送一个TERM信号,然后等待容器优雅地停止。如果容器在一定时间内没有响应,Docker会发送一个KILL信号来强制停止容器。
使用 docker kill 命令
docker kill [OPTIONS] CONTAINER [CONTAINER...]
docker kill
命令会立即向容器发送一个KILL信号,强制停止容器。这通常用于那些无法响应docker stop
命令的容器。