问题标签 [docker-in-docker]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
docker - 无法在 docker 中运行 nginx
我正在尝试在 Docker 容器中运行 nginx 映像。我已经尝试了这些步骤
- ubuntu docker镜像中的ssh
docker run -v /var/run/docker.sock:/var/run/docker.sock -it ubuntu:latest bash
- 安装的 Docker
- 运行 Nginx 镜像
docker run -d -p 80:80 nginx
curl localhost:80
给Connection refused
docker - docker-compose 中的 Gitlab-runner 无法连接 http://docker:2375/v1.40/info
短篇小说:我在 docker-compose 中有一个 gitlab-runner,我希望能够使用 DIND,但我遇到了一些困难......
我尝试创建一个平台,其中包含:
- 声纳
- gitlab ce
- gitlab 跑步者
- 注册表
这些服务由 docker-compose 启动和管理 我使用 gitlab-ci 来验证测试、覆盖率并创建一个 docker 镜像,该镜像上传到注册表 我有一个用于测试目的的共享运行器
这是 config.toml :
我的问题:我需要在运行器中指定:network_mode = "oral_default" 以克隆存储库。但是如果我想使用 Dind 来构建我的图像,我会得到这个错误:
这是我的 gitlab ci:
我强烈认为,生成的容器位于另一个网络中,因此无法访问导致这种行为的 docker-compose 网络。
你能帮助我吗 ?谢谢你。
jenkins - docker build 使用 jenkins dind slave + kubernetes 插件抛出 java.net.AbstractPlainSocketImpl.connect UnknownHostException
所以 Jenkins 使用这个官方 helm chart安装在集群内部。这是我根据 helm release 值安装的插件:
我的 Jenkinsfile 依赖以下 pod 模板来启动 slave:
每当有新的 Build 时,奴隶(pod /dind 容器)就会按预期很好地启动。
但是,它在(Jenkinsfile 管道
docker build -t ...
)中的“docker build”步骤中断并在那里中断:
乍一看,我认为这是从属容器(docker:19-dind
)的 DNS 解析问题,因为它是高山的。这就是为什么我/etc/resolv.conf
通过添加sh "cat /etc/resolv.conf"
Jenkinsfile 来调试它。
我有 :
options ndots:5
我根据互联网上许多线程的建议删除了最后一行。
但这并不能解决问题。
想了又想,才发现造成这个错误的容器不是Slave(docker:19-dind),而是为了满足而打开的中间容器docker build
。
因此,我RUN cat /etc/resolv.conf
在 Dockerfile 中添加了另一层(以 开头FROM gradle:5.5-jdk11
)。
现在,resolv.conf
不同的是:
基本上,它是一个不同于10.0.0.2
从容器的名称服务器的名称服务器172.20.0.10
。resolv.confndots:5
这个中间容器中没有。
在所有这些调试步骤和大量尝试之后,我感到很困惑。
建筑学
docker - Docker 中的 Docker on Continuous Integration 导致“设备上没有剩余空间”
在我当前的项目中,我们使用 Jenkins 和基于 Docker-In-Docker 的方法来构建 docker 镜像。
我使用 docker-compose 和 Landoops 命令行测试工具 coyote 扩展了我们的一项工作以使用集成测试。我确实在构建中构建了生产 docker 镜像以及仅用于集成测试的 docker 镜像。
一段时间后(我认为/var/lib/docker)下的docker空间填满了整个磁盘,我得到了这样的东西:
当我在清理卷的同时进行 docker 系统修剪时,构建/测试会再次运行,但必须再次下载大量 docker 镜像,并且在另一个测试正在下载/构建 docker 镜像的过程中不应该这样做。
所以我的结论是:Docker-In-Docker(尤其是本地镜像仓库和卷存储)正在使用“外部”Docker 注册表和卷存储。
我的问题是:在不删除每个作业之后/之前的所有图像/卷的情况下,是否有解决这个问题的方法?
更新:
我确实发现了这个
“Device Mapper 没有命名空间,因此如果 Docker 的多个实例在同一台机器上使用它,它们都将能够看到(并影响)彼此的映像和容器支持设备。没有。对于许多这些问题都有解决方法; 例如,如果你想在内部 Docker 中使用 AUFS,只需将 /var/lib/docker 提升为一个卷就可以了。Docker 为 Device Mapper 目标名称添加了一些基本的命名空间,这样如果多次调用Docker 在同一台机器上运行,它们不会互相踩踏。”
来自:https ://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
所以在我看来,我们的 OPS 团队只是在不使用 devicemapper 命名空间的情况下挂载了它,因此同一节点上的每个作业都使用相同的 /var/lib/docker。
docker - docker-in-docker 卷上的 $(pwd) 挂载了意外的目录
例子:
安装在哪个位置-v $(pwd):/app2
?它不在~/test/dind-volumes
主机操作系统上。share
并且tomita-cfg
是来自主机操作系统的文件夹,但路径完全不同,它甚至不是从~
git - GitLab CI - 尝试使用 docker buildx 为 ARM64 构建
尝试docker buildx
与 GitLabs 共享运行器一起使用来构建可以在我的 Raspberry Pi 上运行的 Docker 映像。作业失败,说 git 不在 PATH 中,但 git 安装在image: docker:stable-git
. 是否有任何已知的修复程序或更好的方法来构建与 ARM64 兼容的映像,而无需在 Raspberry Pi 本身上构建?(由于 CPU 使用率,RPi 在构建时变得不可用)
docker - 没有 -v /var/run/docker.sock:/var/run/docker.sock 无法连接到 Docker 守护进程
我正在尝试在 docker 容器中运行 docker,并且容器具有 nodeJs App。
这是我的Dockerfile:
我使用上面的 Dockerfile 构建了 docker 映像(newdockerimage)并使用docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker newdockerimage
.
我可以在容器内安装 docker,但由于 volume ( ) ,主机系统上的所有 docker 映像也在容器内共享/var/run/docker.sock
。
如果我 -v /var/run/docker.sock:/var/run/docker.sock
在运行容器时不使用卷,则会出现以下错误:-
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
因为容器将是节点应用程序(因为那是入口点),所以覆盖 docker:dind 入口点
请帮我 !如何在不共享卷的情况下在容器内运行 docker(不复制主机系统的 docker 映像)
docker - 在 Docker 中的 Docker 中预拉图像 (dind)
我正在运行一个 docker-in-docker 容器,它总是使用相同的几个图像。我想将它们预先拉到我的 dind 容器中,这样我就不必在启动时拉它们。我怎么能做到这一点?
我正在考虑按照以下方式建立自己的形象
显然,上面的 Dockerfile 不会构建,因为在构建过程中 docker 没有运行,但它应该让我知道我想要实现什么。
docker - GitLab Runner Docker Executor 中的缓存层 - 长时间 DinD 容器
我正在我的项目中使用 GitLab CI,并创建了一个图像来进行测试和构建。当我在 docker executor 中运行它时,每个作业都需要从头开始下载图像。我需要缓存图层并拉取图像以缩短构建和部署时间(5 分钟,使用不安全选项最多 1 分钟)。
我搜索了多个链接和多个文章,有很多人有同样的问题。但是,GitLab 团队并没有解决这个问题。并且社区没有可靠且安全的解决方案。下面的链接也有同样的问题:
- 最佳答案不起作用:Store layers in gitlab ci docker executor
- 绕过问题的多项更改,但没有任何效果:https ://blog.scottlogic.com/2018/02/09/multi-dind-ci-boxes.html
- 讨论不要使用已安装的docker.sock:https ://gitlab.com/gitlab-org/gitlab-foss/issues/17769
- 使用挂载docker.sock的讨论:https ://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
- 构建一个长时间的容器(不要和我一起工作):https ://medium.com/@tonywooster/docker-in-docker-in-gitlab-runners-220caeb708ca
- 未安装docker.sock的文档:https ://docs.gitlab.com/ce/ci/docker/using_docker_build.html#use-docker-in-docker-executor
- 卷配置示例:https ://github.com/ayufan/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runnersdocker-section
最可能的方法(使用层缓存)是使用单独的容器并使运行器连接到它,并从中触发执行。这样,所有层都将位于“无限生命”容器中,并且不会在阶段结束时丢失所有缓存。考虑将docker.sock暴露为挂载的方法不仅不安全,而且在容器之间共享文件时也存在许多问题,因为它们都是兄弟姐妹,而不是共享卷的父母和孩子。
使用无限生命容器的方法如下所示:
或者
然后修改config.toml如下:
或分别
我也尝试过使用环境变量(在config.toml和.gitlab-ci.yml 上):
并从.gitlab-ci.yml中删除:
我目前的结果是:
使用已安装的 docker.sock它可以工作。但它是不安全的,并且卷在共享文件、工件和缓存方面存在许多问题。