无法从主机访问docker容器内的服务器

I am hosting a mysql server and a go http server in docker. I am unable to hit the http server from my host machine. My host machine is a mac.

I have tried using localhost:8080 and ipofserver:8080. I get the ip from the docker inspect. I am able to connect to my mysql server from my host, but i can't hit the server from the host.

Here is my docker ps output.

0.0.0.0:8080->8080/tcp
0.0.0.0:3306->3306/tcp, 33060/tcp

Below are my details:

Docker Desktop version 2.0.0.3.

docker-compose

version: '3.1'

services:

    mysql:
        image: mysql:latest
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: mydb
        volumes:
            - mysql:/var/lib/mysql
        ports:
            - "3306:3306"
        networks:
            - mynetwork

    server:
        image: server:latest
        networks:
             - mynetwork
        ports:
             - "8080:8080"

volumes:
    mysql: ~

networks:
    mynetwork:
        driver: "bridge"

mysql dockerfile

FROM mysql:8.0.16

COPY ./scripts/mysql/dbgen-v1.sql /docker-entrypoint-initdb.d/

EXPOSE 3306

server dockerfile

FROM golang:1.12.5

WORKDIR a/go/path
COPY . .

ENV GOBIN=/usr/local/bin

RUN go get github.com/go-sql-driver/mysql
RUN go get github.com/iancoleman/strcase
RUN go get github.com/jmoiron/sqlx
RUN go get github.com/spf13/cobra
RUN go get github.com/gorilla/websocket
RUN go get github.com/spf13/viper

RUN go install -v cmd/project/main.go

EXPOSE 8080

CMD ["main"]
dpno17028
dpno17028 很好,谢谢
一年多之前 回复
douxianliu6756
douxianliu6756 Mysql不会在Web服务器容器内绑定到127.0.0.1。您应该能够使用http://mysql:3306,因为DockerDNS会将mysql解析为mysql容器的正确IP地址。
一年多之前 回复
dongshushen4392
dongshushen4392 关于为什么我的服务器无法连接到mysql服务器的任何想法?尝试连接时收到此消息:127.0.0.1:3306:connect:连接被拒绝
一年多之前 回复
douquan1953
douquan1953 我确实重新创建了容器。解决该问题的原因是将服务器地址更改为0.0.0.0。非常感谢!添加这个作为答案,我会接受的。
一年多之前 回复
dosrmo0442
dosrmo0442 您是重新创建容器还是只是重新启动它们?为了应用新的网络设置,您需要再次进行docker-compose。
一年多之前 回复
duandu9260
duandu9260 我尝试了(1),但没有成功。对于(1),数字(2)仍在工作。
一年多之前 回复
doujia4619
doujia4619 至于(2),服务器还需要绑定到0.0.0.0而不是127.0.0.1,否则它将不会绑定到网桥接口,因此无论网络设置如何,在容器外部都不可见是。
一年多之前 回复
duanlei7101
duanlei7101 做你的(2)选项工作。现在将尝试1。
一年多之前 回复
duan6161
duan6161 我有两个疯狂的猜测:1)您使用自定义网桥网络,并且端口发布仅适用于默认网络-您可以尝试删除自定义网络配置,并从中“取消绑定”容器(然后默认网桥网络将启动在)。我现在无法对此进行测试,但我认为docs.docker.com/v17.09/engine/userguide/networking/...表明可能是这种情况。2)Web服务器没有响应-您可以通过检查其是否在容器内响应来进行验证(例如通过运行类似docker-composeexecservercurlhttp://127.0.0.18080
一年多之前 回复

1个回答



(此答案基于我们在评论)</ em> </ p>

为了公开网络 从容器内部到主机的服务器,它需要绑定到0.0.0.0而不是127.0.0.1。 使用0.0.0.0可确保Web服务器绑定到可从主机端访问的网桥接口。</ p>

相关Docker文档:”> https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/ < / a> </ p>
</ div>

展开原文

原文

(This answer is based on the chat we had in the comments)

In order to expose the web server from inside the container to the host it needs to bind to 0.0.0.0 and not to 127.0.0.1. Using 0.0.0.0 ensures that the web server binds to the bridge interface that can be accessed from the host side.

Relevant Docker docs: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐