Docker 码头工人在阿尔卑斯集装箱内组装

Docker 码头工人在阿尔卑斯集装箱内组装,docker,docker-compose,alpine,Docker,Docker Compose,Alpine,我正试图将我的应用程序(代码、docker文件和docker compose脚本)捆绑在一个映像中,以便于部署(entrypoint将只docker compose up)。我的Dockerfile用于此顶级应用程序映像 FROM alpine:latest COPY . /app RUN apk update && apk add --no-cache docker py-pip openrc && pip install docker-compose 当我运

我正试图将我的应用程序(代码、docker文件和docker compose脚本)捆绑在一个映像中,以便于部署(entrypoint将只
docker compose up
)。我的Dockerfile用于此顶级应用程序映像

FROM alpine:latest
COPY . /app
RUN apk update && apk add --no-cache docker py-pip openrc && pip install docker-compose
当我运行此图像时,dockerd似乎还没有启动,没有出现在
top
结果中
docker ps
reports“无法连接到以下位置的docker守护程序”unix:///var/run/docker.sock. docker守护进程正在运行吗?
“。但是,如果我执行
服务docker start
,则返回“*警告:docker已在启动”。要让Docker在Alpine容器中工作,我需要做什么特别的事情吗?

Docker由运行所有服务的Docker守护进程和用于与守护进程交互的CLI组成(好的,还有很多其他部分,但这些是最重要的)。安装
docker compose
不会安装守护进程,无论您从
service
命令中收到什么消息

要在容器内使用
docker
,必须在docker图像中使用
docker。它被称为
docker:dind
。从中继承(而不是
alpine
)并享受


但在阅读之前,这就解释了为什么这不是一个好主意,以及在容器内使用docker的其他方法(提示:您可以从容器内调用主机的docker守护程序,只需安装
/var/run/docker.sock:/var/run/docker.sock
socket).

如果您不能或不想继承中提到的
docker:dind
,可以选择使用
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
来使用Dcoker方法中的Docker

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

您可以运行此命令以获得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

您是否正确安装了docker?看起来它做得不错,但内部容器缺少外部网络?有没有一种方法可以用类似的方式来解决这个问题?我不明白。内部容器并不缺少网络,除非显式安装了守护进程,否则它们没有守护进程。使用
/var/run/docker.sock
可以通过授予它们到主机容器的连接来消除此问题。但这是Unix套接字,它不是纯粹的网络。是的,问题似乎实际上是某个内部容器/应用程序的日志记录停止(或被吞没/隐藏等),尽管容器/应用程序继续正常运行