【问题标题】:Can Docker client(within container) talk to docker daemon on EC2 using UNIX socket?Docker 客户端(在容器内)可以使用 UNIX 套接字与 EC2 上的 docker 守护进程通信吗?
【发布时间】:2019-11-01 00:12:31
【问题描述】:

作为 Jenkins docker 镜像的一部分,

我应该安装 docker 客户端(仅),

可以与安装在底层 EC2 实例上的 docker 守护进程通信。

UNIX 套接字,我的意思是 socket(AF_UNIX,,)


背景

按照说明,给定here

我认为没有必要在 jenkins 映像中安装 docker daemon,

因为作者正在使用 UNIX 套接字与运行在 EC2 实例中的底层 docker daemon 进行通信,如 here 所示。

我的理解是,在 jenkins 映像中安装 docker 客户端安装(仅)就足以与运行在 EC2 实例上的 docker 守护进程对话,使用 UNIX 套接字(/var/run/docker.sock)


1)

在 jenkins 镜像中运行的 docker 客户端可以与在底层 EC2 实例中运行的 docker 守护进程通信吗?有下面的映射...

volumes:
    - /var/run/docker.sock:/var/run/docker.sock

2)

如何仅在下面的 jenkins 镜像中安装 docker 客户端?

FROM jenkins:1.642.1


# Suppress apt installation warnings
ENV DEBIAN_FRONTEND=noninteractive

# Official Jenkins image does not include sudo, change to root user
USER root

# Used to set the docker group ID
# Set to 497 by default, which is the groupID used by AWS Linux ECS instance
ARG DOCKER_GID=497

# Create Docker Group with GID
# Set default value of 497 if DOCKER_GID set to blank string by Docker compose
RUN groupadd -g ${DOCKER_GID:-497} docker

【问题讨论】:

  • Jenkins 文档有instructions for making use of Docker。您显示的绑定挂载是正确的,但在 Dockerfile 中硬编码主机组 ID 不正确。 docker 二进制文件同时包含客户端和守护进程;与主机 Docker 交互并不是绝对必要的,但至少任何sh 'docker ...' 命令都需要它,我建议只安装它。
  • 这能回答你的问题吗? Jenkins Docker Container can't access docker.sock
  • @DavidMaze 在此语法中:-v /var/run/docker.sock:/var/run/docker.sock 第一个套接字文件属于 ec2,第二个套接字文件属于容器(挂载点)...对于此卷绑定...确实安装了 docker-ce-cli在詹金斯图像中还不够吗?
  • 您明确需要 -v 挂载。 (请记住,访问该套接字可以让您轻松接管主机;默认情况下它不可用。)仅安装软件包就相当于安装 mysql-client 但在任何地方都没有正在运行的数据库;该程序将启动但无法连接到任何东西。
  • @DavidMaze docker daemon 已经在 ec2 主机上运行...我的理解是,该绑定语法中的第一个套接字文件属于运行在 ec2 主机上的 docker daemon...不是吗?跨度>

标签: docker jenkins amazon-ec2 docker-compose


【解决方案1】:

要在 Jenkins 中使用 Docker,Jenkins 必须有权访问 docker.sock

您在这里提出的是 docker in docker 方法,通过在 jenkins 容器中安装 docker,但实际上这不是必需的。您只需要一个有效的 docker 守护程序,因此,通常的方法是将 /var/run/docker.sock 从主机映射到容器。

看看这篇精彩的帖子https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/

【讨论】:

  • 1) 在jenkins/jenkins:2.190.1 映像中,是否安装了 docker 守护程序? 2) 在 ec2 上为容器的挂载点创建的匿名卷 (/var/run/docker.sock) 是什么意思?在你的代码中..
  • 我们可以在私人聊天室讨论您的生产代码吗?我对套接字文件的音量使用感到困惑......在你的代码中
  • 您能否详细说明- /var/run/docker.sock 的幕后工作/用法?当您说docker插件时,它是docker客户端吗? ec2(docker host)中创建的匿名卷如何使用?
  • @overexchange 我刚刚注意到 jenkins 的这个实例实际上是 master 并且不运行任何容器。事实上,正如您想知道的那样,该卷甚至没有做任何事情,因为被错误地映射......所以是的,您需要映射它。编辑答案。
【解决方案2】:

您需要在jenkins 映像中安装docker,然后绑定安装/var/run/docker.sock,以便您可以按照Jérôme Petazzoni's blog post on the subject 中的说明运行边车容器。这是我的jenkinsDockerfile

FROM jenkins/jenkins:lts

USER root
RUN apt-get update && \
    apt-get install -y \
        maven \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        lsb-release \
        software-properties-common

RUN curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

RUN add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/debian \
    $(lsb_release -cs) \
    stable"

RUN apt-get update && \
    apt-get install -y \
        docker-ce \
        docker-ce-cli \
        containerd.io

RUN usermod -a -G docker jenkins

COPY plugins.txt /usr/share/jenkins/plugins.txt
RUN /usr/local/bin/install-plugins.sh < /usr/share/jenkins/plugins.txt

USER jenkins
WORKDIR /var/jenkins_home

注意:您可以在构建过程中使用plugins.sh 安装插件,如here 所述。

构建jenkins 映像,即:docker build --rm -t so:58652650 .

运行容器挂载/var/run/docker.sock 即:docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock --entrypoint bash so:58652650

jenkins 用户的图像中,docker 命令应该按预期工作:

【讨论】:

  • 你为什么要安装docker-ce? Jenkins 镜像只需要 docker 客户端 (docker-ce-cli)... 不是吗?
  • 在此语法中:-v /var/run/docker.sock:/var/run/docker.sock 第一个套接字文件属于 ec2,第二个套接字文件属于容器(挂载点)...对于此卷绑定...是否安装 docker-ce-cli 不会够了吗?
  • docker 组是在docker-ce 安装期间创建的,如果未安装包,RUN usermod -a -G docker jenkins 将失败。您不需要在容器内运行 docker 守护进程。
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2020-12-13
  • 2019-04-07
相关资源
最近更新 更多