localhost:无法从docker容器访问3330

localhost:无法从docker容器访问3330,docker,Docker,我的问题如下 由于以下Dockerfile,我创建了一个jenkins容器 # intall jenkins FROM jenkins/jenkins:lts # install python3.8.2 & dependancies USER root RUN apt-get update && apt-get -y install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev

我的问题如下

由于以下Dockerfile,我创建了一个jenkins容器

# intall jenkins
FROM jenkins/jenkins:lts

# install python3.8.2 & dependancies
USER root
RUN apt-get update && apt-get -y install build-essential zlib1g-dev libncurses5-dev libgdbm-dev    libnss3-dev libssl-dev libsqlite3-dev libreadline-dev libffi-dev curl libbz2-dev
RUN curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
RUN tar -xf Python-3.8.2.tar.xz
RUN cd Python-3.8.2 && pwd && ./configure && make -j 2 && make altinstall && python3.8 --version
RUN python3.8 -m pip install sklearn protobuf requests

# install docker
RUN curl -sSL https://get.docker.com/ | sh
My jenkins在本地主机8080上运行没有问题

在这本书中,我创建了一个docker管道

pipeline{
    agent any
    stages{
            /*stage('retrieve docker images'){
                    steps{
                            sh 'docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD'
                            sh 'docker pull $model_name'
                    }
            }*/
            stage('create container model'){
                    steps{
                            sh 'docker run -d --name fugazi -t -p 3330:3330 $model_name'
                            sh 'sleep 5'
                    }
            }
            stage('use the model'){
                    steps{
                            sh 'python3.8 LaunchTestModel.py'
                    }
            }
            stage('remove docker stuff'){
                    steps{
                            sh 'docker stop fugazi'
                            sh 'docker rm fugazi'
                            sh 'docker rmi $model_name'
                    }
            }
    }
}
第一和第二阶段工作得很好,它们创建了一个可在localhost:3330上访问的docker容器。然后在第三阶段中,由于LaunchTestModel.py,我尝试在localhost:3330上与这个容器通信。但在这一点上,我收到了一个connexion拒绝错误

requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=3330): Max retries exceeded with url: /model/methods/classify (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f492e79db80>: Failed to establish a new connection: [Errno 111] Connection refused'))
requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=3330):url:/model/methods/classify超过了最大重试次数(由NewConnectionError引起(':未能建立新连接:[Errno 111]连接被拒绝])
如果我在jenkins之外使用LaunchTestModel.py,它工作得很好,它会将数据发送到localhost:3330并收到一个答案


似乎无法从jenkins容器内部访问localhost:3330。。。所以问题是如何从jenkins容器中访问localhost:3330?我不是docker专家,在写这篇文章之前我搜索了一段时间,我认为这是容器之间的网络问题,我尝试了很多事情,但都没有成功。谢谢你的帮助

我解决了我的问题。该错误来自尝试在以下地址发送数据的python脚本:http://localhost:3330. 由于此python脚本在Jenkins容器内运行,localhost引用Jenkins容器的localhost,该容器上没有任何内容。jenkins管道脚本创建的容器在主机的localhost上运行,而不是在jenkins容器的localhost上运行,因此我修改了这个URL,它可以正常工作

这个地址172.17.0.1是Jenkins容器网关,我通过以下命令检索到它:docker inspect“Jenkins容器”。网关Ip地址位于“网络设置”部分


感谢cody604和David Maze花时间来帮助我。

如果您在Linux上工作,请尝试在docker run命令中使用--network=“host”,然后docker容器中的127.0.0.1将指向您的docker主机。谢谢cody。我已经试过了--network=“host”,但当你这么做时,pulished端口不可用,因此我不知道jenkins在哪个端口上运行。这里是我在尝试您建议的方法时收到的警告:警告:在Docker中使用主机网络模式
localhost
时,已发布的端口将被丢弃,几乎总是表示“此容器”。安排两个容器在同一Docker网络上运行(Jenkins中有点棘手),或者使用中的一种技术。中描述的标准Jenkins集成也可能比
docker run
命令更容易设置。