gpt4 book ai didi

docker - 从Jenkins容器中调用Docker堆栈部署在Docker主机上

转载 作者:行者123 更新时间:2023-12-02 12:18:55 25 4
gpt4 key购买 nike

在OS X主机上,我使用启用了Kubernetes的Docker CE(18.06.1-ce-mac73(26764)),并使用Kubernetes编排。在此主机上,我可以运行堆栈部署,以使用以下简单的docker-compose文件(kube-compose.yml)将容器部署到Kubernetes:

version: '3.3'
services:
web:
image: dockerdemos/lab-web
volumes:
- "./web/static:/static"
ports:
- "9999:80"

并且此命令行从包含撰写文件的目录运行:
docker stack deploy --compose-file ./kube-compose.yml simple_test

但是,当我尝试从Jenkins容器运行相同的命令时,Jenkins返回:

this node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again



我不希望对Jenkins容器中的Docker客户端进行初始化,因为我没有在主机上使用Docker swarm。

Jenkins容器在docker-compose中定义,以包括到docker主机套接字端点的卷挂载:
version: '3.3'
services:
jenkins:
# contains embedded docker client & blueocean plugin
image: jenkinsci/blueocean:latest
user: root
ports:
- "8080:8080"
- "50000:50000"
volumes:
- ./jenkins_home:/var/jenkins_home
# run Docker from the host system when the container calls it.
- /var/run/docker.sock:/var/run/docker.sock
# root of simple project
- .:/home/project
container_name: jenkins

我还按照本指南使用socat: https://github.com/docker/for-mac/issues/770和此处: Docker-compose: deploying service in multiple hosts将请求代理到Docker主机。

最后,我使用以下Jenkins定义(Jenkinsfile)调用堆栈以部署在主机上。 Jenkins已安装Jenkins docker 插件:
node {
checkout scm

stage ('Deploy To Kube') {
docker.withServer('tcp://docker.for.mac.localhost:1234') {
sh 'docker stack deploy app --compose-file /home/project/kube-compose.yml'
}
}
}

我也尝试过将withServer签名更改为:
docker.withServer('unix:///var/run/docker.sock')

和我得到相同的错误响应。但是,我能够从Jenkins容器远程登录到Docker主机,因此我知道它是可以到达的。另外,正如我前面提到的,我知道消息说要运行swarm init,但我没有部署到swarm。

我在Jenkins容器中检查了Docker客户端的版本,它与我在主机上使用的版本相同(但是是Linux变体):

Docker version 18.06.1-ce, build d72f525745



这是我描述的代码: https://github.com/ewilansky/localstackdeploy.git

请让我知道是否有可能通过Jenkins容器执行我希望做的事情。所有这些的目的是提供管道的简单,可移植的演示,并部署到Kubernetes是最后一步。我了解这不是在本地开发环境之外的任何地方采用的方法。

最佳答案

在Jenkins Docker插件或Kubernetes Docker Stack Deploy命令可以支持我描述的远程部署方案之前,这是一种对我有效的方法。

我现在正在使用来自Jenkins容器的Kubernetes客户端kubectl。为了最大程度地减少Jenkins容器的大小,我只向Kubernetes客户端添加了基于Alpine Linux构建的jenkinsci / blueocean镜像。该DockerFile显示了附加内容:

FROM jenkinsci/blueocean
USER root
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.12.0/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl
RUN mkdir /root/.kube
COPY kube-config /root/.kube/config

我采用了这种方法,该方法将图像大小增加了约100 mb,而不是使用Alpine Linux Kubernetes软件包,该软件包在我的测试中几乎使图像大小增加了一倍。当然,Kubernetes软件包具有所有Kubernetes组件,但是我所需要的只是Kubernetes客户端。这类似于将Docker客户端驻留在Jenkins容器中以便在主机上运行Docker命令的要求。

请注意,在DockerFile中,有对Kuberenetes配置文件的引用:
kube-config /root/.kube/config

我从主机(运行Mac的Docker的计算机)上的Kubernetes配置文件开始。我相信,如果您在Mac的Docker中启用Kubernetes,则Kubernetes客户端配置将出现在〜/ .kube / config中。如果没有,请分别安装Kubernetes客户端工具。在您将通过DockerFile复制到Jenkins容器的Kubernetes配置文件中,只需更改服务器值,以使Jenkins容器指向Docker for Mac主机:
    server: https://docker.for.mac.localhost:6443

如果您使用的是Windows计算机,则可以使用docker.for.win.localhost。这里有一个讨论: https://github.com/docker/for-mac/issues/2705和这里描述的其他方法: https://github.com/docker/for-linux/issues/264

重组Jenkins容器之后,我便能够使用kubectl为我的应用程序创建部署和服务,该应用程序现在在Kubernetes Docker for Mac主机中运行。就我而言,这是我添加到Jenkins文件中的两个命令:
 stage ('Deploy To Kube') {
sh 'kubectl create -f /kube/deploy/app_set/sb-demo-deployment.yaml'
}
stage('Configure Kube Load Balancer') {
sh 'kubectl create -f /kube/deploy/app_set/sb-demo-service.yaml'
}

Kubernetes容器部署有很多选项。就我而言,我只需要在负载均衡器后面部署Web应用程序(带有副本)。所有这些都在kubectl调用的两个yaml文件中定义。这比docker stack部署要复杂得多,但是可以达到相同的最终结果。

关于docker - 从Jenkins容器中调用Docker堆栈部署在Docker主机上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52920540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com