下面是从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主机中存在的套接字文件覆盖其自己的套接字文件?如果是的话,这意味着什么?
答案 0 :(得分:2)
/var/run/docker.sock
是主机的Docker套接字,仅此而已。这是因为:
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命令来运行测试,构建工件并部署新版本的应用程序。