在 Openshift 的 Docker 容器 运行 中安装和 运行 docker
Installing and Running docker in a Docker container running in Openshift
我目前正在处理以下场景
我正在尝试在 OpenShift 中设置一个容器,该容器 运行 是一个 Jenkins,它本身能够 运行 docker 利用构建为 [=58] 的声明性管道=]在它自己的 docker 容器中。这基本上使得有必要在这个容器内安装 运行 docker。
我已经研究了很长时间了。在线检查了数十个帖子和主题,但我无法完成。基本上我到目前为止
- 我可以在我的容器中安装 docker(来自基础镜像 openshift/jenkins-2-centos7:最新)
- 我无法将 docker 转换为 运行,因为这使用了
的 systemctl
现在我读到 systemctl 无法在 docker 容器内工作,或者至少非常不推荐,因为它会干扰系统中的 PID 1。没有
systemctl start docker
这会让我 docker beeing unable to connect with the daemon (as expected) 和错误消息
Can't connect to docker daemon. Is 'docker -d' running on this host?
所以我尝试使用
自己设置守护进程
我的 Dockerfile 中的以下内容
RUN usermod -aG docker $(whoami)
RUN dockerd -H unix:///var/run/docker.sock
告诉我无法挂载 cgroup 也不起作用。经过更多研究后,我发现这可以通过
中的 cgroupfs-mount 脚本来处理
https://github.com/tianon/cgroupfs-mount/tree/master
但在这里我也没有运气,留下了以下错误
Error starting daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.4.21: can't initialize iptables table `nat': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.
下班后我就没主意了。有谁知道如何让 docker 在 OpenShift 中工作?真的很棒
你有 this article by @jpetazzo, from Docker team, about Docker In Docker (DinD):
文章:
The primary purpose of Docker-in-Docker was to help with the development of Docker itself. Many people use it to run CI (e.g. with Jenkins), which seems fine at first, but they run into many “interesting” problems that can be avoided by bind-mounting the Docker socket into your Jenkins container instead.
DinD 回购:
This work is now obsolete, thanks to the combined efforts of some amazing people like @jfrazelle and @tianon, who also are black belts in the art of putting IKEA furniture together.
If you want to run Docker-in-Docker today, all you need to do is:
docker run --privileged -d docker:dind
所以 here 是一篇使用另一种方法在 docker 容器中使用 Jenkins 构建 docker 容器的文章:
docker run -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkins/jenkins:lts
因此,您可能希望根据您的 OpenShift 场景调整其中一种解决方案。希望能解决您的问题。
你需要一个特权 pod 运行 jenkins 来安装 openshift 节点 docker 套接字。这是一个坏主意,因为 jenkins 将在 kubernetes 语义和控制之外启动容器。
为什么不使用 openshift 附带的 s2i service?
此致。
I am trying to setup a container in OpenShift that runs a Jenkins that is itsself able to run docker to make use of declarative pipelines where the build is running in it's own docker container. This basically makes it necessary to install and run docker inside this container.
我不认为你在这里的结论是唯一的可能性,我将在下面描述的是一种更容易获得(我认为)你想要的东西的方法! :) 如果除了我将描述的这 3 个之外还有任何其他用例,请告诉我,我会尝试更新以涵盖它们:
- 管道运行在自己的容器中
- 运行 来自管道的额外容器
- 从管道构建容器镜像
管道运行在自己的容器中
对于这种情况,有出色的 Kubernetes plugin。
使用此插件,您可以将 Kubernetes/OpenShift 云添加到 Jenkins 全局配置中。这可以是 Jenkins 所在的集群 运行ning(如果您使用 OpenShift 提供的 Jenkins 映像,默认情况下至少会添加),也可以是外部集群。
在该配置中,您可以定义 PodTemplates(同样,OpenShift 提供的 Jenkins 图像中提供了几个示例),或者我认为您也可以直接在管道中指定它。当您的管道请求 node/agent 标签与其中一个匹配时(并且没有匹配的 long-运行ning 代理),然后将从该模板创建一个 pod,并且您的管道执行将发生在容器内。一旦不再需要,它将再次取消配置。
以下是此插件公开的管道步骤:https://jenkins.io/doc/pipeline/steps/kubernetes/
运行 来自管道的额外容器
作为管道的一部分,您可能需要 运行 一些测试,并且这些测试可能希望能够与例如一个数据库。您可以在您的 OpenShift 项目中为此创建资源(例如,部署并使用服务公开它),然后将其拆除。 openshift-client plugin 在这里非常有用,并且有关于如何与 OpenShift 交互的文档。
从管道构建容器镜像
如果您的目标是从管道构建容器映像,请记住 OpenShift 还通过 Builds 公开此功能(取决于安全配置)。就像在上一节中一样,您可以使用 openshift-client plugin 创建和触发构建。
有关由 OpenShift 维护的 Jenkins 映像的更多信息(以及通常如何在 OpenShift 上的 Jenkins 中做有用的事情),this dedicated page in the OpenShift docs。
我目前正在处理以下场景
我正在尝试在 OpenShift 中设置一个容器,该容器 运行 是一个 Jenkins,它本身能够 运行 docker 利用构建为 [=58] 的声明性管道=]在它自己的 docker 容器中。这基本上使得有必要在这个容器内安装 运行 docker。
我已经研究了很长时间了。在线检查了数十个帖子和主题,但我无法完成。基本上我到目前为止
- 我可以在我的容器中安装 docker(来自基础镜像 openshift/jenkins-2-centos7:最新)
- 我无法将 docker 转换为 运行,因为这使用了 的 systemctl
现在我读到 systemctl 无法在 docker 容器内工作,或者至少非常不推荐,因为它会干扰系统中的 PID 1。没有
systemctl start docker
这会让我 docker beeing unable to connect with the daemon (as expected) 和错误消息
Can't connect to docker daemon. Is 'docker -d' running on this host?
所以我尝试使用
自己设置守护进程我的 Dockerfile 中的以下内容
RUN usermod -aG docker $(whoami)
RUN dockerd -H unix:///var/run/docker.sock
告诉我无法挂载 cgroup 也不起作用。经过更多研究后,我发现这可以通过
中的 cgroupfs-mount 脚本来处理https://github.com/tianon/cgroupfs-mount/tree/master
但在这里我也没有运气,留下了以下错误
Error starting daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.4.21: can't initialize iptables table `nat': Permission denied (you must be root) Perhaps iptables or your kernel needs to be upgraded.
下班后我就没主意了。有谁知道如何让 docker 在 OpenShift 中工作?真的很棒
你有 this article by @jpetazzo, from Docker team, about Docker In Docker (DinD):
文章:
The primary purpose of Docker-in-Docker was to help with the development of Docker itself. Many people use it to run CI (e.g. with Jenkins), which seems fine at first, but they run into many “interesting” problems that can be avoided by bind-mounting the Docker socket into your Jenkins container instead.
DinD 回购:
This work is now obsolete, thanks to the combined efforts of some amazing people like @jfrazelle and @tianon, who also are black belts in the art of putting IKEA furniture together.
If you want to run Docker-in-Docker today, all you need to do is:
docker run --privileged -d docker:dind
所以 here 是一篇使用另一种方法在 docker 容器中使用 Jenkins 构建 docker 容器的文章:
docker run -p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkins/jenkins:lts
因此,您可能希望根据您的 OpenShift 场景调整其中一种解决方案。希望能解决您的问题。
你需要一个特权 pod 运行 jenkins 来安装 openshift 节点 docker 套接字。这是一个坏主意,因为 jenkins 将在 kubernetes 语义和控制之外启动容器。
为什么不使用 openshift 附带的 s2i service?
此致。
I am trying to setup a container in OpenShift that runs a Jenkins that is itsself able to run docker to make use of declarative pipelines where the build is running in it's own docker container. This basically makes it necessary to install and run docker inside this container.
我不认为你在这里的结论是唯一的可能性,我将在下面描述的是一种更容易获得(我认为)你想要的东西的方法! :) 如果除了我将描述的这 3 个之外还有任何其他用例,请告诉我,我会尝试更新以涵盖它们:
- 管道运行在自己的容器中
- 运行 来自管道的额外容器
- 从管道构建容器镜像
管道运行在自己的容器中
对于这种情况,有出色的 Kubernetes plugin。
使用此插件,您可以将 Kubernetes/OpenShift 云添加到 Jenkins 全局配置中。这可以是 Jenkins 所在的集群 运行ning(如果您使用 OpenShift 提供的 Jenkins 映像,默认情况下至少会添加),也可以是外部集群。
在该配置中,您可以定义 PodTemplates(同样,OpenShift 提供的 Jenkins 图像中提供了几个示例),或者我认为您也可以直接在管道中指定它。当您的管道请求 node/agent 标签与其中一个匹配时(并且没有匹配的 long-运行ning 代理),然后将从该模板创建一个 pod,并且您的管道执行将发生在容器内。一旦不再需要,它将再次取消配置。
以下是此插件公开的管道步骤:https://jenkins.io/doc/pipeline/steps/kubernetes/
运行 来自管道的额外容器
作为管道的一部分,您可能需要 运行 一些测试,并且这些测试可能希望能够与例如一个数据库。您可以在您的 OpenShift 项目中为此创建资源(例如,部署并使用服务公开它),然后将其拆除。 openshift-client plugin 在这里非常有用,并且有关于如何与 OpenShift 交互的文档。
从管道构建容器镜像
如果您的目标是从管道构建容器映像,请记住 OpenShift 还通过 Builds 公开此功能(取决于安全配置)。就像在上一节中一样,您可以使用 openshift-client plugin 创建和触发构建。
有关由 OpenShift 维护的 Jenkins 映像的更多信息(以及通常如何在 OpenShift 上的 Jenkins 中做有用的事情),this dedicated page in the OpenShift docs。