首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果以非root用户身份运行,Docker容器将立即退出

的原因是Docker默认情况下需要root权限来管理容器的运行。这是因为Docker在容器内部使用了一些特权操作,例如创建命名空间、挂载文件系统等,这些操作需要root权限才能执行。

然而,为了提高容器的安全性,Docker引入了用户命名空间(User Namespace)的概念。用户命名空间允许将容器内部的用户映射到宿主机上的非特权用户,从而避免了容器内部的进程拥有root权限。

当以非root用户身份运行Docker容器时,如果容器内部的进程尝试执行需要root权限的操作,例如创建网络接口、修改文件权限等,就会导致操作失败,从而使容器立即退出。

为了解决这个问题,可以通过以下几种方式来运行非root用户的Docker容器:

  1. 使用特权模式(Privileged Mode):在运行容器时加上--privileged参数,这样容器内的进程将拥有与宿主机相同的权限。但是这种方式会降低容器的安全性,不推荐在生产环境中使用。
  2. 使用用户命名空间(User Namespace):通过配置用户命名空间,将容器内部的用户映射到宿主机上的非特权用户。这样容器内的进程就可以以非root用户身份运行,而不会导致容器退出。具体的配置方法可以参考Docker官方文档中关于用户命名空间的说明。
  3. 修改容器内部的权限要求:如果容器内部的进程没有必要执行需要root权限的操作,可以通过修改容器内部的配置或代码,将这些操作改为使用非特权权限执行。这样即使以非root用户身份运行容器,也不会导致容器退出。

总结起来,以非root用户身份运行Docker容器时,容器会立即退出是因为默认情况下Docker需要root权限来管理容器的运行。为了解决这个问题,可以使用特权模式、用户命名空间或修改容器内部的权限要求。具体选择哪种方式取决于实际需求和安全性考虑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Docker命令教程Mariadb数据库拉取创建命令示例详解

容器默认端口 ——指定有个本机端口映射到容器端口 -e MYSQL_ROOT_PASSWORD=123456 \ #向容器内传递环境变量,启动容器用户可以动态传参 -v /root/nextcloud...不会立即进入容器,exit退出容器会继续运行内容说明-d守护进程,后台运行容器(启动便退出,再次进入exit退出后会后台运行)-i是以交互模式启动(-i和-t通常在一起使用)-t是为它分配一个命令行终端...大写P-v宿主机目录(文件):容器目录(文件):文件映射,保持容器文件与外部同步-u某个用户身份创建容器--name nginx容器命名-m, --memory bytes设置容器使用内存最大值-h,...--restart=on-failure:3 表示容器退出状态码0(非正常退出),自动重启容器,自动从其3次。...docker exec -it --user 用户容器名 bash #指定用户登录容器docker exec -it --user 用户容器名 命令 #不进入容器,登录容器执行命令不能登录容器

54920

使用Docker容器

要完成本教程,您需要具备一台已经设置好可以使用sudo命令的root账号的服务器,并且已开启防火墙。...docker run -ti ubuntu 命令行提示符更改为指示我们root用户身份位于容器内,后跟12个字符的容器ID。...exit Docker容器在它们发出的命令完成后立即停止运行,因此当我们退出bash shell时,我们的容器停止了。如果我们运行docker ps,显示正在运行容器的命令,我们看不到我们的。...如果我们重新运行相同的命令,则会创建一个全新的容器docker run -ti ubuntu 我们可以告诉它是一个新容器,因为命令提示符中的ID是不同的,当我们查找Example1文件时,我们找不到它...我们现在退出第二个容器查看它,并且我们创建的文件的第一个容器都在系统上。

1.2K40
  • 如何在CentOS 7上安装和使用Docker

    注意: Docker需要64位版本的CentOS 7以及等于或大于3.10的内核版本。默认的64位CentOS 7 腾讯云CVM满足这些要求。 本教程中的所有命令都应以root用户身份运行。...如果要sudo在运行docker命令时避免键入,请将您的用户名添加到docker组: sudo usermod -aG docker $(whoami) 您需要注销Droplet并以同一用户身份返回启用此更改...如果您需要将用户添加到docker您未登录的组中,请使用以下方式明确声明该用户名: sudo usermod -aG docker username 本文的其余部分假定您dockerdocker用户组中的用户身份运行该命令...第5步 - 运行Docker容器 发测试消息后,在您上一步中运行hello-world容器是一个容器运行退出的例子。然而,容器比这更有用,它们可以是交互式的。...系统提示您进行身份验证: docker login -u docker-registry-username 如果您指定了正确的密码,则身份验证应该成功。

    3.3K01

    如何在Ubuntu 16.04上安装和使用Docker

    本教程中的所有命令都应以root用户身份运行如果命令需要root访问权限,则前面会有sudo。Ubuntu 16.04的初始安装教程介绍了如何添加用户并为他们提供sudo访问权限。...如果要sudo在运行docker命令时避免输入,请将用户名添加到docker组中: sudo usermod -aG docker ${USER} 要应用新的组成员身份,您可以注销服务器并重新登录,也可以输入以下内容...: su - ${USER} 系统提示您输入用户密码继续。...: sudo usermod -aG docker username 本文的其余部分假定您docker用户组中的用户身份运行docker命令。...系统提示您进行身份验证: docker login -u docker-registry-username 如果您指定了正确的密码,则身份验证应该成功。

    3.4K30

    如何在Ubuntu上使用Traefik作为Docker容器的反向代理

    准备 要继续学习本教程,您需要具备以下条件: Ubuntu 16.04初始服务器,包括一个可以使用sudo命令的root用户。 正在运行Docker主机。...我们仪表板设置为在端口8080上运行。 该web.auth.basic部分为仪表板配置HTTP基本身份验证。使用您刚刚运行的htpasswd命令的输出作为users条目的值。...保存文件并退出编辑器。有了所有这些配置,我们就可以启动Traefik了。 第2步 - 运行Traefik容器 接下来,为代理创建一个Docker网络容器共享。...我们这个分享到容器中,以便Traefik可以使用它: $ touch acme.json 然后锁定此文件的权限,以便只有root用户可以读取和写入此文件。如果你不这样做,Traefik无法启动。...如果匹配Traefik 的模式流量db-admin.example.com路由到adminer容器。保存文件并退出文本编辑器。

    2.4K40

    Docker实践之03-Dockerfile指令详解

    一些初学者CMD写为:CMD service nginx start 然后发现容器执行后就立即退出了。甚至在容器内去使用systemctl命令结果却发现根本执行不了。...此外,可能希望避免使用root用户去启动服务,从而提高安全性,而在启动服务前还需要以root身份执行一些必要的准备工作,最后切换到服务用户身份启动服务。...redis-server的话,则切换到redis用户身份启动服务器,否则依旧使用root身份执行。...”,故root用户无法启动redis服务。...为了防止运行用户忘记动态文件所保存目录挂载为卷,在Dockerfile中,我们可以事先指定某些目录挂载为匿名卷,这样在运行如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据,如

    90231

    深入理解 Docker Run 命令:从入门到精通

    本文深入探讨 docker run 命令的使用方法,旨在帮助初学者快速入门并掌握该命令的各种用法。 Docker Run 简介 docker run 命令用于在 Docker运行一个容器。...(49153起始 49153到65535) -u 什么用户身份创建容器 –name “nginx-lb” 容器名字 -m,–memory bytes 设置容器使用内存最大值 -h, --hostname...-it 交互模式启动一个容器,在容器内执行 bash 命令 注:如果这里加了-d 参数,则不会进入容器的 CLI 界面;如果不加 bash 命令,则会执行 tomcat 容器本身自动会执行的命令( catalina.sh...run ),也会进不了 CLI 界面,因为会打印一堆运行日志 docker run -it -p 1111:8080 tomcat:7 bash root 权限创建容器,当进入容器之后,拥有 root...jenkins # 进入容器 docker exec -it -uroot jenkins_muller bash 注: -uroot:是给了 root 用户身份,但并没有真正的 root 权限 -

    3K10

    你可能不知道的容器镜像安全实践

    3 防的最佳实践 3.1 安全的方式构建容器镜像 常规构建容器镜像的方式就是 docker build,这种情况需要客户端要能和 docker守护进程进行通信。...3.4 root用户启动容器 在 Linux 系统中,root用户意味着超级权限,能够很方便的管理很多事情,但是同时带来的潜在威胁也是巨大的,用 root 身份执行的破坏行动,其后果是灾难性的。...在容器中也是一样,需要以root身份运行容器,通过限制用户的操作权限来保证容器以及运行在其内的应用程序的安全性。...在 sysdig 发布的《Sysdig 2021年容器安全和使用报告》中显示,58% 的容器 root 用户运行。足以看出,这一点并未得到广泛的重视。...因此,建议在Dockerfile中添加命令来让容器root用户身份启动,在我司的CI Pipeline中的实践: ......

    74430

    待补充说明

    RunAsNonRoot 当RunAsNonRoot 为true不允许用户任何方式(譬如sudo)使用root用户运行服务。...另外牢记一点:这种方式运行的实例是在特权模式下运行的;正因为如此,你将它们暴露在 Docker 化的外界面前时,需要采取更多的防范措施。...如果该进程 root 身份运行,它对这些资源的访问权限与主机 root 账户是相同的。...例如,jenkins/jenkins 镜像名为 jenkins:jenkins 的组:用户身份运行,其应用文件全部由该用户拥有。...上面我们提到确保容器进程不以 root 用户身份运行是一个非常好的主意,但不要依赖 runAsUser 或 runAsGroup 设置来保证这一点,未来有人可能会删除这些配置,请确保同时 runAsNonRoot

    77420

    如何在Ubuntu 18.04上使用Traefik作为Docker容器的反向代理

    先决条件 要继续学习本教程,您需要具备以下条件: 一个Ubuntu 18.04服务器,包括一个具有sudo权限的root用户和防火墙。...第2步 - 运行Traefik容器 接下来,为代理创建一个Docker网络容器共享。Docker网络是必需的,以便我们可以将它与使用Docker Compose运行的应用程序一起使用。...我们这个分享到容器中,以便Traefik可以使用它: touch acme.json 如果容器内的root用户具有唯一的读写访问权限,Traefik只能使用此文件。...chmod 600 acme.json 文件传递给Docker后,所有者将自动更改为容器内的root用户。...在Adminer登录屏幕上,使用用户rootmysql用于服务器,并使用您为MYSQL_ROOT_PASSWORD设置的值来设置为密码的值。

    2.2K74

    浅析Docker运行安全

    非常精细的级别向root用户添加特权。 功能适用于文件和线程。文件功能允许用户更高的特权执行程序。这类似于setuid位的工作方式。线程功能跟踪正在运行的程序中功能的当前状态。...如果使用—pid=host参数,容器可以直接操作宿主机上的数据。如果 dockerd 守护进程设置了用户命名空间映射,运行容器时使用该参数会导致启动失败。...当你想在主机更改hostname之后,同时也更改同样的hostname到容器。 2.18 不共享主机用户命名空间,禁用—users=host 默认情况下,Docker守护程序root身份运行。...2.29 docker exec 命令不使用—user=root选项 在docker exec命令中使用—user=root选项,会root用户身份容器内执行命令。...例如,如果容器tomcat用户(或任何其他root用户身份运行,则可以使用—user=root选项通过docker execroot身份运行命令。

    2.8K10

    docker与gosu

    容器中不要使用root账号 gosu是个工具,用来提升指定账号的权限,作用与sudo命令类似,而docker中使用gosu的起源来自安全问题; docker容器运行的进程,如果root身份运行的会有安全隐患...因此,容器内使用root账号运行进程才是安全的方式,这也是我们在制作镜像时要注意的地方。...在镜像中创建root账号 既然不能用root账号,那就要创建其他账号来运行进程了,redis官方镜像的Dockerfile为例,来看看如何创建账号,如下图,地址是:https://github.com...在docker-entrypoint.sh执行的时候已经是redis身份了,如果遇到权限问题,例如一些文件只有root账号有读、写、执行权限,用sudo xxx命令来执行即可; 但事实并非如此!...容器,并且启动后自动执行命令gosu root ps aux,作用是以root账号的身份执行ps aux,也就是当前进程都打印出来,执行结果如下: [root@centos7 ~]# docker run

    3.9K51

    如何在 Ubuntu 20.04 上安装和使用 Docker

    ,它允许你构建,测试,并且作为可移动的容器去部署应用,这些容器可以在任何地方运行。...01.想要安装 Docker 最新版本,运行下面的命令。如果你想安装指定版本,跳过这个步骤,并且跳到下一步。...如果你想阻止 Docker 自动更新,锁住它的版本: sudo apt-mark hold docker-ce 二、 Root 用户身份执行 Docker 默认情况下,只有 root 或者 有 sudo...想要以 root 用户执行 Docker 命令,你需要将你的用户添加到 Docker 用户组,该用户组在 Docker CE 软件包安装过程中被创建。...如果本地没有该镜像,这个命令将会下载测试镜像,在容器运行它,打印出 “Hello from Docker”,并且退出

    6.1K41

    你的镜像安全吗?

    Root用户运行容器镜像 默认情况下,Docker授予容器中进程的root权限,这意味着它们具有对容器和主机环境的完全管理访问权限。...一般来说,就像我们不会在标准Linux服务器上root身份运行进程一样,我们大部分容器应用部署时,也不会在容器root身份运行。...如何防止容器root权限运行 如果不确定基础镜像使用什么权限,应该强制使用自定义用户root用户用户组。...所以,在以下示例中,您的容器始终最低特权运行-所提供的用户标识符1009的权限级别也最低。但是,此方法无法解决映像本身的潜在安全缺陷。...因此,最好在Dockerfile中指定一个root用户,以便您的容器始终安全运行。 $ docker run --user 1009 centos:7 2.

    1.9K20

    Dcoker 容器环境下 Node.js 应用程序的优雅退出

    ,释放自己正在处理的一些资源之后自行退出,常见的例如,程序接收到一个 HTTP 请求正在处理,如果突然间中断了,用户端也就无法正常的收到响应了,通过优雅退出我们先要保证当前正在处理的链接能够正常的被响应...这里我从容器内进程的声明周期、NPM 启动机制、信号的传递机制进行分析 容器内进程的生命周期 上面举的 Node.js 例子在容器环境下是可以实现优雅退出的,但是在 docker 容器环境却不行,那我们先来了解下容器内进程的生命周期是怎么样的...最终当这个 PID=1 的进程退出之后,Docker 容器销毁并发送 SIGKILL 信号量通知容器内其它还存在的进程,此时就是强制退出了。...在上面了解了 Docker 环境无法,Node.js 无法正常优雅退出的原因,以下给出几种解决方案 Node 进程做为容器主进程 修改 Dockerfile 文件,直接使用 node app.js 运行而不是通过...USER TIME COMMAND 1 root 0:00 node app $ pstree -p node(1) 执行请求之后,立即停止容器,响应也是 ok 的,从容器内查看服务的日志也可看到是收到了进程退出的信号

    1.3K10

    6.Docker镜像与容器安全最佳实践

    不仅如此 root 用户身份运行容器,还扩大了攻击面,如果容器应用中存在安全漏洞,很容易造成权限提升。 在实践中一般不需要容器拥有 root 权限。...如果容器进程root身份运行,则不符合安全要求。...备注 4.容器镜像和构建文件 4.1 创建容器用户 描述: 为容器镜像的Dockerfile中的容器创建root用户。 加固说明: 如果可能,最好指定非root用户身份运行容器。...虽然用户命名空间映射可用,但是如果用户容器镜像中指定了用户,则默认情况下容器将作为该用户运行,并且不需要特定的用户命名空间重新映射。 检测加固 # 如果为空则表示容器root身份运行。...HEALTHCHECK指令添加到容器镜像可确保docker引擎定期检查运行容器实例是否符合该指令,确保实例仍在运行。根据报告的健康状况,docker引擎可以退出工作容器并实例化新容器

    2.7K20

    Docker 容器环境下 Node.js 应用程序的优雅退出

    ,释放自己正在处理的一些资源之后自行退出,常见的例如,程序接收到一个 HTTP 请求正在处理,如果突然间中断了,用户端也就无法正常的收到响应了,通过优雅退出我们先要保证当前正在处理的链接能够正常的被响应...这里我从容器内进程的声明周期、NPM 启动机制、信号的传递机制进行分析 容器内进程的生命周期 上面举的 Node.js 例子在容器环境下是可以实现优雅退出的,但是在 docker 容器环境却不行,那我们先来了解下容器内进程的生命周期是怎么样的...最终当这个 PID=1 的进程退出之后,Docker 容器销毁并发送 SIGKILL 信号量通知容器内其它还存在的进程,此时就是强制退出了。...在上面了解了 Docker 环境无法,Node.js 无法正常优雅退出的原因,以下给出几种解决方案 Node 进程做为容器主进程 修改 Dockerfile 文件,直接使用 node app.js 运行而不是通过...USER TIME COMMAND 1 root 0:00 node app $ pstree -p node(1) 执行请求之后,立即停止容器,响应也是 ok 的,从容器内查看服务的日志也可看到是收到了进程退出的信号

    1.8K00

    docker mysql-8.0.28

    ,因为docker容器中是普通用户 mkdir -p /home/docker/mysql/conf && mkdir -p /home/docker/mysql/data # 把mysql临时运行起来...-d mysql # 复制my.cnf文件到本地目录,取出之后之前的运行的mysql容器就可以删除了 docker cp mysqltest:/etc/mysql/my.cnf /home/docker.../mysql/conf # 启动mysql挂载数据卷, docker run --name mysql \ -p 3306:3306 \ # 提升容器内权限,如果没有添加--privileged=true...:3是指容器在未来出现异常退出退出0)的情况下循环重启3次 # --restart=always 一直重启 --restart=on-failure:3 -d \ # 启动的镜像名称 mysql:...数据库 use mysql; # 查询user表,如果有两个root用户,删除掉host=%的root数据,再修改localhost为% select host, user, authentication_string

    1K30

    Docker学习——Dockerfile 指令详解(五) 顶

    一些初学者 CMD 写为: CMD service nginx start 然后发现容器执行后就立即退出了。甚至在容器内去使用 systemctl 命令结果却发现根本执行不了。...此外,可能希望避免使用 root 用户去启动服务,从而提高安全性,而在启动服务前还需要以 root 身份执行一些必要的准备工作,最后切换到服务用户身份启动服务。...redis-server 的话,则切换到 redis用户身份启动服务器,否则依旧使用 root 身份执行。...为了防止运行用户忘记动态文件所保存目录挂载为卷,在Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。...RUN groupadd -r redis && useradd -r -g redis redis USER redis RUN [ "redis-server" ] 如果 root 执行的脚本,在执行期间希望改变身份

    1.5K30
    领券