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

时间:2019-11-02 02:56:16

标签: docker jenkins docker-compose dockerfile docker-engine

下面是从here拍摄的jenkins图片的代码段:

<div data-is-focusable="true" id="react-combobox-view-0" class="label_kohvda-o_O-label_2lsolt" tabindex="9" role="listbox" aria-expanded="false" aria-haspopup="true" aria-atomic="true" title="Region" aria-live="assertive">

<div style="width: 100%; overflow: hidden; position: relative; display: flex; height: 100%; align-items: stretch;">
<ul style="margin: 0px; padding: 5px; list-style: none; display: flex; overflow: hidden;">
<li class="selectedItem_1og5q2j">
<span class="topTagText_yz2uri-o_O-topTagText_t9v74o-o_O-topTagTextReadonly_ps5463">APAC</span></li></ul></div>

<div class="combobox-view-chevron arrowContainer_1kmq8gc-o_O-container_r2h174-o_O-containerColors_1803dea"></div></div>

在jenkins映像中安装docker引擎。我的理解是,由于安装了docker引擎,# 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 是使用Jenkins容器创建的。


以下是从here摘录的体积映射语法

var/run/docker.sock

在EC2主机上启动jenkins容器(上方)。

EC2主机也正在运行docker守护程序。

因此,EC2主机中正在运行docker守护程序。在Docker容器(Jenkins)中还运行着一个Docker守护程序


在套接字文件的docker-compose(上方)中使用这种语法(volumes: - jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock

Jenkins容器中的docker守护进程是否使用EC2主机中存在的套接字文件覆盖其自己的套接字文件?如果是的话,这意味着什么?

2 个答案:

答案 0 :(得分:2)

容器中的

/var/run/docker.sock是主机的Docker套接字,仅此而已。这是因为:

  1. 除了在其入口点和/或命令中明确启动的程序外,Docker容器不运行任何程序,并且几乎总是一个应用程序。
  2. 您大概不会费劲地启动Docker守护程序,因此它已安装但未运行。
  3. 在守护程序启动并将其绑定(2)套接字到特定文件之前,不会创建Unix套接字文件。
  4. docker run -v选项将始终将主机的内容“推送”到容器中,并且这会在任何容器进程运行之前发生。

因此,在您描述的场景中,除了主机Docker套接字外,别无其他,因为没有第二个Docker守护程序。


让我们说说您实际上是在以这种方式启动第二个守护程序。

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

您可以合法地在要从主机访问的容器中启动发布Unix套接字的守护程序。为此,您需要将目录装入容器,然后将守护程序指向该目录。可能两边都不能/var/run(主机/var/run中有很多东西;安装目录会隐藏容器中的现有内容,您可能希望容器的/var/run太)。它必须是目录,而不是套接字文件名,因为Docker将创建一个空目录(如果不存在);该容器中将存在某物,并且绑定将失败。

因此,如果您想在容器内启动一个假想的foo守护程序,它看起来大概像

docker run \
  --name foo \                   # container name
  -v $PWD/socket:/socket \       # bind mount a directory
  foo \                          # image name
  food \                         # command to run in the container
    --foreground \               # don't daemonize; keep the container alive
    --bind fd://socket/foo.sock  # put the socket in the shared directory

在主机上,您需要设置FOO_SOCKET_PATH=$PWD/socket/foo.sock或指向该特定文件。

答案 1 :(得分:1)

来自docs

  

Docker-engine是一个客户端-服务器应用程序

请注意,在安装docker-engine时,同时安装了docker-daemon(服务器)和docker cli(客户端)。

这意味着,如果没有运行docker守护程序,您仍然可以运行docker cli命令:

docker info
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

您共享的詹金斯映像没有运行docker引擎的说明。所以我认为它不在容器内运行。

/var/run/docker.sock:/var/run/docker.sock卷将Docker主机的docker引擎套接字映射到容器。

因此,在容器内运行的docker cli命令可控制在docker主机上运行的docker-engine。

这是有意义的,如果您从容器化的Jenkins中在主机上进行CI / CD。

Jenkins管道可能使用docker,docker-compose和docker swarm命令来运行测试,构建工件并部署新版本的应用程序。