连接到本地 docker-compose 容器 Windows 10
Connecting to local docker-compose container Windows 10
非常类似于 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_django
或 docker logs my_app_nginx
检查日志时没有错误。此外,执行 docker ps
会显示所有容器 运行ning。
这个问题的奇怪之处在于,在 Linux 上,所有 运行 都没有问题,我可以在本地主机的 80 端口找到我的应用程序。我唯一做的不同的事情是on Windows 是我 运行 我的 .sh 文件上的 dos2unix
以确保它们 运行 正确。如果我省略这一步,那么我会得到很多错误,这让我相信我必须这样做。
如果有人可以 guidance/advice 说明我可能做错了什么或完全遗漏了什么,我将不胜感激。我也很乐意提供更多详细信息,请告诉我。谢谢!
编辑#1:正如帖木儿所建议的,我做了一个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 that is backed by VirtualBox rather than default Hyper-V
Docker for Windows. In this case you might think of it as a VBox VM that actually runs Docker - so all volume mounts and port mappings apply to docker machine VM, not your host. And management tools (i.e. Docker terminal and docker-compose
) actually run on your host OS through MinGW。
因此,默认情况下您不会在 localhost
上获得绑定端口(但您可以通过 in VirtualBox manually if you so desire - I just googled the second link for some picture tutorials). Suprisingly, the official documentation on this particular topic is pretty scarce - you can get a hint by looking at their examples 实现。
所以在你的情况下,正确的 url 应该是 http://192.168.99.100
这两种解决方案的另一个不同之处在于卷挂载。再一次,documentation sorta hints at what it should be but I can't point you a more explicit source. As you have probably noticed the terminal you use for all your docker interactions encodes paths a bit differently (I presume because of that MinGW layer) 和转换后的路径被发送到 docker-machine - 因为它是 Linux 并且无论如何都不会处理 windows-style 路径。
从这里我看到了一些供您探索的途径:
运行 您的项目来自 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 来做其他事情,您可能无法使用此选项。
非常类似于 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_django
或 docker logs my_app_nginx
检查日志时没有错误。此外,执行 docker ps
会显示所有容器 运行ning。
这个问题的奇怪之处在于,在 Linux 上,所有 运行 都没有问题,我可以在本地主机的 80 端口找到我的应用程序。我唯一做的不同的事情是on Windows 是我 运行 我的 .sh 文件上的 dos2unix
以确保它们 运行 正确。如果我省略这一步,那么我会得到很多错误,这让我相信我必须这样做。
如果有人可以 guidance/advice 说明我可能做错了什么或完全遗漏了什么,我将不胜感激。我也很乐意提供更多详细信息,请告诉我。谢谢!
编辑#1:正如帖木儿所建议的,我做了一个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 that is backed by VirtualBox rather than default Hyper-V
Docker for Windows. In this case you might think of it as a VBox VM that actually runs Docker - so all volume mounts and port mappings apply to docker machine VM, not your host. And management tools (i.e. Docker terminal and docker-compose
) actually run on your host OS through MinGW。
因此,默认情况下您不会在 localhost
上获得绑定端口(但您可以通过
所以在你的情况下,正确的 url 应该是 http://192.168.99.100
这两种解决方案的另一个不同之处在于卷挂载。再一次,documentation sorta hints at what it should be but I can't point you a more explicit source. As you have probably noticed the terminal you use for all your docker interactions encodes paths a bit differently (I presume because of that MinGW layer) 和转换后的路径被发送到 docker-machine - 因为它是 Linux 并且无论如何都不会处理 windows-style 路径。
从这里我看到了一些供您探索的途径:
运行 您的项目来自 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 来做其他事情,您可能无法使用此选项。