Docker-套接字文件的卷映射是一种覆盖行为吗?
以下是jenkins图像的代码片段,该图像取自: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映像中安装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 run-v
选项将始终将主机的内容“推送”到容器中,这发生在任何容器进程运行之前为了便于讨论,我们假设您实际上正在以这种方式启动第二个守护进程 这里的操作顺序是:(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 run-v
选项将始终将主机的内容“推送”到容器中,这发生在任何容器进程运行之前为了便于讨论,我们假设您实际上正在以这种方式启动第二个守护进程 这里的操作顺序是:(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?