Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker-套接字文件的卷映射是一种覆盖行为吗?_Docker_Jenkins_Docker Compose_Dockerfile_Docker Engine - Fatal编程技术网

Docker-套接字文件的卷映射是一种覆盖行为吗?

Docker-套接字文件的卷映射是一种覆盖行为吗?,docker,jenkins,docker-compose,dockerfile,docker-engine,Docker,Jenkins,Docker Compose,Dockerfile,Docker Engine,以下是jenkins图像的代码片段,该图像取自: 在jenkins映像中安装docker引擎。我的理解是,var/run/docker.sock是使用Jenkins容器创建的,因为安装了docker引擎 以下是卷映射语法,取自: 这将在EC2主机上启动jenkins容器(上图) EC2主机还运行docker守护进程 所以,有一个docker守护进程运行在EC2主机中。docker容器中也有一个docker守护进程(Jenkins) 使用docker compose(上文)中用于套接字文件

以下是jenkins图像的代码片段,该图像取自:


在jenkins映像中安装docker引擎。我的理解是,
var/run/docker.sock
是使用Jenkins容器创建的,因为安装了docker引擎


以下是卷映射语法,取自:


这将在EC2主机上启动jenkins容器(上图)

EC2主机还运行docker守护进程

所以,有一个docker守护进程运行在EC2主机中。docker容器中也有一个docker守护进程(Jenkins)


使用docker compose(上文)中用于套接字文件的语法(
/var/run/docker.sock:/var/run/docker.sock


Jenkins容器中的docker守护进程是否使用EC2主机中的套接字文件覆盖自己的套接字文件?如果是。。。它的含义是什么?

/var/run/docker.sock
在容器中是主机的docker套接字,没有其他内容。这是因为:

  • Docker容器除了在其入口点和/或命令中显式启动的程序外,不运行任何程序,而且几乎总是一个应用程序
  • 您可能不会特意启动Docker守护进程,因此它已安装但未运行
  • Unix套接字文件只有在守护进程启动并将套接字绑定到特定文件后才能创建
  • docker run-v
    选项将始终将主机的内容“推送”到容器中,这发生在任何容器进程运行之前
  • 因此,在您描述的场景中,它不能是主机Docker套接字之外的任何东西,因为没有第二个Docker守护进程


    为了便于讨论,我们假设您实际上正在以这种方式启动第二个守护进程

    这里的操作顺序是:(1)Docker设置容器文件系统,(2)Docker开始运行入口点,(3)入口点启动守护进程,(4)守护进程尝试创建套接字文件。在守护进程启动时,其套接字文件将已经存在。我相信这将导致bind(2)调用在
    EADDRINUSE
    中失败,并且守护进程将无法启动。希望这会导致容器启动失败

    您可以合法地在一个容器中启动一个守护进程,该容器发布您希望从主机访问的Unix套接字。要实现这一点,您需要将目录装载到容器中,并将守护进程指向它。它可能不可能是任何一方的
    /var/run
    (主机中有很多东西
    /var/run
    ;装载目录会隐藏容器中的现有内容,您可能也需要容器的
    /var/run
    )。它必须是一个目录,而不是套接字文件名,因为Docker将创建一个空目录,如果它不存在;容器中的某个路径将存在,绑定将失败

    因此,如果您想在容器中启动一个假想的foo守护进程,它大致如下

    docker运行\
    --名称foo\#容器名称
    -v$PWD/socket:/socket\#绑定挂载目录
    foo\#图像名称
    食物\#在容器中运行的命令
    --前台\#不要后台处理;保持容器的活力
    --绑定fd://socket/foo.sock#将套接字放在共享目录中
    

    在主机上,您需要设置
    FOO\u SOCKET\u PATH=$PWD/SOCKET/FOO.sock
    或指向此特定文件。

    /var/run/docker.sock
    容器中的是主机的docker套接字,而不是其他内容。这是因为:

  • Docker容器除了在其入口点和/或命令中显式启动的程序外,不运行任何程序,而且几乎总是一个应用程序
  • 您可能不会特意启动Docker守护进程,因此它已安装但未运行
  • Unix套接字文件只有在守护进程启动并将套接字绑定到特定文件后才能创建
  • docker run-v
    选项将始终将主机的内容“推送”到容器中,这发生在任何容器进程运行之前
  • 因此,在您描述的场景中,它不能是主机Docker套接字之外的任何东西,因为没有第二个Docker守护进程


    为了便于讨论,我们假设您实际上正在以这种方式启动第二个守护进程

    这里的操作顺序是:(1)Docker设置容器文件系统,(2)Docker开始运行入口点,(3)入口点启动守护进程,(4)守护进程尝试创建套接字文件。在守护进程启动时,其套接字文件将已经存在。我相信这将导致bind(2)调用在
    EADDRINUSE
    中失败,并且守护进程将无法启动。希望这会导致容器启动失败

    您可以合法地在一个容器中启动一个守护进程,该容器发布您希望从主机访问的Unix套接字。要实现这一点,您需要将目录装载到容器中,并将守护进程指向它。它可能不可能是任何一方的
    /var/run
    (主机中有很多东西
    /var/run
    ;装载目录会隐藏容器中的现有内容,您可能也需要容器的
    /var/run
    )。它必须是一个目录,而不是套接字文件名,因为Docker将创建一个空目录,如果它不存在;容器中的某个路径将存在,绑定将失败

    因此,如果您想在容器中启动一个假想的foo守护进程,它大致如下

    docker运行\
    --名称foo\#容器名称
    -v$PWD/插座:/socket\
    
    # Install Docker Engine
    RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D && \
        echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | tee /etc/apt/sources.list.d/docker.list && \
        apt-get update -y && \
        apt-get purge lxc-docker* -y && \
        apt-get install docker-engine=${DOCKER_ENGINE:-1.10.2}-0~trusty -y && \
        usermod -aG docker jenkins && \
        usermod -aG users jenkins
    
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
    
    docker info
    Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?