docker 码头组合内部Alpine集装箱

yc0p9oo0  于 2022-12-11  发布在  Docker
关注(0)|答案(4)|浏览(157)

我正尝试将我的应用程序(代码、Dockerfiles和一个Docker-compose脚本)捆绑在一个映像中,以便于部署(入口点仅为docker-compose up)。

FROM alpine:latest
COPY . /app
RUN apk update && apk add --no-cache docker py-pip openrc && pip install docker-compose

当我运行这个映像时,似乎dockerd还没有启动,因为top结果中没有它; docker ps报告“无法连接到unix:///var/run/docker. sock上的Docker守护进程。Docker守护进程是否正在运行?“。如果我执行service docker start,则返回“* 警告:Docker已经开始了”。有什么特别的我需要做的让Docker工作的一面阿尔卑斯山集装箱?

jtjikinw

jtjikinw1#

如果您无法或不想继承docker:dind(如grapesanswer中所述),则可以选择使用alpine作为基础映像并安装Docker CLI和Docker Compose。
为了保持映像较小,可以在Docker Compose安装后删除某些依赖项:

FROM alpine:3.11

RUN apk update && \
    apk add --no-cache docker-cli python3 && \
    apk add --no-cache --virtual .docker-compose-deps python3-dev libffi-dev openssl-dev gcc libc-dev make && \
    pip3 install docker-compose && \
    apk del .docker-compose-deps

此映像不包含Docker引擎,必须通过从主机装载/var/run/docker.sock来使用Docker-in-Dcoker方法

docker run -v /var/run/docker.sock:/var/run/docker.sock <image name>
ajsxfq5m

ajsxfq5m2#

Docker由运行所有服务的docker守护进程和用于与守护进程交互的CLI组成(好吧,还有很多其他部分,但这些是最重要的)。安装docker-compose并不安装守护进程,无论您从service命令中得到什么消息。
要在容器中使用docker,必须使用docker-in-docker图像。它被称为docker:dind。继承它(而不是alpine)并享受。
但在阅读this article之前,这解释了为什么它不是一个好主意以及在容器内部使用docker的其他方法是什么(提示:您可以通过挂载/var/run/docker.sock:/var/run/docker.sock套接字从容器内部调用主机Docker守护进程)。

5m1hhzi4

5m1hhzi43#

您可以运行此命令以获取docker-compose

apk update && apk add --no-cache --virtual docker-cli python3 .docker-compose-deps python3-dev libffi-dev openssl-dev gcc libc-dev make python3 py3-pip py-pip curl libffi-dev openssl-dev gcc libc-dev rust cargo make

pip install docker-compose
taor4pac

taor4pac4#

Docker是一个客户端-服务器应用程序。它有Docker客户端(docker二进制)和Docker守护进程(dockerd
之所以会出现此错误,是因为您只安装了Docker客户端,而没有在Dockerfile中安装Docker守护进程。
要解决此问题,您有以下几种选择:

  • 使用docker:dind映像,其中包含Docker守护进程和客户端
  • 将Docker守护进程套接字从Docker主机Map到具有Docker客户端的容器
  • 让Docker客户端远程连接到Docker守护进程(可以在任何地方运行,例如在容器、虚拟机、裸机等内部...)

我写了如何create docker in docker agent image,你也可以在那里看到这个例子。

相关问题