2025年docker如何启动容器(docker启动容器内部服务命令)

docker如何启动容器(docker启动容器内部服务命令)Linux nbsp 红帽认证 nbsp IT 技术 nbsp 运维工程师 1000 人技术交流 nbsp 备注 公众号 更快通过 理解 Docker 容器的基本概念 在深入探讨如何进入 Docker 容器之前 有必要对 Docker 容器的基本概念有一个清晰的理解 Docker 容器是运行在 Docker 引擎上的一个隔离的进程环境

大家好,我是讯享网,很高兴认识大家。



Linux | 红帽认证 | IT技术 | 运维工程师

👇1000人技术交流 备注【公众号】更快通过


讯享网

理解 Docker 容器的基本概念

在深入探讨如何进入 Docker 容器之前,有必要对 Docker 容器的基本概念有一个清晰的理解。Docker 容器是运行在 Docker 引擎上的一个隔离的进程环境,它包含了应用程序及其所有依赖项。

Docker 容器的特点:

轻量级:共享主机的内核,启动速度快,占用资源少。

可移植性:容器化的应用可以在任何安装了 Docker 的机器上运行。

隔离性:通过命名空间和控制组,实现进程和资源的隔离。

理解这些特点有助于我们更好地掌握如何与容器进行交互。

使用 docker exec 进入运行中的容器

docker exec 命令是进入运行中的 Docker 容器并在其中执行命令的主要方式。它允许我们在容器内启动一个新的进程,这对于调试和管理容器非常有用。

基本用法

docker exec [选项] <容器ID或名称> <命令>

讯享网

常用选项解析

讯享网选项 描述-i 保持标准输入打开,即使没有附加(attach)-t 分配一个伪终端(tty)-d 分离模式下运行命令-u, –user 以指定用户运行命令-e, –env 设置环境变量-w, –workdir 指定工作目录–privileged 授予扩展权限–detach-keys 覆盖容器的分离键序列

选项详解

-i 和 -t

这两个选项通常一起使用,-i 选项让容器的标准输入保持打开状态,-t 选项为容器分配一个伪终端。这使得我们可以与容器内的进程进行交互。

-d

在后台运行命令,不会附加到容器的控制台。这对于在容器中运行后台任务很有用。

-u

指定在容器内运行命令的用户,可以是用户名或 UID。例如,-u root 表示以 root 用户身份运行。

-e

设置环境变量,可以多次使用该选项来设置多个环境变量。

-w

设置容器内的工作目录,类似于在命令行中使用 cd 切换目录。

实际案例演示

1. 进入容器的交互式 Shell

docker exec -it <容器ID或名称> /bin/bash

如果容器的基础镜像是基于 Debian 或 Ubuntu,那么 /bin/bash 通常可用。如果是基于 Alpine,则需要使用 /bin/sh。

示例:

讯享网docker exec -it my_container /bin/bash

2. 在容器中运行单个命令

https://store.steampowered.com/

这将在容器内的 /app 目录下列出文件,但不会进入交互式 Shell。

3. 以指定用户运行命令

讯享网docker exec -u www-data -it <容器ID或名称> /bin/bash

以 www-data 用户的身份进入容器的 Shell。

4. 设置环境变量并运行命令

docker exec -e ENV_VAR=value -it <容器ID或名称> /bin/bash

在容器内设置环境变量 ENV_VAR,然后进入 Shell。

5. 指定工作目录

讯享网docker exec -w /app -it <容器ID或名称> /bin/bash

进入容器后,当前目录为 /app。

使用 docker attach 附加到容器

docker attach 命令用于附加到一个已经运行的容器的主进程上,与 docker exec 不同,它不会创建新的进程。

docker attach 与 docker exec 的区别

特性 docker exec docker attach是否创建新进程 是 否是否需要指定命令 是 否是否附加到主进程 否,创建并附加到新进程 是,附加到容器的主进程多个会话支持 可以创建多个独立的会话 会共享同一个标准输入/输出主要用途 在容器内运行新命令或启动新 Shell 查看容器主进程的输出或进行交互

使用场景及注意事项

查看容器主进程的输出

如果容器的主进程是一个交互式应用程序,如 redis-cli,可以使用 docker attach 进行交互。

注意输入冲突

多个会话同时使用 docker attach 附加到同一个容器时,输入会发生冲突,所有会话共享同一个标准输入。

分离容器

使用 Ctrl + P 和 Ctrl + Q 可以安全地从容器分离,而不终止容器。

示例

附加到容器

讯享网docker attach <容器ID或名称>

分离容器而不终止

在附加到容器的会话中,按下 Ctrl + P,然后按 Ctrl + Q,即可分离。

使用 nsenter 命令进入容器

nsenter 是 Linux 下的一个工具,可以让我们进入另一个进程的命名空间。Docker 容器的隔离性是通过命名空间实现的,使用 nsenter 可以直接进入容器的命名空间。

什么是 nsenter

nsenter 命令允许我们进入指定的命名空间,例如进程、网络、IPC、UTS、用户和挂载命名空间。

使用步骤

1. 获取容器的 PID

首先,需要获取容器在宿主机上的进程 ID。

docker inspect –format ”{{ .State.Pid }}” <容器ID或名称>

示例:

讯享网CONTAINER_PID=\((docker inspect --format <span class="code-snippet__string">"{{ .State.Pid }}"</span> my_container)</span></code></pre></section><p style="margin-left: 8px;margin-right: 8px;line-height: 1.75em;"><strong><span style="font-size: 16px;font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif;letter-spacing: 1px;">2. 使用 nsenter 进入容器</span></strong></p><section class="code-snippet__fix code-snippet__js"><ul class="code-snippet__line-index code-snippet__js"><li></li></ul><pre class="code-snippet__js" data-lang="nginx"><code><span class="code-snippet_outer"><span class="code-snippet__attribute">nsenter</span> -t <span class="code-snippet__variable">\)CONTAINER_PID -n -m -u -i -p /bin/bash

选项解析:

-t:指定目标进程的 PID。-n:进入网络命名空间。-m:进入挂载命名空间。-u:进入 UTS 命名空间(主机名和域名)。-i:进入 IPC 命名空间。-p:进入 PID 命名空间。

3. 简化操作

可以编写一个脚本或函数来简化上述操作。

示例脚本:

讯享网docker-enter() { CONTAINER_PID=\((docker inspect --<span class="code-snippet__keyword">format</span> <span class="code-snippet__string">"{{ .State.Pid }}"</span> \)1) nsenter -t $CONTAINER_PID -n -m -u -i -p /bin/bash}

然后使用:

docker-enter my_container

通过 SSH 进入容器

尽管 Docker 的设计初衷是不在容器内运行 SSH 服务,而是使用 docker exec 等命令,但某些情况下,可能需要通过 SSH 进入容器。

配置 SSH 服务

1. 安装 SSH 服务

在容器内安装 SSH 服务,例如 OpenSSH。

讯享网apt-get update && apt-get install -y openssh-server

2. 配置 SSH

生成主机密钥:

ssh-keygen -A

设置 root 密码:

echo ‘root:password’ | chpasswd

启动 SSH 服务:

讯享网/usr/sbin/sshd

3. 暴露端口

在启动容器时,映射 SSH 服务的端口。

docker run -d -p 2222:22 my_ssh_image

安全性考虑

增加攻击面

在容器内运行 SSH 服务会增加安全风险,因为它为潜在的攻击者提供了额外的入口点。

**实践

讯享网尽可能使用 docker exec 代替 SSH。如果必须使用 SSH,确保使用强密码或密钥认证。限制 SSH 的监听地址,仅允许内部网络访问。

进入停止状态的容器

有时候,容器已经停止运行,但我们需要查看其中的文件或配置。因为容器已经停止,无法直接进入,这里介绍几种方法来处理这种情况。

使用 docker commit 创建新镜像

将停止的容器提交为一个新镜像,然后基于该镜像启动一个新的容器。

1. 提交镜像

docker commit &lt;容器ID或名称&gt; new_image_name

2. 启动新容器

讯享网docker run -it new_image_name /bin/bash

使用 docker export 和 docker import

导出容器的文件系统,然后重新导入为新镜像。

1. 导出容器文件系统

docker export &lt;容器ID或名称&gt; -o container.tar

2. 导入为新镜像

讯享网docker import container.tar new_image_name

3. 启动新容器

docker run -it new_image_name /bin/bash

常见问题及解决方案

无法进入容器的常见原因

1. 容器已经停止

如果容器已经停止,docker exec 和 docker attach 都无法进入容器。

解决方案:

使用 docker start 启动容器。

使用 docker commit 或 docker export 创建新镜像。

2. 容器内缺少必要的 Shell

有些轻量级的基础镜像(如 alpine)可能没有 /bin/bash,只有 /bin/sh。

解决方案:

使用 /bin/sh 进入容器:

讯享网docker exec -it &lt;容器ID或名称&gt; /bin/sh

容器中命令不可用的处理

1. 缺少必要的工具

容器内可能缺少某些命令或工具,如 vi、ping 等。

解决方案:

使用包管理器安装所需工具。

Debian/Ubuntu:

apt-get update && apt-get install -y vim

Alpine:

讯享网apk update && apk add vim

2. 文件系统为只读

某些容器可能以只读模式运行,无法安装新软件。

解决方案:

重新启动容器,移除只读限制。

docker run -it –read-only=false &lt;镜像名称&gt; /bin/bash

总结

掌握如何进入 Docker 容器并在其中运行命令是日常开发和运维工作中必不可少的技能。本文详细介绍了多种进入容器的方法,包括 docker exec、docker attach、nsenter、通过 SSH 进入容器,以及处理停止状态容器的方法。还讨论了常见问题及解决方案。

以下是各种方法的对比总结:

讯享网方法 适用场景 是否创建新进程 是否需要容器运行docker exec 在运行中的容器内执行新命令或进入交互式 Shell 是 是docker attach 附加到容器的主进程,查看输出或进行交互 否 是nsenter 需要深入容器命名空间,或在特殊情况下使用 否 是通过 SSH 进入容器 特殊需求下的远程登录,但不推荐 是 是docker commit + 新容器 处理停止状态的容器,查看文件系统 是 否(创建新容器)docker export + 导入 处理停止状态的容器,备份或迁移 是 否(创建新镜像)

**实践:

优先使用 docker exec

它是进入运行中容器的最安全、最便捷的方法。

避免在容器内运行 SSH 服务

这与 Docker 的设计理念不符,增加了安全风险。

熟悉基础镜像的特点

根据镜像类型选择正确的 Shell,如 /bin/bash 或 /bin/sh。

处理停止的容器

通过提交镜像或导出文件系统来查看或恢复数据。

希望本文能帮助您更深入地理解 Docker 容器的操作,提高工作效率。在实际工作中,根据具体情况选择最合适的方法。


课程咨询添加:HCIE666CCIE

↑或者扫描上方二维码↑


你有什么想看的技术点和内容

可以在下方留言告诉小盟哦!

小讯
上一篇 2025-04-14 09:19
下一篇 2025-05-14 18:28

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/137153.html