You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Docker容器内无法执行Docker命令的问题咨询

在Ubuntu 20.04 Docker容器内运行Docker命令失败的问题解决

问题场景

我尝试在基于Ubuntu 20.04的Docker容器内运行若干Docker命令,容器中包含一个触发这些命令的shell脚本。在Dockerfile中安装了docker.io,但遇到两个错误:

  1. 执行sudo service docker status时,提示unrecognized service错误
  2. 执行docker create命令时,出现如下错误:

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.

我的疑问是:在Ubuntu容器中仅安装docker.io不足以运行Docker命令吗?还是使用docker.io的方式有误?

用到的Dockerfile

FROM ubuntu:20.04

RUN apt-get update && \
  apt-get -y install software-properties-common && \
  apt-get -y install docker.io && \
  apt-get -y install vim && \
  apt-get -y install gzip && \
  apt-get -y install apt-transport-https ca-certificates curl gnupg

RUN mkdir -p /latest

COPY run.sh /latest/

RUN chmod 755 /latest/run.sh

RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | \
  tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
  apt-key --keyring /usr/share/keyrings/cloud.google.gpg  add - && apt-get update -y && apt-get install google-cloud-cli -y

问题原因与解决方法

核心原因

仅安装docker.io确实不足以在容器内正常运行Docker命令,问题出在两个关键点:

  • Docker命令分为**客户端(docker)和守护进程(dockerd)**两部分,你安装的docker.io包含了两者,但容器内默认没有启动dockerd,客户端找不到可连接的守护进程,所以docker create报错。
  • Ubuntu 20.04用systemd管理系统服务,但Docker容器默认以非特权模式运行,且没有初始化systemd进程,service命令依赖systemd,自然识别不到docker服务,导致unrecognized service错误。

解决方案

方案1:挂载宿主机Docker套接字(推荐)

直接复用宿主机的Docker守护进程,无需在容器内启动dockerd,是最常用且高效的方式:

  1. 容器内只需保留Docker客户端(docker.io已包含,也可以单独安装更轻量的docker-ce-cli)
  2. 启动容器时,将宿主机的Docker套接字挂载到容器内:
    docker run -v /var/run/docker.sock:/var/run/docker.sock your-image-name
    
  3. 此时容器内的docker命令会直接和宿主机的dockerd通信,所有操作都在宿主机执行,无需在容器内启动任何服务。

方案2:在容器内启动Docker守护进程(不推荐)

这种方式违反容器"单进程"设计原则,且需要特权权限,仅适合测试场景:

  1. 启动容器时添加--privileged参数,赋予容器足够权限:
    docker run --privileged your-image-name
    
  2. 在容器内手动启动dockerd:
    dockerd &
    
  3. 等待几秒让守护进程启动完成,再执行docker create等命令。

Dockerfile优化建议

  • 如果采用方案1,可以只安装Docker客户端,减少镜像体积:将apt-get -y install docker.io替换为apt-get -y install docker-ce-cli(需先添加Docker官方源,或者直接用docker.io的客户端也可)
  • 移除不必要的依赖包(如vim、gzip,若业务不需要),合并apt-get命令减少镜像层,优化后的Dockerfile示例:
    FROM ubuntu:20.04
    
    RUN apt-get update && \
        apt-get -y install --no-install-recommends \
          software-properties-common \
          docker.io \
          apt-transport-https ca-certificates curl gnupg && \
        rm -rf /var/lib/apt/lists/*
    
    RUN mkdir -p /latest
    COPY run.sh /latest/
    RUN chmod 755 /latest/run.sh
    
    RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | \
        tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
        curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
        apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
        apt-get update && \
        apt-get -y install google-cloud-cli && \
        rm -rf /var/lib/apt/lists/*
    

内容的提问来源于stack exchange,提问作者JosephZoom94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:43:12