连接到本地 docker-compose 容器 Windows 10

Posted

技术标签:

【中文标题】连接到本地 docker-compose 容器 Windows 10【英文标题】:Connecting to local docker-compose container Windows 10 【发布时间】:2020-11-17 07:01:11 【问题描述】:

与this 问题非常相似,我无法从 Windows 10 上的浏览​​器 (Firefox) 连接到本地 docker-compose 容器,并且已经排查了一段时间,但我似乎找不到问题。

这是我的 docker-compose.yml:

version: "3"
services:
    frontend:
        container_name: frontend
        build: ./frontend
        ports:
          - "3000:3000"
        working_dir: /home/node/app/
        environment:
            DEVELOPMENT: "yes"
        stdin_open: true
        volumes:
          - ./frontend:/home/node/app/
        command: bash -c "npm start & npm run build"
    my_app_django:
        container_name: my_app_django
        build: ./backend/
        environment:
        SECRET_KEY: "... not included ..."
        command: ["./rundjango.sh"]
        volumes:
            - ./backend:/code
            - media_volume:/code/media
            - static_volume:/code/static
        expose:
            - "443"
    my_app_nginx:
        container_name: my_app_nginx
        image: nginx:1.17.2-alpine
        volumes:
          - ./nginx/nginx.dev.conf:/etc/nginx/conf.d/default.conf
          - static_volume:/home/app/web/staticfiles
          - media_volume:/home/app/web/mediafiles
          - ./frontend:/home/app/frontend/
        ports:
            - "80:80"
        depends_on:
          - my_app_django
volumes:
    static_volume: 
    media_volume:

我可以用docker-compose -f docker-compose.yml up -d 启动容器,当我用docker logs my_app_djangodocker logs my_app_nginx 检查日志时没有错误。此外,执行docker ps 会显示所有容器正常运行。

关于这个问题的奇怪之处在于,在 Linux 上,一切运行都没有问题,我可以在 localhost 的 80 端口找到我的应用程序。当我在 Windows 上时,唯一不同的是我在 on 上运行 dos2unix我的 .sh 文件,以确保它们正常运行。如果我省略这一步,那么我会得到很多错误,这让我相信我必须这样做。

如果有人可以就我可能做错了什么或完全遗漏什么提供指导/建议,我将不胜感激。我也很乐意提供更多细节,请告诉我。谢谢!

编辑 #1:正如 timur 所建议的,我做了一个docker run -p 80:80 -d nginx,这是输出:

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
bf5952930446: Pull complete
ba755a256dfe: Pull complete
c57dd87d0b93: Pull complete
d7fbf29df889: Pull complete
1f1070938ccd: Pull complete
Digest: sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287c0b2
Status: Downloaded newer image for nginx:latest
19b56a66955145e4f59eefff57340b4affe5f7e0d82ad013742a60b479687c40
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: driver failed programming external connectivity on endpoint naughty_hoover (8c7b2fa4aef964899c366e1897e38727bb7e4c38431875c5cb8456567005f368): Bind for 0.0.0.0:80 failed: port is already allocated.

这可能是错误的原因,但我不太明白此时需要做什么。

编辑 #2:根据要求,这是我的 Dockerfile(一个用于后端,一个用于前端)

后端 Dockerfile:

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN apt-get update && apt-get install -y  imagemagick libxmlsec1-dev pkg-config
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code

前端 Dockerfile:

FROM node
WORKDIR /home/node/app/
COPY . /home/node/app/
RUN npm install -g react-scripts
RUN npm install

编辑 #3:当我执行 docker ps 时,这就是我得到的:

CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
0da02ad8d746        nginx:1.17.2-alpine        "nginx -g 'daemon of…"   About an hour ago   Up About an hour    0.0.0.0:80->80/tcp       my_app_nginx
070291de8362        my_app_frontend            "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:3000->3000/tcp   frontend
2fcf551ce3fa        my_app_django              "./rundjango.sh"         12 days ago         Up About an hour    443/tcp                  my_app_django

【问题讨论】:

您是否正在使用 Docker Toolbox(由 VirtualBox 支持的堆栈)? 是的!我通过 Docker Toolbox 完成所有这些工作,并在 Docker 快速入门终端中运行所有内容 那么您可能需要docker-machine ip default(可能会显示192.168.99.100)并使用该IP而不是localhost 您确定所有容器都在运行吗?命令"npm start & npm run build" 将不起作用你错过了一个& 请同时添加 Dockerfiles 【参考方案1】:

正如我们建立的那样,您使用由 VirtualBox 支持的 Docker Toolbox 而不是 默认 Hyper-V Docker for Windows。在这种情况下,您可能会将其视为实际运行 Docker 的 VBox VM - 因此所有卷挂载和端口映射都适用于 docker machine VM,而不是您的主机。并且管理工具(即 Docker 终端和docker-compose)实际上通过MinGW 在您的主机操作系统上运行。


因此,默认情况下,您不会在 localhost 上获得绑定端口(但如果您愿意,您可以通过 editing VM properties 在 VirtualBox manually 中实现这一点 - 我刚刚搜索了一些图片教程的第二个链接) .令人惊讶的是,关于这个特定主题的官方文档非常稀缺——不过你可以通过looking at their examples 获得提示。

所以在你的情况下,正确的 url 应该是 http://192.168.99.100


这两种解决方案的另一个不同之处是卷安装。再一次,documentation sorta hints 应该是什么,但我不能为你指出一个更明确的来源。正如您可能已经注意到,您用于所有 docker 交互的终端对路径的编码略有不同(我认为是因为 MinGW layer)并且转换后的路径被发送到 docker-machine - 因为它是 Linux 并且不会处理 windows 风格无论如何都是路径。

从这里我看到了一些可供您探索的途径:

C:\Users\...\MyProject 运行您的项目

作为documentation states,您默认将c:\Users 挂载到/c/Users。所以理论上,如果您从用户主文件夹运行 docker-compose - 路径应该会自动对齐 - 但由于您遇到此问题 - 您可能是从其他地方运行它。

创建另一个共享

您也可以create your own mounting mount in Virtual Box。在终端中运行 pwd 并注意项目根目录的位置。然后使用 Virtual Vox UI 并创建一个路径,使其与您的目录树对齐(例如,D:\MyProject\ 应变为 /d/MyProject

希望这也不需要您更改docker-compose.yml

或者,切换到 Hyper-V Docker 桌面 - 这些特殊问题就会消失。

请记住,Hyper-V 不会与 VirtualBox 共存。因此,如果您需要 VBox 来做其他事情,则此选项可能不可用。

【讨论】:

嘿!这么晚才回复很抱歉。我一直在努力使某些东西发挥作用;我对此进行了大量阅读,您的想法出现在我的搜索中。不管出于何种原因,我似乎无法让它在 Docker Toolbox 上运行,所以我将获得 Windows 10 Pro,这样我就可以使用 Hyper-V Desktop。感谢您的帮助!

以上是关于连接到本地 docker-compose 容器 Windows 10的主要内容,如果未能解决你的问题,请参考以下文章

Springboot 应用程序无法使用 docker-compose 连接到 MongoDB 容器

Nest.js TypeORM 连接到本地数据库(在 docker 容器上)

使用 docker-compose 连接到 RabbitMQ 容器

从不同的docker-compose从一个容器连接到另一个容器[重复]

docker-compose 有两个容器:web 无法连接到 db

Springboot 容器使用 docker-compose 连接到 mongo 容器的 503 错误代码