Ubuntu Docker容器内无法执行Docker命令的问题咨询
在Ubuntu 20.04 Docker容器内运行Docker命令失败的问题解决
问题场景
我尝试在基于Ubuntu 20.04的Docker容器内运行若干Docker命令,容器中包含一个触发这些命令的shell脚本。在Dockerfile中安装了docker.io,但遇到两个错误:
- 执行
sudo service docker status时,提示unrecognized service错误 - 执行
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,是最常用且高效的方式:
- 容器内只需保留Docker客户端(docker.io已包含,也可以单独安装更轻量的
docker-ce-cli) - 启动容器时,将宿主机的Docker套接字挂载到容器内:
docker run -v /var/run/docker.sock:/var/run/docker.sock your-image-name - 此时容器内的
docker命令会直接和宿主机的dockerd通信,所有操作都在宿主机执行,无需在容器内启动任何服务。
方案2:在容器内启动Docker守护进程(不推荐)
这种方式违反容器"单进程"设计原则,且需要特权权限,仅适合测试场景:
- 启动容器时添加
--privileged参数,赋予容器足够权限:docker run --privileged your-image-name - 在容器内手动启动dockerd:
dockerd & - 等待几秒让守护进程启动完成,再执行
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
相关产品推荐
相关产品推荐

