使用“时无法连接到Jenkins管道中的docker容器”;Docker外面的Docker”字样;设置

使用“时无法连接到Jenkins管道中的docker容器”;Docker外面的Docker”字样;设置,docker,jenkins,docker-compose,cypress,docker-in-docker,Docker,Jenkins,Docker Compose,Cypress,Docker In Docker,我正在基于这样的代理运行Jenkins作业: pipeline { agent { docker { image 'cypress/base:10' args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose -u roo

我正在基于这样的代理运行Jenkins作业:

pipeline {
  agent {
    docker {
      image 'cypress/base:10'
        args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose -u root'
    }
  }
…
注意:
docker
docker compose
安装到我的代理容器中,以便能够在管道阶段内运行docker容器(“docker外部docker”设置)

接下来,我将启动由两个容器组成的
docker compose
安装程序-服务器和webapp

…
sh 'docker-compose up --build --detach'
…
在那之后,我想向
localhost:8080
发送一个GET请求,这是web应用程序应该从中提供服务的地方。但我明白了

Error: connect ECONNREFUSED localhost:8080
相同的docker compose设置在我的开发机器上工作。端口转发设置正确(8080:8080端口转发在
docker compose
配置文件中启用)


我认为这在某种程度上与我在Jenkins中所做的“Docker out of Docker”设置有关在Jenkins Docker out Docker设置中,从技术上讲,Jenkins也是另一个与其他容器“共享”相同空间的容器。也就是说,它可以与它“创建”的容器通信

在我的例子中,我所做的是在docker-compose.yml文件上创建一个自定义网桥网络

version: "3.8"

services:
  app:
    build:
      context: .
    ports:
      - 8081:8080
    depends_on:
      - redisdb
    networks:
      - frontend
      - backend

  redisdb:
    image: redis
    ports:
      - 127.0.0.1:6380:6379
    networks:
      - backend

networks:
  frontend: {}
  backend: {}
创建后,docker compose将使用以下格式创建这些网络:

  • {文件夹\名称}\前端(示例:管道\前端)
  • {FOLDER_NAME}\u后端
这些网络通常是桥接网络

My Jenkins容器最初位于默认网络“网桥”中。由于我的jenkins位于网桥网络中,而这些容器位于网桥类型的网络中,因此我可以稍后在管道中通过运行时连接我的jenkins

docker network connect pipeline_frontend jenkins
现在从jenkins开始,我可以通过容器的服务名称直接与容器通信。 以我为例,从我的詹金斯,我可以卷曲到http://app:8080


注意:此答案仅适用于Jenkins容器与它创建的容器独占驻留在主机中的情况。我没有在Jenkins有外部节点的设置上测试过这一点。

在Jenkins docker out docker设置中,从技术上讲,Jenkins也是另一个与其他容器“共享”相同空间的容器。也就是说,它可以与它“创建”的容器通信

在我的例子中,我所做的是在docker-compose.yml文件上创建一个自定义网桥网络

version: "3.8"

services:
  app:
    build:
      context: .
    ports:
      - 8081:8080
    depends_on:
      - redisdb
    networks:
      - frontend
      - backend

  redisdb:
    image: redis
    ports:
      - 127.0.0.1:6380:6379
    networks:
      - backend

networks:
  frontend: {}
  backend: {}
创建后,docker compose将使用以下格式创建这些网络:

  • {文件夹\名称}\前端(示例:管道\前端)
  • {FOLDER_NAME}\u后端
这些网络通常是桥接网络

My Jenkins容器最初位于默认网络“网桥”中。由于我的jenkins位于网桥网络中,而这些容器位于网桥类型的网络中,因此我可以稍后在管道中通过运行时连接我的jenkins

docker network connect pipeline_frontend jenkins
现在从jenkins开始,我可以通过容器的服务名称直接与容器通信。 以我为例,从我的詹金斯,我可以卷曲到http://app:8080


注意:此答案仅适用于Jenkins容器与它创建的容器独占驻留在主机中的情况。我还没有在Jenkins有外部节点的设置上测试过这一点。

运行lsof-I:8080并检查是否有其他进程正在使用该端口运行lsof-I:8080并检查是否有其他进程正在使用该端口